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;
}