2010-12-04 4 views
1

openball이있는 arcball을 구현 중입니다 (cpp에서). 말하기, 나는 축 시스템의 중심에 개체가 있고 원래 (세계) 축에 따라 여러 번 회전하려고합니다. 그러나 첫 번째 회전 후에 축이 변경되고 이후의 모든 회전이 잘못됩니다. 아이디어가 있으십니까? 감사합니다. .OpenGL을 사용하여 회전하면서 원본 축 시스템 유지

+1

"openPG"란 무엇입니까? – genpfault

+0

Quaternions는 'Gimbal lock'에 대한 좋은 해결책입니다. – sje397

답변

1

필자는 OpenGL ES 응용 프로그램에서 직접 동일한 작업을 수행해야만했습니다. 그 응용 프로그램에 대한 설명은 here입니다. 원래 원유 방법은 현재 모델 뷰 행렬을 읽고 원하는 효과를 생산하기 위해 그것을 조작 :

GLfloat currentModelViewMatrix[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, currentModelViewMatrix); 
glRotatef(xRotation, currentModelViewMatrix[1], currentModelViewMatrix[5], currentModelViewMatrix[9]); 
glGetFloatv(GL_MODELVIEW_MATRIX, currentModelViewMatrix); 
glRotatef(yRotation, currentModelViewMatrix[0], currentModelViewMatrix[4], currentModelViewMatrix[8]); 

이 작동을하지만,이 glGetFloatv() 호출이 파이프 라인을 중단하여 렌더링 속도가 느려집니다 점에 유의. 이후로이 코드를 모델 뷰 매트릭스의 내부 복사본에서 수행하는 계산으로 바꾼 다음 각 회전 후에 내부에서 조작 된 모델 뷰 매트릭스를 작성합니다. 따라서 비싼 매트릭스 읽기 작업을 수행 할 필요가 없습니다.

2

개체에 자체 오리엔테이션 축 (modelview 행렬)을 제공 한 다음 회전 행렬을 곱합니다. 회전 행렬을 만드는 방법에 대한 정보는 Wikipedia에서 확인하십시오.

+0

rotatins에 glRotatef() 함수를 사용하고 있습니다. "오리엔테이션 축"이란 무엇입니까? – Sanich

+0

쉐이더를 사용하고 있지 않다면 미안하다. glRotate 호출 할 때마다 행렬 스택을 밀고/팝하고 있습니까? – cmannett85

1

xAngle 및 yAngle을 현재 행렬에 추가합니다.

Matrix.rotateM(matrix, 0, xAngleADD, matrix[1], matrix[5], matrix[9]); 
Matrix.rotateM(matrix, 0, yAngleADD, matrix[0], matrix[4], matrix[8]); 
gl.glMultMatrixf(matrix, 0); 
관련 문제