OpenGl3D图形移动

这篇博客详细介绍了如何使用OpenGL实现3D场景中星星的移动和闪烁效果。通过声明和定义变量,加载纹理,以及在DrawGLScene函数中应用一系列的旋转和平移操作,创造出逼真的星空动画。同时,还利用颜色变化实现了星星的闪烁效果,增强了3D视觉体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值