对于我的项目,我需要旋转一个矩形。我想,这很容易,但是在运行时我会遇到不可预知的行为..
以下是代码:
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_.x
和vec_vehicle_position_.y
。
有什么问题?
由于
答案 0 :(得分: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);
答案 1 :(得分:9)
详细说明以前的答案。
OpenGL中的变换通过矩阵乘法执行。在您的示例中,您有:
M_r_ - 旋转变换
M_t_ - 翻译转换
v - 一个顶点
您已按顺序应用它们:
M_r_ * M_t_ * v
使用括号澄清:
(M_r_ *(M_t_ * v))
我们看到顶点首先被更接近的矩阵变换,在这种情况下是平移。它可能有点反直觉,因为这需要您按照您希望它们应用的顺序指定相反的顺序来指定变换。但是如果您想到变换如何放置在矩阵堆栈上,它应该有希望更有意义(堆栈预先相乘)。
因此,为了得到您想要的结果,您需要以相反的顺序指定变换。
答案 2 :(得分:3)
Inertiatic提供了非常好的回应。从代码的角度来看,您的转换将以它们出现的相反顺序发生。换句话说,将首先应用更接近实际绘图代码的变换。
例如:
glRotate();
glTranslate();
glScale();
drawMyThing();
首先缩放你的东西,然后翻译它,然后旋转它。您实际上需要“向后读取代码”以确定哪些变换以哪种顺序应用。还要记住当您推送和弹出模型视图堆栈时这些变换的状态。
答案 3 :(得分:1)
确保在翻译之前应用旋转。