Amo*_*tir 5 c++ opengl rotation
对于我的项目,我需要旋转一个矩形.我想,这很容易但是我在运行它时会遇到不可预知的行为.
这是代码:
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();
Run Code Online (Sandbox Code Playgroud)
问题是,我的矩形在旋转时在窗口的某处进行翻译.换句话说,矩形不保持位置:vec_vehicle_position_.x
和vec_vehicle_position_.y
.
有什么问题 ?
谢谢
And*_*son 10
您需要翻转转换的顺序:
glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);
Run Code Online (Sandbox Code Playgroud)
变
glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);
glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
Run Code Online (Sandbox Code Playgroud)
详细说明以前的答案.
OpenGL中的变换通过矩阵乘法执行.在您的示例中,您有:
M_r_ - 旋转变换
M_t_ - 翻译变换
v - 一个顶点
并且您已按顺序应用它们:
M_r_*M_t_*v
使用括号来澄清:
(M_r_*(M_t_*v))
我们看到顶点首先被更接近的矩阵变换,在这种情况下是平移.它可以是一个有点反直觉的,因为这需要你在以指定的是要他们应用.但是,如果你认为的变换是如何放置在矩阵堆栈它应该有希望做出更有点意义相反的转换(堆栈预先相乘).
因此,为了获得所需的结果,您需要以相反的顺序指定变换.