OpenGL - 旋转 180 度后对象反转

Posted

技术标签:

【中文标题】OpenGL - 旋转 180 度后对象反转【英文标题】:OpenGl - Object inverts after 180 degrees of rotation 【发布时间】:2013-03-28 19:22:45 【问题描述】:

我渲染了一个对象,我正在尝试用鼠标旋转该对象。对象将正常旋转 180 度,但在那之后,对象会反转(如果面向相机,则切换为背对相机),就像鼠标的预期移动一样,即如果向右拖动鼠标会顺时针旋转对象,然后它现在将逆时针旋转。一旦达到下一个 180 度,它就会再次反转并恢复正常。我确定一定有一些我没有看到的简单的东西?

这是我的代码:

// Detect mouse state
void
mouse(int button, int state, int x, int y)

    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
    
        moving = 1;
        beginX = x;
        beginY = y;
    
    if (button == GLUT_LEFT_BUTTON && state == GLUT_UP)
    
        moving = 0;
    


// Detect mouse movement
void motion(int x, int y)

    if (moving)
    
        angleX = (angleX + (x - beginX));
        angleY = (angleY + (y - beginY));
        beginX = x;
        beginY = y;
        newModel = 1;
        glutPostRedisplay();
    


// Rotate object
void recalcModelView(void)

    // Get object's centre
    int hh = head->GetHeight() / 2;
    int hw = head->GetWidth() / 2;
    int hd = head->GetDepth() / 2;
    glPopMatrix();
    glPushMatrix();
    // Rotate object based on mouse movement
    glTranslatef(hw, hd, hh);
    float temp1 = angleX / 5;
    float temp2 = angleY / 5;
    printf("TEMP1: %g\n", temp1);
    printf("TEMP2: %g\n", temp2);
    glRotatef(temp1, 0.0, 1.0, 0.0);
    glRotatef(-temp2, 1.0, 0.0, 0.0);
    glTranslatef(-hw, -hd, -hh);
    newModel = 0;

【问题讨论】:

你能准确解释一下“像预期的运动一样反转”是什么意思吗?我认为您的代码看起来不错。 我不是 OpenGL 专家,但你对 glPopMatrix(); glPushMatrix(); 序列的使用是可疑的。 @Xymotech 道歉。那是一个错字。意味着鼠标移动也会反转,即如果正常向右拖动鼠标,对象会顺时针旋转,那么现在将鼠标向右拖动会使对象逆时针旋转 【参考方案1】:

使用Arcball 之类的东西来解决这个问题。

【讨论】:

以上是关于OpenGL - 旋转 180 度后对象反转的主要内容,如果未能解决你的问题,请参考以下文章

数学中一个点在直角坐标系中绕原点旋转90或180度后的坐标怎么求?

java实现图片旋转90度的问题

FFMPEG输出图像自动旋转180度[重复]

OpenGL:切换和反转轴

OpenGL旋转和平移问题

[深度学习][转载]如何旋转图片180度重新获取坐标位置