[英]Only 1 opengl 3d cube is displaying
I am having a problem with my opengl program. 我的opengl程序有问题。 I can only get one cube to display.
我只能显示一个立方体。 I am trying to display two cubes and cannot seem to figure out why only one cube display.
我试图显示两个多维数据集,但似乎无法弄清楚为什么只显示一个多维数据集。 Can someone tell me why and what I need to do to correct it?
有人可以告诉我为什么以及我需要做些什么来纠正它吗? The cube function I must use is:
我必须使用的多维数据集函数是:
void myCube(double length)
{
double half = length/2;
// face 1
glBegin(GL_POLYGON);
glVertex3d(half, -half, half);
glVertex3d(half, half, half);
glVertex3d(-half, half, half);
glVertex3d(-half, -half, half);
glEnd();
// face 2
glPushMatrix();
glBegin(GL_POLYGON);
glVertex3d(half, -half, -half);
glVertex3d(half, half, -half);
glVertex3d(-half, half, -half);
glVertex3d(-half, -half, -half);
glEnd();
// face 3
glBegin(GL_POLYGON);
glVertex3d(half, half, half);
glVertex3d(half, -half, half);
glVertex3d(half, -half, -half);
glVertex3d(half, half, -half);
glEnd();
// face 4
glBegin(GL_POLYGON);
glVertex3d(-half, -half, half);
glVertex3d(-half, half, half);
glVertex3d(-half, half, -half);
glVertex3d(-half, -half, -half);
glEnd();
// face 5
glBegin(GL_POLYGON);
glVertex3d(half, half, half);
glVertex3d(half, half, -half);
glVertex3d(-half, half, -half);
glVertex3d(-half, half, half);
glEnd();
// face 6
glBegin(GL_POLYGON);
glVertex3d(half, -half, half);
glVertex3d(half, -half, -half);
glVertex3d(-half, -half, -half);
glVertex3d(-half, -half, half);
glEnd();
}
And here is my display function: 这是我的显示功能:
void myDisplay(void)
{
//cubeCount = (rand() % 15) + 7;
//int r = rand()%18;
//r = r - 9;
//double rd = (double)r / 2.0;
//glMatrixMode(GL_PROJECTION); // set the view volume shape
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//glTranslatef(1.0f, 4.0f, 2.0f);
//double factor = 05;
gluPerspective(60, screenWidth/screenHeight, 0.1, 100);
gluLookAt(3.0, 3.0, -3.0, 3.0, 3.0, 0.0, 0.0, 1.0, 0.0);
//for (int i = 0; i < 5; i++)
//{
glPushMatrix();
glTranslatef(4.9f, 1.2f, 1.0f);
glRotated(45.0, 0.0, 1.0, 0.0);
glColor3d(1, 1, 1); // draw white cube
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(1.0, 1.0);
myCube(0.5);
glDisable(GL_POLYGON_OFFSET_FILL);
glColor3d(0, 0, 0); // draw black lines
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
myCube(0.5);
glPopMatrix();
//glFlush();
glPushMatrix();
glTranslatef(2.0f, 4.0f, 2.0f);
glScalef(1.0, 2.0, 1.0);
//glRotated(45.0, 0.0, 1.0, 0.0);
glColor3d(1, 1, 1); // draw white cube
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(1.0, 1.0);
myCube(0.5);
glDisable(GL_POLYGON_OFFSET_FILL);
glColor3d(0, 0, 0); // draw black lines
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
myCube(0.5);
glPopMatrix();
//}
}
//glutSwapBuffers();
glFlush();
}
I am getting one cube in the lower left corner of my display but the other cube doesn't show any where. 我在显示屏的左下角有一个多维数据集,但另一个多维数据集却什么也没有显示。 I will upload more code if needed.
如果需要,我将上传更多代码。
Right now you're blowing through your modelview matrix stack with repeated un-matched glPushMatrix()
es. 现在,您正在遍历ModelView矩阵堆栈,其中包含重复的不匹配的
glPushMatrix()
es。
Take that glPushMatrix()
call out of myCube()
: 从
myCube()
取出glPushMatrix()
调用:
...
glVertex3d(-half, -half, half);
glEnd();
// face 2
glPushMatrix();
^^^^^^^^^^^^^^ What's this guy doing here?
Why doesn't it have a matching glPopMatrix()?
glBegin(GL_POLYGON);
glVertex3d(half, -half, -half);
.....
Full code: 完整代码:
#include <GL/glut.h>
void myCube(double length)
{
double half = length/2;
// face 1
glBegin(GL_POLYGON);
glVertex3d(half, -half, half);
glVertex3d(half, half, half);
glVertex3d(-half, half, half);
glVertex3d(-half, -half, half);
glEnd();
// face 2
glBegin(GL_POLYGON);
glVertex3d(half, -half, -half);
glVertex3d(half, half, -half);
glVertex3d(-half, half, -half);
glVertex3d(-half, -half, -half);
glEnd();
// face 3
glBegin(GL_POLYGON);
glVertex3d(half, half, half);
glVertex3d(half, -half, half);
glVertex3d(half, -half, -half);
glVertex3d(half, half, -half);
glEnd();
// face 4
glBegin(GL_POLYGON);
glVertex3d(-half, -half, half);
glVertex3d(-half, half, half);
glVertex3d(-half, half, -half);
glVertex3d(-half, -half, -half);
glEnd();
// face 5
glBegin(GL_POLYGON);
glVertex3d(half, half, half);
glVertex3d(half, half, -half);
glVertex3d(-half, half, -half);
glVertex3d(-half, half, half);
glEnd();
// face 6
glBegin(GL_POLYGON);
glVertex3d(half, -half, half);
glVertex3d(half, -half, -half);
glVertex3d(-half, -half, -half);
glVertex3d(-half, -half, half);
glEnd();
}
void display()
{
glClearColor( 0.3, 0.3, 0.3, 1 );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
double w = glutGet( GLUT_WINDOW_WIDTH );
double h = glutGet( GLUT_WINDOW_HEIGHT );
gluPerspective( 60, w / h, 0.1, 100 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
gluLookAt(3.0, 3.0, -3.0, 3.0, 3.0, 0.0, 0.0, 1.0, 0.0);
glPushMatrix();
{
glTranslatef(4.9f, 1.2f, 1.0f);
glRotated(45.0, 0.0, 1.0, 0.0);
glColor3d(1, 1, 1);
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
glEnable( GL_POLYGON_OFFSET_FILL );
glPolygonOffset( 1.0, 1.0 );
myCube( 0.5 );
glDisable( GL_POLYGON_OFFSET_FILL );
glColor3d(0, 0, 0);
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
myCube( 0.5 );
}
glPopMatrix();
glPushMatrix();
{
glTranslatef(2.0f, 4.0f, 2.0f);
glScalef(1.0, 2.0, 1.0);
glColor3d(1, 1, 1);
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
glEnable( GL_POLYGON_OFFSET_FILL );
glPolygonOffset( 1.0, 1.0 );
myCube( 0.5 );
glDisable( GL_POLYGON_OFFSET_FILL );
glColor3d(0, 0, 0);
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
myCube( 0.5 );
}
glPopMatrix();
glutSwapBuffers();
}
int main( int argc, char **argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE );
glutInitWindowSize( 640, 480 );
glutCreateWindow( "GLUT" );
glutDisplayFunc( display );
glutMainLoop();
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.