本文参考 基于OpenGL的荷花开放过程模拟_刘金定 (这是百度文库的链接,读者可自己搜索)
我们在这里会实现简单的OpenGL画莲花过程,并实现简单的莲花绽放过程,对学习OpenGL和3D数学有着极大的帮助.
demo下载
一 画荷花花瓣
荷花是由一片一片的花瓣组成的,我们这里首先绘制一片花瓣,这里类似于3ds max 做出来的模型.
我们先来补习一下数学方面的知识,引自OpenGL绘制球体
球面的参数曲线可以用球坐标表示,引入参数u,v,其中v是球面点与原点的连线与z轴正向的夹角,u表示连线在xy平面的投影与x轴正向的夹角,如下图所示:
则球面参数方程可以表示为:
已知球面的参数方程以后,很容易求得给定点的法向量,分别对u和v方向求偏导数,然后对两个所得向量进行叉积即可:
for(float i=0;i<8;i++){ glBegin(GL_QUAD_STRIP); for(float j=0;j<16;j++){ glColor3f(sinf(3.1416f/2.0f-3.1416f/36.0f*j)+(sinf(3.1416f/144.0f*i)), 0.0f, cosf(3.1416f/2.0f-3.1416f/12.0f*j));//颜色 glVertex3f(sinf(PI*j)*cosf(PI*i), cosf(PI*j), sinf(PI*j)*sinf(PI*i));//顶点 glColor3f(sinf(3.1416f/2.0f-3.1416f/36.0f*j)+(sinf(3.1416f/144.0f*i)), 0.0f, cosf(3.1416f/2.0f-3.1416f/12.0f*j));//颜色 glVertex3f(sinf(PI*j)*cosf(PI*(i+1)), cosf(PI*j), sinf(PI*j)*sinf(PI*(i+1)) );//顶点 }glEnd(); }
这是表示花瓣是由8*16的小的变形的方格组成.
我们再对这个花瓣进行环绕循环.形成八瓣的花朵.接着再在里面画上一朵小花,用glScalef(0.6,0.7,0.6)来对里面花瓣进行缩小.
这里还没有开放的花朵,定义了一个OnTimer函数,点击 菜单开始 实现花朵的自动开放.
demo下载地址