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_.x
和 vec_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 - 旋转一个矩形的主要内容,如果未能解决你的问题,请参考以下文章