【问题标题】:Why does this OpenGL rotation also translate my object?为什么这个 OpenGL 旋转也会平移我的对象?
【发布时间】:2014-04-24 07:22:43
【问题描述】:

我正在尝试旋转默认位置指向右侧的对象(箭头)。我一直在环顾四周,我正在使用 glLoadIdentity() 和 glPushMatrix() 和 glPopMatrix() 作为仅在我的 glBegin 函数中旋转对象而不是整个场景的方法:

glLoadIdentity();
glPushMatrix();
glRotatef(5, 0.0f, 0.0f, 1.0f);
glBegin(GL_TRIANGLE_FAN);
    glColor3f(1.0f, 0.0f, 1.0f);
    glVertex2f(xx2-0.01, yy2);
    glVertex2f(xx2-0.06, yy2+0.03);
    glVertex2f(xx2-0.06, yy2-0.03);
glEnd();
glPopMatrix();

但是,它也会翻译我的箭头,而不仅仅是旋转它。我需要将偏移量转换回原来的位置吗?还是我做错了什么?

已解决:

glLoadIdentity();
glPushMatrix();
glTranslatef(xx2, yy2, 0);
glRotatef(45, 0.0f, 0.0f, 1.0f);
glTranslatef(-xx2, -yy2, 0);
glBegin(GL_TRIANGLE_FAN);
    glColor3f(1.0f, 0.0f, 1.0f);
    glVertex2f(xx2-0.01, yy2);
    glVertex2f(xx2-0.06, yy2+0.03);
    glVertex2f(xx2-0.06, yy2-0.03);
glEnd();
glPopMatrix();

需要平移回中心 (0, 0, 0),应用旋转然后回到原来的位置 (xx2, yy2, 0)

【问题讨论】:

    标签: c++ c opengl rotation translate-animation


    【解决方案1】:

    您的代码是正确的,但是您正在无序地应用您的操作。具体来说,您需要先应用旋转,然后应用平移。

    【讨论】:

    • 感谢您的回答,但我认为您误解了它。我不想翻译对象。我希望箭头围绕它的顶点(一个指向)旋转。假设它始终指向右侧,我想旋转 45 度,使其指向对角线。
    • @safm 是的,根据我的回答,您实际上必须故意翻译对象两次。
    【解决方案2】:

    所有旋转都围绕原点。

    所以是的,如果你想绕其他点旋转,你必须从那个点平移到原点,旋转,然后再平移回来。

    【讨论】:

    • 没有办法绕箭头的给定顶点旋转吗?
    • @safm 是的,有。移动它,使该点位于原点,旋转,向后移动。
    • 你说得对,我应该从我的 CG 课上记住这一点!谢谢!
    • “你必须从那个点翻译到原点”不是从原点到那个点吗?基本上将原点移动到该点的坐标?
    • @marcospgp 这是语义。如果您的旋转点是 (3, 4, 5),您必须将世界平移 相反
    猜你喜欢
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 2021-07-23
    • 1970-01-01
    相关资源
    最近更新 更多