2011-12-15 3 views
0

OpenGL에서 내 객체 (행성)를 현재 카메라 회전과 관련하여 회전시키는 데 문제가 있습니다. 처음에는 작동하는 것처럼 보이지만 약간 회전 한 후에는 회전이 더 이상 카메라에 맞지 않습니다.OpenGL에서 카메라를 기준으로 회전하는 객체

화면에서 mouseX 및 mouseY 동작의 델타 (차이)를 계산 중입니다. 회전은 'planetRotation'이라는 Vector3D에 저장됩니다. , 어떤이가하는 'rotateAmount'변수에 회전을 설정 - 이론적으로

Vector3D rotateAmount; 
rotateAmount.x = deltaY; 
rotateAmount.y = deltaX; 
rotateAmount.z = 0.0; 

glPushMatrix(); 
    glLoadIdentity(); 
    glRotatef(-planetRotation.z, 0.0, 0.0, 1.0); 
    glRotatef(-planetRotation.y, 0.0, 1.0, 0.0); 
    glRotatef(-planetRotation.x, 1.0, 0.0, 0.0); 
    GLfloat rotMatrix[16]; 
    glGetFloatv(GL_MODELVIEW_MATRIX, rotMatrix); 
glPopMatrix(); 

Vector3D transformedRot = vectorMultiplyWithMatrix(rotateAmount, rotMatrix); 
planetRotation = vectorAdd(planetRotation, transformedRot); 

:

다음은 planetRotation에 회전 상대를 계산하는 내 코드입니다. 그런 다음이 벡터에 역 모델 변환 행렬 (rotMatrix)을 곱하여이를 모델 공간으로 가져옵니다.

이 변환 된 회전이 현재 회전에 추가됩니다.

glPushMatrix(); 
    glRotatef(planetRotation.x, 1.0, 0.0, 0.0); 
    glRotatef(planetRotation.y, 0.0, 1.0, 0.0); 
    glRotatef(planetRotation.z, 0.0, 0.0, 1.0); 
    //render stuff here 
glPopMatrix(); 

주변 워 카메라 정렬, 나는 수행하기 위해 노력하고있어 회전, 현재를 기준으로 변환하지 않는 것 :

이있는 변환되는 설정을 렌더링합니다.

내가 뭘 잘못하고 있니?

답변

5

GAH!

glPushMatrix(); 
    glLoadIdentity(); 
    glRotatef(-planetRotation.z, 0.0, 0.0, 1.0); 
    glRotatef(-planetRotation.y, 0.0, 1.0, 0.0); 
    glRotatef(-planetRotation.x, 1.0, 0.0, 0.0); 
    GLfloat rotMatrix[16]; 
    glGetFloatv(GL_MODELVIEW_MATRIX, rotMatrix); 
glPopMatrix(); 

의 OpenGL은 수학 라이브러리되지 않습니다 :은 그렇게하지 마십시오. 그런 일에 적합한 선형 대수 라이브러리가 있습니다.


벡터가 회전을 저장하는 데 적합하지 않습니다.. 적어도 벡터 (회전의 축)와 각도 자체가 필요합니다. 또는 더 나은 것은 쿼터니언입니다.

회전도 추가되지 않습니다. 그들은 교환 할 수 없지만, 덧셈은 교환 적 연산입니다. 실제로 회전은 을 곱하여입니다.

코드 수정 방법 : 올바른 수학적 방법을 사용하여 코드를 처음부터 다시 작성하십시오. 이를 위해 "회전 행렬"및 "쿼터니언"(Wikipedia에 포함되어 있습니다) 항목을 읽어보십시오.