1,首先声明并定义这些变量。
BOOL twinkle; //闪烁的星星
BOOL tp; //'T' 按下了么?
const num=50; //绘制的星星数
typedefstruct //为星星创建一个结构
{
int r, g,b; //星星的颜色
GLfloatdist; //星星距离中心的距离
GLfloatangle; //当前星星所处的角度
}
stars; //结构命名为stars
starsstar[num]; //使用 'stars' 结构生成一个包含 'num'个元素的 'star'数组
GLfloat zoom=-15.0f; //星星离观察者的距离
GLfloattilt=90.0f; //星星的倾角
GLfloat spin; //闪烁星星的自转
GLuint loop; //全局 Loop 变量
GLuint texture[1]; //存放一个纹理
2,载入一个纹理,在初始化函数里面实现,并在初始化函数里面设定一些变量的初值。
注一个:这个初始化里面,设置了颜色的随机分量。
if(!LoadGLTextures()) //调用纹理载入子例程
{
returnFALSE; //如果未能载入,返回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,星星的公转:
*基本是就是修改位置信息,当到达中心点之后,重新设置到边界,这个检测碰撞自己去考量吧