2013-04-15 4 views
2

Android에서 OpenGL 2.0을 배우려고 노력 중이므로 iOS에서 OpenGL 1을 사용하여 게임을 즐겼으며 정말 즐겁습니다.Android : OpenGL 2.0 1 인칭 카메라

내 간단한 질문 카메라 및 이동할 수있는 3D 환경 (첫 사람)

을 만들기에 관한 나는 카메라를 제어 할 수

Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ); 

를 사용해야하고 난에 어딘지 세계 (onDrawFrame에 업데이트) 또는 onSurfaceCreated (한 번)에 그 설정 나는 내 주위 세계를 회전하고 느낌있는 대신

Matrix.setIdentityM(mViewMatrix, 0); 
Matrix.translateM(mViewMatrix, 0, mMoveY, 0.0f, mMoveX); 
Matrix.rotateM(mViewMatrix, 0, mDeltaY, 1.0f, 0.0f, 0.0f); 
Matrix.rotateM(mViewMatrix, 0, mDeltaX, 0.0f, 1.0f, 0.0f); 

를 사용하여.

난 당신이 같은 결과를 얻을 수 있기 때문에 GLLookAt

+1

분명히 정확한 결과를 산출하는 것을 사용하십시오. 'setLookAt'는 변환과 회전보다 더 높은 추상화이기 때문에 둘 다 사용할 수 있습니다. –

+0

당신과 당신의 사용 사례에 가장 적합한 것을 사용하십시오. OpenGL에서 당신이하는 일은 당신 주위의 세계를 회전시키는 것입니다. 실제 카메라는 없습니다 (어쨌든 쉐이더에서 변형을 완전히 제어 할 수있는 ES 2에서는 더욱 그렇습니다). 결국'setLookAt'는 * "world"*의 회전과 변환을 계산하는 것보다 많은 것을하지는 않습니다. 같은 방식으로'translate'와'rotate' 호출의 무리처럼, 더 좋은 것입니다. 높은 수준의) 인터페이스를 제공합니다. 이미'mMove'와'mDelta' 값을 가지고 있다면, 두번째 방법이 더 쉬워 질 것입니다. –

+0

내게 설명해 주실 수 있습니다. lookAt는 여러 통화를 호출하고 메서드 호출을 호출하는 것과 동일합니까? translate 부분은 실제로 그다지 많은 작업이 아니지만 rotate는 sin/cos 연산을 수행하여 회전 행렬을 만든 다음 2 행렬을 곱해야합니다. 반면 LookAt는 3 개의 기본 벡터와 번역을 매트릭스에 직접 삽입합니다.기본 벡터 : X 축 교차 (앞으로, 위로), Y 축 위로, Z 축 앞으로 = 룩어. 각각은 각각 열로 표시됩니다. 결과가 같으면 동의하지만 가장 적합한 것을 사용하십시오. –

답변

1

두 가지 방법 중 어떤 괜찮를 사용하는 데 사용 OpenGL을 1가 중 할 예를 보았다. 일반적인 차이점은 객체 상태를 저장하는 방법에 관한 것입니다. 3D 환경에서 나는 항상 3 개의 벡터를 사용하여 객체 상태 (위치, 앞으로, 위로)를 확인하고 lookAt와 동일한 매개 변수로 객체를 배치 할 수있는 lookAt 및 modelMatrix의 수정 된 버전을 사용합니다. 이 접근법의 장점은 다른 객체에 따라 매개 변수를 직접 배치 할 수 있다는 것입니다. 예를 들어 유도 미사일이 당신을 따르고 있으며, 항상 당신이있는 곳이나 이동하는 곳이 없습니다. 그 다음 전달 벡터는 단순히 taregetPosition-missilePosition (대개 정규화 됨)입니다. 반면에 각도를 계산해야한다면, 각각의 각도에 대해 asin, acosif 문을 직접 입력해야합니다. 예를 들어 방의 주위를 움직이는 간단한 예를 들면 다음과 같습니다. 기본 벡터를 사용하는 경우 position = position+forward*speedFactor 각도를 사용하는 동안 다시 어떤 방향으로 계산하고 동일한 작업을 수행해야합니까? (몇 가지 상황이 있습니다. 유용하다)

하지만 단점이있다. 벡터를 이동하고 회전하려면 자체 시스템이 있어야합니다. 예를 들어 당신은 다음과 같이 보일 것 45 개도에 왼쪽에 차례를 말하고 싶은 경우 : 간격 각도

forward = (forward+cross(up,forward)*tan(45)).normalized 

이 유일한 작품 (-90, 90). 그것은 위로 올릴 때 확실히 동일하게 되겠지만 또한 위로 벡터를 수정해야합니다.

그래서 기본 벡터 (회전, 모양, 모델 행렬 ...)로 작업 할 수있는 모든 방법을 작성하면 실제 노동 절약 방법입니다. 그러나 단순히 사용하려는 프로젝트를 결정할 때 쓰는 프로젝트에 달려 있습니다.

+0

나는 두 번째 방법으로가는 당신의 말을 이해하고 있다고 생각하지만, 나는 학위에서 나의 회전을 가지고있다. 그러나 나는 공간에서 나의 위치 (X, Y, Z)를 찾아야한다. 내가 어떻게 그 일을 할 수 있는지 알고 있니? – Burf2000

+0

정확히 그 뜻은 무엇입니까? –

+0

따라서 rotateM을 사용하면 플레이어의 회전을 알 수 있습니다. 그러나 translateM과 rotateM을 함께 사용하기 때문에 공간에 위치를 알 수 없습니다. 예를 들어 45도 회전 한 다음 1 단계 앞으로 이동하면 x, y, z 위치를 어떻게 알 수 있습니까? – Burf2000