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,如何相互独立地旋转对象?的主要内容,如果未能解决你的问题,请参考以下文章

opengl 在屏幕上渲染之前旋转对象以设置其正确的面

在 OpenGL 中旋转对象

如何根据对象的本地位置/旋转在 OpenGL 中移动/旋转对象

如何仅旋转特定对象而不影响opengl中的其他对象?

OpenGL独立旋转

如何在openGL中旋转图像?