【问题标题】:C++/OpenGL - Rotating a rectangleC++/OpenGL - 旋转一个矩形
【发布时间】: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

有什么问题?

谢谢

【问题讨论】:

    标签: c++ opengl rotation


    【解决方案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】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-12-06
            • 1970-01-01
            • 2021-10-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-18
            • 1970-01-01
            相关资源
            最近更新 更多