Qt 生成三维天空,大地的有关问题
Qt 生成三维天空,大地的问题
void FightertestView::DrawTerrain(void)
{
register int x,z;
glEnable(GL_TEXTURE_2D);
glBindTexture( GL_TEXTURE_2D, texture[0] );
for(z=0;z<DIMZ-1;z++)
{
for(x=0;x<DIMX-1;x++)
{
glBegin(GL_QUADS);
glTexCoord2d( 0.0, 0.0 );
glVertex3f(Terrain[x][z].x+32,Terrain[x][z].y-35,Terrain[x][z].z);
glTexCoord2d( 0.0, 1.0 );
glVertex3f(Terrain[x][z+1].x+32,Terrain[x][z+1].y-35,Terrain[x][z+1].z);
glTexCoord2d( 1.0, 1.0 );
glVertex3f(Terrain[x+1][z+1].x+32,Terrain[x+1][z+1].y-35,Terrain[x+1][z+1].z);
glTexCoord2d( 1.0, 0.0 );
glVertex3f(Terrain[x+1][z].x+32,Terrain[x+1][z].y-35,Terrain[x+1][z].z);
glEnd();
}
}
glDisable(GL_TEXTURE_2D);
}
void FightertestView::DrawSky()
{
qobj = gluNewQuadric();
gluQuadricNormals(qobj,GLU_SMOOTH);
gluQuadricTexture(qobj,GL_TRUE);
glEnable(GL_TEXTURE_2D); //绘制蓝天白云
glPushMatrix();
glBindTexture(GL_TEXTURE_2D, texture[1]);
glTranslatef(0,0,0);
glRotatef(90,1,0,0);
glColor4f(1,1,1,1);
gluSphere(qobj,1000,32,32);
glPopMatrix();
glDisable(GL_TEXTURE_2D);
}
void FightertestView::resizeGL(int width, int height)
{
if(0 == height)
height = 1;//防止一条边为0
glViewport(0, 0, (GLint)width, (GLint)height);//重置当前视口,本身不是重置窗口的,只不过是这里被Qt给封装好了
glMatrixMode(GL_PROJECTION);//选择投影矩阵
glLoadIdentity();//重置选择好的投影矩阵
gluPerspective(45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0);//建立透视投影矩阵
glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glMatrixMode(GL_MODELVIEW);//以下2句和上面出现的解释一样
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,0.8,0.1f,1000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//wglMakeCurrent(NULL,NULL);
}
void FightertestView::paintGL()
{
//glClear()函数在这里就是对initializeGL()函数中设置的颜色和缓存深度等起作用
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, texture[0]);//绑定纹理目标
DrawTerrain();
DrawSky();
glLoadIdentity();
}
为什么执行以后屏幕会一直闪?有没有哪位大神知道的?在linux系统下做的。
------解决思路----------------------
这个是OpenGL内容吧
void FightertestView::DrawTerrain(void)
{
register int x,z;
glEnable(GL_TEXTURE_2D);
glBindTexture( GL_TEXTURE_2D, texture[0] );
for(z=0;z<DIMZ-1;z++)
{
for(x=0;x<DIMX-1;x++)
{
glBegin(GL_QUADS);
glTexCoord2d( 0.0, 0.0 );
glVertex3f(Terrain[x][z].x+32,Terrain[x][z].y-35,Terrain[x][z].z);
glTexCoord2d( 0.0, 1.0 );
glVertex3f(Terrain[x][z+1].x+32,Terrain[x][z+1].y-35,Terrain[x][z+1].z);
glTexCoord2d( 1.0, 1.0 );
glVertex3f(Terrain[x+1][z+1].x+32,Terrain[x+1][z+1].y-35,Terrain[x+1][z+1].z);
glTexCoord2d( 1.0, 0.0 );
glVertex3f(Terrain[x+1][z].x+32,Terrain[x+1][z].y-35,Terrain[x+1][z].z);
glEnd();
}
}
glDisable(GL_TEXTURE_2D);
}
void FightertestView::DrawSky()
{
qobj = gluNewQuadric();
gluQuadricNormals(qobj,GLU_SMOOTH);
gluQuadricTexture(qobj,GL_TRUE);
glEnable(GL_TEXTURE_2D); //绘制蓝天白云
glPushMatrix();
glBindTexture(GL_TEXTURE_2D, texture[1]);
glTranslatef(0,0,0);
glRotatef(90,1,0,0);
glColor4f(1,1,1,1);
gluSphere(qobj,1000,32,32);
glPopMatrix();
glDisable(GL_TEXTURE_2D);
}
void FightertestView::resizeGL(int width, int height)
{
if(0 == height)
height = 1;//防止一条边为0
glViewport(0, 0, (GLint)width, (GLint)height);//重置当前视口,本身不是重置窗口的,只不过是这里被Qt给封装好了
glMatrixMode(GL_PROJECTION);//选择投影矩阵
glLoadIdentity();//重置选择好的投影矩阵
gluPerspective(45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0);//建立透视投影矩阵
glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glMatrixMode(GL_MODELVIEW);//以下2句和上面出现的解释一样
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,0.8,0.1f,1000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//wglMakeCurrent(NULL,NULL);
}
void FightertestView::paintGL()
{
//glClear()函数在这里就是对initializeGL()函数中设置的颜色和缓存深度等起作用
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, texture[0]);//绑定纹理目标
DrawTerrain();
DrawSky();
glLoadIdentity();
}
为什么执行以后屏幕会一直闪?有没有哪位大神知道的?在linux系统下做的。
------解决思路----------------------
这个是OpenGL内容吧