OpenGL,如何相互独立地旋转对象?
Posted
技术标签:
【中文标题】OpenGL,如何相互独立地旋转对象?【英文标题】:OpenGL, how to rotate objects independent of each other? 【发布时间】:2014-11-15 13:26:27 【问题描述】:到目前为止我的代码
void display ( void )
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
glLoadIdentity();
gluLookAt( camera[0][0], camera[0][1], camera[0][2],
camera[1][0], camera[1][1], camera[1][2],
camera[2][0], camera[2][1], camera[2][2] ); //Set the point looking at
glRotatef(cubeRot[0], 1.0f, 0.0f, 0.0f); //rotate on x axis
glRotatef(cubeRot[1], 0.0f, 1.0f, 0.0f); //rotate on y axis
glRotatef(cubeRot[2], 0.0f, 0.0f, 1.0f); //rotate on z axis
switch ( Rendermode ) //different render mode
case 'f':
//Draw object I want to rotate
break;
case 'v':
//Draw object I want to rotate
break;
case 'e':
//Draw object I want to rotate
break;
glLoadIdentity();
//Draw object I DO NOT want to rotate
glutSwapBuffers ( ); // Swap The Buffers To Not Be Left With A Clear Screen
但是,目前我的所有对象都同时旋转,我怎样才能旋转我注意到要旋转的对象,而让我注意到不想旋转的对象保持静止?
【问题讨论】:
【参考方案1】:使用 glPush/PopMatrix() 封装线性变换并绘制对象。这些函数保存/恢复矩阵的当前状态,因此它们不会影响其他绘图。
glPushMatrix();
glRotatef(...);
// glTranslatef(...),
//glScalef(...);
drawObject1();
glPopMatrix();
glPushMatrix();
glRotatef(...);
// glTranslatef(...),
//glScalef(...);
drawObject2();
glPopMatrix();
【讨论】:
我已经将 glPush 和 glPop 放在了我想要旋转的对象的绘图周围,但另一个对象仍在与它们一起旋转。您介意 C&P 我的代码并将它们放在正确的位置吗? 现在我在您的代码中看到 3 个对glRotatef()
的调用,它们以 cubeRot
作为参数。如果您想在单独的对象上执行它们中的每一个,请不要一次执行所有这些调用,而且绝对不要在switch/case
之前执行。将每个调用包装在它自己的 push/pop 操作以及绘制该特定对象的方法调用中。
顺便把switch
末尾的glLoadIdentity()
去掉。没必要。
3 个 glRotate 调用分别在 x、y 和 z 轴上旋转对象。我希望这些旋转对开关/机箱中的所有 3 个对象生效,但对最后绘制的对象不生效。
哦,我明白了。现在很清楚你想做什么。看看 Cagkan Toptas 的答案。【参考方案2】:
正如@karlphillip 所说,您需要将旋转放入glPush/glPop 矩阵封装中。我认为这段代码应该可以工作:
void display ( void )
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
glLoadIdentity();
gluLookAt( camera[0][0], camera[0][1], camera[0][2],
camera[1][0], camera[1][1], camera[1][2],
camera[2][0], camera[2][1], camera[2][2] ); //Set the point looking at
glPushMatrix(); //-------------------- Encapsulate Rotation ----------------
glRotatef(cubeRot[0], 1.0f, 0.0f, 0.0f); //rotate on x axis
glRotatef(cubeRot[1], 0.0f, 1.0f, 0.0f); //rotate on y axis
glRotatef(cubeRot[2], 0.0f, 0.0f, 1.0f); //rotate on z axis
switch ( Rendermode ) //different render mode
case 'f':
//Draw object I want to rotate
break;
case 'v':
//Draw object I want to rotate
break;
case 'e':
//Draw object I want to rotate
break;
glPopMatrix(); //------------------- Encapsulate Rotation Ends -------
//Draw object I DO NOT want to rotate
glutSwapBuffers ( ); // Swap The Buffers To Not Be Left With A Clear Screen
【讨论】:
谢谢,我以为我把它们放在那里了,但它没有用,所以很明显我没有以上是关于OpenGL,如何相互独立地旋转对象?的主要内容,如果未能解决你的问题,请参考以下文章