2010-06-17 2 views
0

최근 iPhone 용 OpenGL ES로 작업하기 시작했는데 약간의 문제가 있습니다. 손가락으로 물건을 회전시키고 싶습니다. 내 문제는 (0, 0, -3)에 배치 된 객체가 있고 그 중심을 중심으로 회전하고 싶습니다. 나는 원점으로 돌아가 번역하고 회전시킨 다음 다시 원래 위치로 가져와야한다는 것을 알고 있습니다. 나는 모든 회전/변환/스케일링 등을 추적하기 위해 행렬을 사용하기 때문에 문제가 발생한다고 생각한다. 그리고 순서가 고려되지 않은 방식으로 조작을 결합 할 수 있다고 생각한다. (그래서 두 번역은 서로 취소 할 것입니다). 나는 하루 전 OpenGL을 배우기 시작했고 완전한 초보자입니다. 그래서 제 가정은 틀릴 수도 있습니다.iPhone 용 OpenGL ES에서 객체 회전 [원본 -> 회전 - 뒤 번역이 작동하지 않습니다.]

도움이 많이 주시면 감사하겠습니다
GLfloat matrix[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, matrix); 
glLoadIdentity(); 
glTranslatef(0, 0, 3); // bring to origin 
glRotatef(self.angle, self.dy, self.dx, 0); // rotate 
glTranslatef(0, 0, -3); // put it back in place 
glMultMatrixf(matrix); // save the transformations performed 

, 감사합니다 :

는 여기에 내가에 문제가 있어요 그 drawView에서의 일부입니다!

+0

변환을 함께 묶어도 좋습니다. 그것이 행렬 변환이 작동하는 방식입니다. 그것에 대해 정확히 무엇이 효과가 없습니까? – Alan

+0

glTranslatef (0, 0, 3)를 사용해도 번역 전에 회전하도록 요청한 것처럼 보입니다. 그래서 제가 (1, 0, 0)에 관해서 원점으로의 변환 후에 회전 시키길 원한다면, 원점으로 회전 한 후에 회전 할 것을 기대하지만 회전 대신에 큰 원으로 궤도를 그리게됩니다. –

답변

0

모델 뷰 매트릭스를 검색 한 다음 회전 후 다시 곱하기가 비현실적이지만 다른 변환이 무엇이고 좌표 공간이 무엇인지에 따라 달라집니다. glMultMatrix 줄에 대한 귀하의 의견은 현재하고있는 일과 일치하지 않습니다.

일반적으로 객체를 렌더링하기 바로 전에 translate + rotate + translate를 객체에서 가장 로컬 액션으로 사용하면됩니다. 또한 이것은 오브젝트가 오브젝트 공간에 (0, 0, -3)에있는 경우에만 적용된다는 점에 유의하십시오. 월드 공간의 해당 위치에있는 경우 월드의 의도 된 위치로 객체를 이동하기 위해 이전에 일련의 변형 호출 (변환, 회전 등)을 수행 한 경우 회전은 이미 자체 중심을 중심으로 객체를 회전시킵니다.

변형 순서는 OpenGL을 배우는 까다로운 부분 중 하나입니다. 일반적인 경험 법칙으로, 작업은 가장 바깥쪽으로 시작하여 가장 안쪽으로 진행됩니다. 따라서 변환의 전형적인 간단한 세트는 다음과 같습니다. 카메라 변형의 역함수는 카메라와 일치하도록 세계를 이동 한 다음 객체의 번역을 월드 공간 위치로 이동 한 다음 의도 한 방향을 설정하는 회전입니다. PushMatrix/PopMatrix 스택 함수를 사용하면 오브젝트 그룹이 해당 체인의 일부를 공유 할 수 있도록 해당 변환 시리즈의 일부를 저장하고 실행 취소 할 수 있습니다.

+0

그렇다면 행렬을 없애고 변환 -> 회전 -> 변환을 수행하면 작동할까요? 방금 해봤으니 여전히 우스운 행동을하는 것 같습니다. 또한 사려 깊은 답변에 감사드립니다. 매우 도움이됩니다. –

+0

나는 방금 회전하지만 모든 것을 없애 버렸고 마술처럼 작동합니다. 왜 그런지는 모르겠지만 ... 조금 혼란 스럽지만 행복합니다. 다시 감사합니다. –