【问题标题】:OpenGL, how to rotate objects independent of each other?OpenGL,如何相互独立地旋转对象?
【发布时间】: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
}

但是,目前我的所有对象都同时旋转,我怎样才能旋转我注意到要旋转的对象,而让我注意到不想旋转的对象保持静止?

【问题讨论】:

    标签: c++ opengl rotation glut


    【解决方案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
    }
    

    【讨论】:

    • 谢谢,我以为我把它们放在那里了,但它没有用,所以很明显我没有
    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    相关资源
    最近更新 更多