2014-11-14 140 views
0

我在OpenGL中创建了一个绘制一些形状的程序。我希望用户能够放大形状,如果他们想。这是绘制形状的代码:缩放3D形状(OpenGL和C++)

/*Initialise the required OpenGL functions*/ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glMatrixMode(GL_PROJECTION); 
glPushMatrix(); 
glLoadIdentity(); 
glOrtho(0.0, screenWidth, screenHeight, 0.0, -1.0, 10.0); 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glLoadIdentity(); 
glDisable(GL_CULL_FACE); 
glClear(GL_DEPTH_BUFFER_BIT); 

/*Draw a square*/ 
glColor3f(1, 0, 0); 
glBegin(GL_QUADS); 
glVertex2f(screenWidth * 0.75, screenHeight * 0.08333); 
glVertex2f(screenWidth * 0.75, screenHeight * 0.16666); 
glVertex2f(screenWidth * 0.86666, screenHeight * 0.16666); 
glVertex2f(screenWidth * 0.86666, screenHeight * 0.08333); 
glEnd(); 
glColor3f(0, 0, 0); 

/*Let the user zoom*/ 
if (GetAsyncKeyState(VK_UP)) 
{ 
    /*"zoom" is a global variable*/ 
    zoom += 0.005; 
} 

glScaled(1 + zoom, 1 + zoom, 1); 

/*Everything that is drawn from this point on (A sphere and a cube) should be scaled*/ 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glTranslatef(-0.3, 0, 0); 
glutSolidSphere(3, 20, 20); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glTranslatef(0.55, 0.36, 0); 
glutSolidCube(0.05); 

glMatrixMode(GL_PROJECTION); 
glPopMatrix(); 
glMatrixMode(GL_MODELVIEW); 
glPopMatrix(); 

glutSwapBuffers(); 

该代码正确绘制形状,但形状不能缩放。我在其他一些函数中使用了类似的代码,所以我相信这可能是因为我正在使用3D形状,或者它可能与我多次调用“glMatrixMode”有关。无论哪种方式,我应该如何更改我的代码,以便立方体和球体根据用户输入进行缩放,但第一个平方不受影响?

回答

2

glScaled()更改当前矩阵。所以,只要你调用glLoadIdentity(),你正在撤销你的缩放。您正在对glMatrixMode()和glLoadIdentity()进行大量不必要的调用,这些调用应该被消除。因此,请尝试更类似这样的内容:

// You probably don't really need to do these, but if you do, do it once up top. 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

glPushMatrix(); // Save the current matrix 
glScaled(1 + zoom, 1 + zoom, 1); // Scale it 

/*Everything that is drawn from this point on (A sphere and a cube) should be scaled*/ 
glTranslatef(-0.3, 0, 0); 
glutSolidSphere(3, 20, 20); 

glTranslatef(0.55, 0.36, 0); 
glutSolidCube(0.05); 

glPopMatrix(); // Undo the glScaled() call above 

glutSwapBuffers(); 
+0

这也将扩展翻译。如果你不想要,那么对每个对象执行glPushMatrix/glScaled/glutSolidXXXX()/ glPopMatrix。 – 2014-11-14 18:55:02