C++/OpenGL - 旋转矩形

6

为了我的项目,我需要旋转一个矩形。我觉得这很简单,但当我运行它时,却出现了不可预测的行为。

下面是代码:

    glPushMatrix();
    glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
    glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glBegin(GL_QUADS);

        glTexCoord2f(0.0f, 0.0f);
        glVertex2f(0, 0);
        glTexCoord2f(1.0f, 0.0f);
        glVertex2f(width_sprite_, 0);
        glTexCoord2f(1.0f, 1.0f);
        glVertex2f(width_sprite_, height_sprite_);
        glTexCoord2f(0.0f, 1.0f);
        glVertex2f(0, height_sprite_);

    glEnd();
    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);
    glPopMatrix();

问题在于,当矩形旋转时,在窗口中某个位置进行了平移。换句话说,矩形不能保持位置:vec_vehicle_position_.xvec_vehicle_position_.y

问题出在哪里?

谢谢

4个回答

10
您需要翻转您的变换顺序:
glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);
成为
glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);
glRotatef(30.0f, 0.0f, 0.0f, 1.0f);

9
为了阐述之前的答案,OpenGL中的变换是通过矩阵乘法来执行的。在你的示例中,你有:
M_r_ - 旋转变换 M_t_ - 平移变换 v - 一个顶点
并且你按照以下顺序应用它们:
M_r_ * M_t_ * v
使用括号来澄清:
( M_r_ * ( M_t_ * v ) )
我们可以看到,顶点首先被更近的矩阵进行变换,这在这种情况下是平移。这可能有点反直觉,因为这要求你按照相反的顺序指定变换以便应用它们。但如果你想一下变换如何放置在矩阵堆栈上,它应该会更加有意义(堆栈是预乘在一起的)。
这就是为什么为了获得所需的结果,你需要按相反的顺序指定变换的原因。

3
Inertiatic提供了非常好的回答。从代码角度来看,您的转换将按照它们出现的相反顺序发生。换句话说,距离实际绘图代码更近的变换将首先应用。
例如:
glRotate();
glTranslate();
glScale();
drawMyThing(); 将先缩放您的物体,然后平移它,最后旋转它。您需要“倒读您的代码”以确定应用哪些变换以及它们的顺序。还要记住,在推入和弹出模型视图堆栈时这些变换的状态。

1

确保在进行翻译之前应用旋转。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接