OpenGl3D图形移动

来源:互联网 发布:java程序员招聘 编辑:程序博客网 时间:2024/06/05 20:36


 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,星星的公转:
 *基本是就是修改位置信息,当到达中心点之后,重新设置到边界,这个检测碰撞自己去考量吧
 

 

原创粉丝点击