2009-06-17 151 views
5

对于我的项目我需要旋转一个矩形。我想,在运行时,这将是容易的,但我发现了一个不可预知的行为..C++/OpenGL - 旋转矩形

下面是代码:

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

有什么问题?

谢谢

回答

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

非常感谢,它的工作原理! – 2009-06-17 19:53:51

1

确保在翻译前应用了旋转。

9

阐述一下以前的答案。

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

M_r_ - 旋转变换

M_t_ - 平移变换

N - 顶点

,你曾在顺序应用它们:

M_r_ * M_t_ * v

使用括号说明:

(M_r_ *(M_t_ * v))

我们看到顶点由更接近的矩阵首先转换,在这种情况下是转换。这可能有点反直观,因为这需要你按照与你希望它们应用的顺序相反的顺序来指定变换。但是如果你想到如何将变换放置在矩阵栈上,它应该有希望变得更有意义(堆栈被预先倍增)。

因此,为了得到您想要的结果,您需要指定相反顺序的变换。

+0

确实:)感谢您的更新! – 2009-06-18 02:24:23

3

惯性提供了非常好的响应。从代码角度来看,您的转换将按照它们出现的相反顺序进行。换句话说,更接近实际绘图代码的转换将首先应用。

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

首先会扩展你的东西,然后把它翻译,然后转动它。您实际上需要“向后读取您的代码”来确定以哪种顺序应用哪些变换。同时请记住,当您推入并弹出模型视图堆栈时,这些转换的状态是什么。