2010-07-28 5 views
7

임 x 및 y 축에 대한 큐브의 간단한 회전을하려고 : 항상 양의 X 하여 x 축 위에 큐브를 회전 내가 원하는OpenGL은 매트릭스 회전 사원 수는

을하고 위에 큐브를 회전 X 축 회전 제

의 양 y는 독립적 y 축 I 소박했다 : 다음

glRotatef(x,1,0,0); 
glRotatef(y,0,1,0); 

하지만 첫번째 회전에 OV 그러면 x가 y 위로 회전합니다. x 접근과 독립적으로 y를 회전하려고합니다. 그래서 난 메신저 단계 또는 2

누락 생각 ... 그냥 거의 정확히 2 연속 glRotates 일을 성취 한 것을 수행

Quaternion Rotation1; 
Rotation1.createFromAxisAngle(0,1, 0, globalRotateY); 
Rotation1.normalize(); 

Quaternion Rotation2; 
Rotation2.createFromAxisAngle(1,0, 0, globalRotateX); 
Rotation2.normalize(); 

GLfloat Matrix[16]; 

Quaternion q=Rotation2 * Rotation1; 

q.createMatrix(Matrix); 
glMultMatrixf(Matrix); 

을 :

나는 사원 수를 조사하기 시작, 그래서 시도 쿼터니언은 갈 길입니까, 아니면 다른 무언가를 사용해야합니까? 만약 쿼터니언이 어떤 단계로 나아갈 수 있다면 큐브가 각 축에 독립적으로 회전하도록 추가 할 수 있습니다. 내가 다른 사람이 같은 문제가 있다고 생각 : 당신은 당신이해야 할 노력하고 무엇에 대한 자세한 설명을 제공 할 수 있다면 Rotating OpenGL scene in 2 axes

+0

을 그립니다. 나는 스크린 y 축 회전을 제어하기 위해 왼쪽으로, 그리고 스크린 x 축 회전을 downd 제어하기를 원한다. 나는 그것들이 다른 축과 독립적으로 회전하기를 원하지만 화면 글로벌 축에서만 회전 시키길 원한다. 내가 2 glRotations 할 경우 한 축 회전 다른 mutliplies 때문에이 동작이 발생하지 않습니다. – yeahdixon

+0

예를 들어 큐브를 회전하는 경우 : 회전 작업이 없으면 한 면만 나타납니다. 그렇다면 glRotatef (90,1,0,0); \t glRotatef (45,0,1,0); \t ⁃ \t은 실제로 작업을 바꾼 결과 인 카메라 모서리가있는 큐브를 원할 때 기울인 큐브 (다이아몬드)를 제공합니다. \t glRotatef (45,0,1,0); \t glRotatef (90,1,0,0); 회전 명령을 바꾸기 만했지만 각도 값을 뒤집 으면 같은 문제가 발생합니다. – yeahdixon

답변

3

쿼터니언을 사용하여 올바르게 작동하도록했습니다. 다른 방법도 있지만 확실하게 재검사 해보세요. 완벽하게 작동했습니다. 비슷한 포럼을 다른 포럼에 올렸습니다.http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=280859&#Post280859

먼저 최종적 현재 행렬을 곱하는 형태 행렬에 해당 쿼터니온으로 변환, X/Y 각 프레임의 변화를 승산이 축적 쿼터니언 쿼터니온 각도 변화의 각도 쿼터니언 표현을 생성한다. 여기에 루프의 주요 코드는 다음과 같습니다

Quaternion3D Rotation1=Quaternion3DMakeWithAxisAndAngle(Vector3DMake(-1.0f,0,0), DEGREES_TO_RADIANS(globalRotateX)); 
Quaternion3DNormalize(&Rotation1); 

Quaternion3D Rotation2=Quaternion3DMakeWithAxisAndAngle(Vector3DMake(0.0f,-1.0f,0), DEGREES_TO_RADIANS(globalRotateY)); 
Quaternion3DNormalize(&Rotation2); 


Matrix3D Mat; 
Matrix3DSetIdentity(Mat); 
Quaternion3DMultiply(&QAccum, &Rotation1); 

Quaternion3DMultiply(&QAccum, &Rotation2); 

Matrix3DSetUsingQuaternion3D(Mat, QAccum); 
globalRotateX=0; 
globalRotateY=0; 

glMultMatrixf(Mat); 

다음 확인을 내가 뭘 원하는 마우스를 사용하여 큐브를 회전입니다 ... 제가 이런 식으로 말을하자 큐브를

+0

이 사이트는 실제로 도움을주었습니다 : http://www.gamedev.net/reference/articles/article1095.asp 처음에는 조사하고 다시 시도 할 때까지 이해가되지 않았습니다. – yeahdixon

0

그것은 많은 도움이 될 것이다 당신이 얻고있는 결과가 원하는 결과와 다를 방법에 대해 설명합니다. 그러나 일반적으로 회전에 오일러 각도를 사용하면 회전을 결합하면 직관적이지 않은 동작이 발생할 수 있습니다 (최악의 경우 자유도가 손실 될 수 있음).

가능한 경우 Quaternion slerp가 도움이 될 수 있습니다. 원하는 회전을 나타내는 단일 축과 단일 각도를 찾습니다. 그러나 쿼터니언을 사용하여 X 축과 Y 축을 연속적으로 회전하는 것은 오일러 회전을 구성 할 때 발생하는 문제를 피하는 데 도움이되지 않습니다.

귀하가 링크하는 게시물에는 다른 문제가있는 것으로 보입니다. 포스터는 물체를 번역 한 다음 회전을 수행 한 것으로 보입니다. 먼저 회전해야하고 번역해야했습니다.

+0

위의 문제에 대해 자세히 설명했지만 위의 공식 용어는 짐벌 잠금이라고 생각합니다. – yeahdixon

0

달성하고자하는 것이 명확하지 않습니다. 어쩌면 당신은 어떤 점들에 대해 생각해 봐야하고 어디서 회전 시키길 원하나요? 꼭짓점 (1,1,1)은 (0,1,0)에 매핑되어야합니다. 그런 다음 해당 정보에서 필요한 회전을 계산할 수 있습니다.

쿼터니언은 일반적으로 두 개의 회전 '위치'를 보간하는 데 사용됩니다. 그래서 첫 번째 단계는 아직 시작하지 않은 시작과 끝 '위치'를 확인하는 것입니다. 일단 그렇게하면 쿼터니언을 사용하여 보간합니다. 여기에 시간에 변화가있는 것처럼 보입니다.

+0

위의 문제를 자세히 설명했지만 공식 용어는 짐벌 잠금이라고 생각합니다. – yeahdixon

0

문제는 짐벌 잠금 장치가 아닙니다. 그리고 효과적으로 쿼터니온 버전이 행렬 (glRotate) 버전보다 잘 작동 할 이유가 없습니다. 사용중인 쿼터니언이 수학적으로 회전 행렬과 동일하기 때문입니다.

마우스 컨트롤을 원할 경우 arcballs을 확인하고 싶을 것입니다.

+0

감사합니다. 그렇습니다. 전적으로 쿼터니언 및 순환 행렬에 동의합니다. 그것은 쿼터니언없이 할 수 있도록 상호 교환 될 수 있습니다. 이 문제에 대한 해답은 증분 회전을 사용하여 행렬의 미리 곱하기에 더 많은 것이 었습니다. – yeahdixon