문제

내 프로젝트의 경우 사각형을 회전해야했습니다. 나는 그것이 쉬울 것이라고 생각했지만 그것을 실행할 때 예측할 수없는 행동을 받고 있습니다 ..

코드는 다음과 같습니다.

    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.

뭐가 문제 야 ?

감사

도움이 되었습니까?

해결책

변신 순서를 뒤집어 야합니다.

glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);

becomes

glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);
glRotatef(30.0f, 0.0f, 0.0f, 1.0f);

다른 팁

이전 답변에 대해 자세히 설명합니다.

OpenGL의 변환은 행렬 곱셈을 통해 수행됩니다. 당신의 예에서 당신은 다음과 같습니다.

M_R_- 회전 변환

M_T_- 번역 변환

V- 정점

그리고 당신은 그것들을 순서대로 신청했습니다.

m_r_ * m_t_ * v

괄호를 사용하여 명확히합니다.

(M_R_ * (M_T_ * V))

우리는 정점이 먼저 더 가까운 매트릭스로 변환되는 것을 알 수 있습니다.이 경우 번역입니다. 적용하려는 것과 반대 순서대로 변환을 지정해야하기 때문에 약간의 카운터 직관적 일 수 있습니다. 그러나 매트릭스 스택에 변환이 어떻게 배치되는지 생각하면 조금 더 감각적으로 만들어야합니다. (스택은 함께 사전 다중 활동을합니다).

따라서 원하는 결과를 얻으려면 변환을 반대 순서로 지정 해야하는 이유가 있습니다.

관성은 매우 좋은 반응을 제공했습니다. 코드 관점에서, 당신의 변환은 그들이 나타나는 역 순서로 발생합니다. 다시 말해, 실제 드로잉 코드에 더 가깝게 변환이 먼저 적용됩니다.

예를 들어:
glRotate();
glTranslate();
glScale();
drawMyThing();

먼저 물건을 확장 한 다음 번역 한 다음 회전시킵니다. 어떤 순서가 적용되는지를 알아 내기 위해 "코드를 뒤로 읽어야"해야합니다. 또한 모델 뷰 스택을 밀고 튀어 나올 때 이러한 변환 상태가 무엇인지 명심하십시오.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top