1,首先声明并定义这些变量。
BOOL twinkle; //
闪烁的星星
BOOL tp; //
'T' 按下了么?
const num=50; //
绘制的星星数
typedef
struct //
为星星创建一个结构
{
int r, g,
b; //
星星的颜色
GLfloat
dist; //
星星距离中心的距离
GLfloat
angle; //
当前星星所处的角度
}
stars; //
结构命名为stars
stars
star[num]; //
使用 'stars' 结构生成一个包含 'num'个元素的 'star'数组
GLfloat zoom=-15.0f; //
星星离观察者的距离
GLfloat
tilt=90.0f; //
星星的倾角
GLfloat spin; //
闪烁星星的自转
GLuint loop; //
全局 Loop 变量
GLuint texture[1]; //
存放一个纹理
2,载入一个纹理,在初始化函数里面实现,并在初始化函数里面设定一些变量的初值。
注一个:这个初始化里面,设置了颜色的随机分量。
if
(!LoadGLTextures()) //
调用纹理载入子例程
{
return
FALSE; //
如果未能载入,返回FALSE
}
glEnable(GL_TEXTURE_2D); //
启用纹理映射
glShadeModel(GL_SMOOTH); //
启用阴影平滑
glClearColor(0.0f, 0.0f, 0.0f,
0.5f); //
黑色背景
glClearDepth(1.0f); //
设置深度缓存
glHint(GL_PERSPECTIVE_CORRECTION_HINT,
GL_NICEST); // 真正精细的透视修正
glBlendFunc(GL_SRC_ALPHA,GL_ONE); //
设置混色函数取得半透明效果
glEnable(GL_BLEND); //
启用混色
for (loop=0; loop
{
star[loop].angle=0.0f; //
所有星星都从零角度开始
star[loop].dist=(float(loop)/num)*5.0f; //
计算星星离中心的距离
star[loop].r=rand()%6; //
为star[loop]设置随机红色分量
star[loop].g=rand()%6; //
为star[loop]设置随机红色分量
star[loop].b=rand()%6; //
为star[loop]设置随机红色分量
}
3,接着就是DrawGLScene函数了
for (loop=0; loop
{
glLoadIdentity(); //
绘制每颗星星之前,重置模型观察矩阵
glTranslatef(0.0f,0.0f,zoom); //
深入屏幕里面
glRotatef(tilt,1.0f,0.0f,0.0f); //
倾斜视角
glRotatef(star[loop].angle,0.0f,1.0f,0.0f); //
旋转至当前所画星星的角度
glTranslatef(star[loop].dist,0.0f,0.0f); //
沿X轴正向移动
glRotatef(-star[loop].angle,0.0f,1.0f,0.0f); //
取消当前星星的角度
glRotatef(-tilt,1.0f,0.0f,0.0f); //
取消屏幕倾斜
if
(twinkle) //
启用闪烁效果
{
//
使用byte型数值指定一个颜色
glColor4ub(star[(num-loop)-1].r,star[(num-loop)-1].g,star[(num-loop)-1].b,255);
glBegin(GL_QUADS); //
开始绘制纹理映射过的四边形
glTexCoord2f(0.0f,
0.0f); glVertex3f(-1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f,
0.0f); glVertex3f( 1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f,
1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f,
1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd(); //
四边形绘制结束
}
glRotatef(spin,0.0f,0.0f,1.0f); //
绕z轴旋转星星
// 使用byte型数值指定一个颜色
glColor4ub(star[loop].r,star[loop].g,star[loop].b,255);
glBegin(GL_QUADS); //
开始绘制纹理映射过的四边形
glTexCoord2f(0.0f,
0.0f); glVertex3f(-1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f,
0.0f); glVertex3f( 1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f,
1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f,
1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd(); //
四边形绘制结束
spin+=0.01f; //
星星的公转
star[loop].angle+=float(loop)/num; //
改变星星的自转角度
star[loop].dist-=0.01f; //
改变星星离中心的距离
if
(star[loop].dist<0.0f) //
星星到达中心了么
{
star[loop].dist+=5.0f; //
往外移5个单位
star[loop].r=rand()%6; //
赋一个新红色分量
star[loop].g=rand()%6; //
赋一个新绿色分量
star[loop].b=rand()%6; //
赋一个新蓝色分量
}
}
*3D空间移动图像的主要原理就是:事先将位置移动到绘图的位置,然后进行绘制图形,每一次移动都是
*修改位置参数,然后重新绘制图像。
*这里面主要有几点要说一下:
*1,将平面纹理事先3D效果:
* glRotatef(tilt,1.0f,0.0f,0.0f); //
倾斜视角
* glRotatef(star[loop].angle,0.0f,1.0f,0.0f); //
旋转至当前所画星星的角度
* glTranslatef(star[loop].dist,0.0f,0.0f); //
沿X轴正向移动
* glRotatef(-star[loop].angle,0.0f,1.0f,0.0f); //
取消当前星星的角度
* glRotatef(-tilt,1.0f,0.0f,0.0f); //
取消屏幕倾斜
*因为星星是一个2D纹理,所以当它正对着你的时候它是星星的形状,但是当它旋转90度之后,它就变成了线性。
*这样的话就没有了3D效果,所以我们需要星星继续以刚刚的角度对着我们,所以将刚刚转过的角度重新转回来,
*但是要注意先后顺序,后转过去的先转回来。
*2,绘制星星:
*就是使用纹理绘制一个四边形嘛,理解起来应该没有难度,旋转角度就是为了让这个四边形始终正对着屏幕。
*至于闪烁就是在绘制星星之前,用前一个星星的颜色绘制一遍,再用这个星星的颜色绘制一遍,这样颜色的
*改变以达到闪烁的效果。
*3,星星的公转:
*基本是就是修改位置信息,当到达中心点之后,重新设置到边界,这个检测碰撞自己去考量吧