2009-06-17 5 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

고맙습니다. 작동합니다! –

1

번역하기 전에 회전이 적용되어 있는지 확인하십시오.

9

이전 답변에 정교하게된다.

OpenGL의 변환은 행렬 곱셈을 통해 수행됩니다. 번역이

V 변환 - - 회전이

M_t_ 변환 -

M_r_ 정점

을 당신은 순서대로 적용했다 : 당신의 예에서, 당신은

M_r_ * M_t_ * v

괄호를 사용하여 명확히하기 :

(M_r_ * (M_t_ * v))

우리는 정점이 더 가까운 행렬 (이 경우 변환)에 의해 변환된다는 것을 알 수 있습니다. 이것은 직관적 인 약간의 카운터가 될 수 있습니다. 왜냐하면 여러분이 적용하고자하는 순서의 반대 순서로 변환을 지정해야하기 때문입니다. 그러나 변환이 행렬 스택에 어떻게 배치되는지 생각한다면 조금 더 의미가 있어야합니다. (스택은 미리 곱 해짐).

따라서 왜 원하는 결과를 얻으려면 변환 순서를 반대 순서로 지정해야합니다.

+0

참으로 :) 업데이트 주셔서 감사합니다! –

3

관성은 매우 좋은 반응을 제공했습니다. 코드 관점에서, 변환은 나타나는 순서의 역순으로 일어납니다. 즉, 실제 드로잉 코드에 더 가까운 변환이 먼저 적용됩니다. 예를 들어

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

먼저 일을 확장 할 것인가, 다음 번역, 다음을 돌립니다.어떤 변환이 어떤 순서로 적용되는지 파악하기 위해 "코드를 거꾸로 읽어야"합니다. 또한 모델 - 뷰 스택을 밀고 팝 할 때 이러한 변환의 상태가 무엇인지 염두에 두십시오.