C++/OpenGL - 旋转一个矩形

Posted

技术标签:

【中文标题】C++/OpenGL - 旋转一个矩形【英文标题】:C++/OpenGL - Rotating a rectangle 【发布时间】:2009-06-17 19:44:19 【问题描述】:

对于我的项目,我需要旋转一个矩形。我想,这很容易,但是运行它时我会遇到不可预知的行为..

代码如下:

    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

有什么问题?

谢谢

【问题讨论】:

【参考方案1】:

您需要颠倒转换的顺序:

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);

【讨论】:

【参考方案2】:

详细说明之前的答案。

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

M_r_ - 旋转变换

M_t_ - 平移变换

v - 一个顶点

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

M_r_ * M_t_ * v

用括号来说明:

( M_r_ * ( M_t_ * v ) )

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

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

【讨论】:

【参考方案3】:

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

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

将首先缩放你的东西,然后平移它,然后旋转它。您实际上需要“向后阅读您的代码”,以确定哪些转换是以何种顺序应用的。还请记住,当您推送和弹出模型视图堆栈时,这些转换的状态是什么。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于C++/OpenGL - 旋转一个矩形的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 2D 圆 - 旋转 AABB 碰撞

opengl旋转曲面画立体图

OpenGL - 围绕 Y 轴旋转“曲线”

OpenGL奇怪的立方体旋转

在opengl中重叠矩形并在底部裁剪

C ++ / OpenGL - 2D - 如何在矩形边界框中剪切圆