代码改变世界

OPENGL创建圆形天空盒

2010-12-01 16:06  bingcaihuang  阅读(5851)  评论(0编辑  收藏  举报

在OpenGL中模拟天空,是制作场景的必要技术。一般天空的构造可以使用天空盒或者一个球体贴上纹理来模拟。天空盒是绘制一个四方体,然后在各个面贴上贴图。这就要求6个面的贴图要有机结合,不然会出现缝隙或者不连续。这种技术可以模拟高山等。本文提供的则是天空顶技术。就是绘制一个球体然后赋予材质,可以很好的达到模拟天空的效果。使球体慢慢移动,就可以模拟云彩流动的效果。
封装成一个Sky类,可以直接调用。在使用前必须为天空指定一个纹理,可以使用自定义的函数进行天空的初始化CSky::InitSky(),最后在需要显示的地方调用显示函数CSky::ShowSky()。

代码
#ifndef _SKY_H
#define _SKY_H
#include
<gl/glut.h>
class Sky
{
public:
Sky();
//初始化天空的位置,半径和纹理
void InitSky(float skyX,float skyY,float skyZ,float skyR,unsigned int texture);
//显示天空
void ShowSky(void);
//获得天空的属性
float GetSkyX(void);
float GetSkyY(void);
float GetSkyZ(void);
float GetSkyR(void);
unsigned
int GetSkyTexture(void);
public:
float X;
float Y;
float Z;
float R;
unsigned
int T;
GLUquadricObj
*qobj;
};
#endif

 

代码
#include "sky.h"
Sky::Sky()
{
X
= 0;
Y
= 0;
Z
= 0;
R
= 100;
}
void Sky::InitSky(float skyX,float skyY,float skyZ,float skyR,unsigned int texture)
{
X
= skyX;
Y
= skyY;
Z
= skyZ;
R
= skyR;
T
= texture;
//
qobj = gluNewQuadric();
gluQuadricNormals(qobj,GLU_SMOOTH);
gluQuadricTexture(qobj,GL_TRUE);
}
void Sky::ShowSky()
{
static float r=0.0;
r
+=0.08;
glEnable(GL_TEXTURE_2D);
glPushMatrix();
//glFrontFace(GL_CCW);
glCullFace(GL_BACK);
glBindTexture(GL_TEXTURE_2D, T);
glTranslatef(X,Y,Z);
glRotatef(r,
0.0f,1.0f,0.0f); //天空慢慢旋转,模拟云流动
glRotatef(90,1,0,0);
glColor4f(
1,1,1,1);
gluSphere(qobj,R,
32,32);
glPopMatrix();
glDisable(GL_TEXTURE_2D);
}
float Sky::GetSkyR()
{
return R;
}
float Sky::GetSkyX()
{
return X;
}
float Sky::GetSkyY()
{
return Y;
}
float Sky::GetSkyZ()
{
return Z;
}