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

4 回答 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);
于 2009-06-17T19:51:39.917 回答
9

详细说明以前的答案。

OpenGL 中的转换是通过矩阵乘法执行的。在您的示例中,您有:

M_r_ - 旋转变换

M_t_ - 平移变换

v - 一个顶点

并且您已按顺序应用它们:

M_r_ * M_t_ * v

使用括号来说明:

(M_r_ * (M_t_ * v))

我们看到顶点首先被更接近的矩阵转换,在这种情况下是平移。这可能有点违反直觉,因为这要求您按照与您希望它们应用的顺序相反的顺序指定转换。但是如果您考虑如何将转换放置在矩阵堆栈上,它应该希望更有意义(堆栈预乘在一起)。

因此,为什么为了获得您想要的结果,您需要以相反的顺序指定转换。

于 2009-06-18T01:39:12.507 回答
3

Inertiatic 提供了非常好的响应。从代码的角度来看,您的转换将以它们出现的相反顺序发生。换句话说,将首先应用更接近实际绘图代码的变换。

例如:
glRotate();
glTranslate();
glScale();
drawMyThing();

Will first scale your thing, then translate it, then rotate it. You effectively need to "read your code backwards" to figure out which transforms are being applied in which order. Also keep in mind what the state of these transforms is when you push and pop the model-view stack.

于 2009-06-18T01:46:20.810 回答
1

确保在平移之前应用旋转。

于 2009-06-17T19:47:43.810 回答