2010-08-09 8 views
2

iPhone에서 OpenGL ES로 게임하고 있는데 손가락으로 패닝하여 모델을 회전하려고합니다. 나는 오픈 소스 애플리케이션 분자를 발견했다. 그 코드를 살펴보면, 내 모델을 회전 할 때 공간에서 멀리 떨어진 지점에서만 회전 할 수있다. 위성 궤도에서 나는 고정 된 행성이다). 무엇이 잘못 될 수 있는지에 대한 제안이 있으십니까? 나는 당신이에 모델을 변환 할 필요가 있다고 생각, 내 기억이 제대로 날을 제공하는 경우 여기 MOLECULESOpenGL ES : 3D 모델 자체 회전하기

답변

4

을 찾을 수 있습니다 대부분의 경우 , 나중에 어쩌면 수요에 (여러 라인) 코드를 게시 분자를 참조 할 수 있습니다 원점 복귀, 회전 후 다시 시작 위치로 변환하여 이후의 효과를 얻을 수 있습니다.

나는 glTranslate() 함수가 있다고 생각합니다. 객체가 1,0,0에 있다고 가정합니다. 그런 다음 -1,0,0을 원점으로 이동해야합니다. 이것은 객체의 중심에서 원점으로 이동하는 벡터에 의해 변환됩니다.

+0

어떻게 번역 할 수 있습니까? 나는 0,0,0에 있고 객체가 어떤 좌표에 서 있다고 추측한다. 모델 안에서도 번역하려고했는데 (나는 그것의 반만 볼 수있다.) 그러나 어떤 dinstance에서 회전을 계속한다. 나는 완전히 멍청하다. . – rano

+0

위 번역본을 예제 번역으로 업데이트했습니다. 자신이 OpenGL 초보자라고 생각한다면 OpenGL을 처음 사용할 때 "NeHe"튜토리얼을 많이 배웠다. 10과 (http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=10)는 3D 세계를 움직이는 방법을 보여줍니다. (모델 로딩에 대한 간단한 글을 스크롤하십시오) –

+0

@ S.C. Madsen : 제가해야 할 일은 제가 처음 번역 한 양을 번역하는 것입니다. 하지만 실제로 그것을 할 수 없다, 나는 모델을로드한다. (그래서 그의 꼭지점이 어떤 정의 된 좌표를 가지고 있고 그가 기원에 놓이지 않은 것 같다) gltranslate()와 glRotate를 사용하여 '카메라'를 움직인다. 장면이 움직이는 지 알 수 있습니다.) 장치보기에서 모델을 갖기 위해. 그래서 나는 원근감이나 좌표축 시스템에 대해 뭔가 잘못하고 있다고 생각합니다. – rano

3

은 무승부 코드는 아마 다음과 같이 대략 같습니다

glLoadIdentity(); 
glTranslate(0, 0, -10); 
glRotate(...); 
drawMolecule(); 

이 지금은 이러한 변환은 역순으로 적용되는 것을 깨닫게하는 것이 중요합니다. drawMolecule, 우리는 정점을 지정하면,이 정점 는 (정의에 의해 분자의 로컬 원점을 통과) glRotate 주어진 축을 중심으로 회전되고, 다음는 10 개 단위를 번역 -z 방향.

glTranslate은 "다음에 오는 모든 것을 번역"을 의미하기 때문에 의미가 있습니다. 여기에는 glRotate 호출 자체가 포함되므로 회전 결과도 변환됩니다. 호출이 역전 된 경우 변환 결과가 회전되어 더 이상 원점을 통과하지 않는 축을 중심으로 회전합니다.

결론을 : 그 지역 기원에 대해 객체를 회전하려면 glRotate 전화 마지막을 넣어.

+0

모든 변환이 스택에 들어간 것처럼 들립니다. – rano

+0

예, 아니오. 이렇게하면, 현재 변환 행렬에 지정된 회전/변환 행렬이 단순히 곱 해져서 역행 변환을 적용하지 않는 한 이전 행렬로 돌아갈 방법이 없습니다. 그러나 반올림을 사용하면됩니다. 오류, 확신 할 수있는 방법이 없습니다). 그러나 OpenGL *은 "행렬 스택"을 가지고 있습니다 : 여러분은 명시 적으로'glPushMatrix'와'glPopMatrix'를 사용하여 현재 행렬을 저장하고 복원 할 수 있습니다. 스택 맨 위에있는 행렬이 현재 행렬입니다. 그 아래의 행렬은 전혀 보지 않습니다. – Thomas

+0

알았어. 순서가 중요하다는 사실은 교환 적 속성이없는 두 행렬의 사전 곱셈에서 발견된다는 사실이다. – rano