2009-08-20 4 views
6

XNA에서 뷰 매트릭스를 이해하는 데 심각한 문제가 있습니다. 나는 다른 모든 부분들과 꽤 멀리 떨어져 왔고, 필요한 수학을 배웠기 때문에 처음에 무엇을하는지 이해하지 않고서는 내장 된 행렬 함수를 사용하고 싶지 않습니다.XNA 매트릭스보기 - 검색 설명

이제 회전, 투영 및 변환의 기본 사항을 이해하지만 XNA에서보기 매트릭스가 작동하는 방식을 이해할 수는 없습니다.

내가 수집 한 것부터보기 매트릭스는 "세계"를 자신의 공간으로 변형시켜야합니다. 합리적인 것 같지만, 라이브러리의 Matrix.CreateLookAt 메서드는 매우 혼란 스럽습니다.

내가 설립 한

(어떤 라이브러리 함수 출력을 검사를 통해) 그 코드 수율이 두 조각 같은 결과 :

Matrix view = Matrix.CreateReflection(new Plane(Vector3.UnitX, 0)) * Matrix.CreateReflection(new Plane(Vector3.UnitZ, 0)) * Matrix.CreateTranslation(Position); 
// ..equals this if (Position = (0 0 -5), since LookAt "looks at" but the above just looks straight down Z).. 
Matrix blah = Matrix.CreateLookAt(Position, Vector3.Zero, Vector3.UnitY); 

가 왜 X와 Z 축 플립? 나는 카메라 회전에 따라 세계를 회전시켜야한다고 생각했지만 반대 방향으로 그리고 나서 반대 방향으로 같은 양만큼 세계를 번역합니다.

아니면 변형으로 사용되지 않는 뷰 매트릭스가 아니라 카메라의 위치와 회전을 인코딩하는 것입니까?

답변

5

뷰 매트릭스는 장면을 뷰 공간으로 변환합니다. 뷰 공간에서 가상 카메라는 원점에 있으며 z 방향이 양으로 보입니다. 이것을 달성하는 데는 여러 가지 방법이 있지만 가장 일반적으로 뷰 행렬은 각 축을 중심으로 한 이동과 세 개의 회전으로 구성됩니다.

가 변환 = 번역 * RotationZ *의 rotationY *의 rotationX

+0

고마워, 내 원래의 아이디어가 맞았다. 그러나 나는이 모든 다른 좌표계를 약간 혼란스럽게 만들었습니다. – Skurmedel

1

내 지오메트리를 올바르게 기억한다면 두 번의 반사를 구성하면 한 번의 회전이 발생합니다.

+0

흥미 롭. 위에서 언급 한 반사는 Y를 중심으로 180도 회전과 일치해야합니다. – Skurmedel

21

이해해야 할 세 가지 유형의 변환이 있습니다 (월드, 뷰 및 프로젝션).

월드 변환은 모델 공간을 모델 공간에서 월드 공간으로 변경합니다. 모델의 정점을 정의 할 때 모델의 원점을 기준으로 정의합니다. 월드 변환은 장면에있는 모든 객체 (즉, 월드 공간)가 공유하는 원점을 기준으로 해당 정점을 변형합니다.

뷰 변환은 이러한 정점을 뷰 공간으로 변환합니다. 뷰어/카메라는 뷰 공간에서 위치와 방향을 가지며 장면의 모든 객체에 적용하는 뷰 행렬을 만드는 데 사용됩니다. 뷰 공간에서 뷰어/카메라는 원점에 있으므로 뷰 매트릭스는 모든 오브젝트를 변환하여 뷰 공간에 배치합니다.

마지막으로 투영 변환은 카메라가 사용하는 "렌즈"의 유형을 결정합니다. 지금까지 우리는 단지 대상을 번역하고 회전 시켰을뿐입니다. 스케일이나 원근감이 없습니다. 투영 변환은 뷰잉 프러스 텀을 생성하고 정점을이 뷰포트로 변환합니다.

지금 질문드립니다. x 축, z 축에 대한 좌표계를 반영한 ​​다음 마지막으로 변환합니다. 위치가 xz 평면과 yz 평면에 있기 때문에 lookat 행렬과 동일한 결과를 얻지 만 한 위치를 y 축 위로 이동하면 어떻게되는지 알 수 있습니다. 그러면 두 개의 메트릭은 같지 않을 것입니다.

+1

답장을 보내 주셔서 감사합니다. 나는 가장 낮은 순위의 답을 골랐다. 너 둘 다 도와 줬어. – Skurmedel

+2

걱정할 필요가 없습니다. 다행스럽게 생각해 냈습니다. :) – Tchami

4

다음 링크가 크게 이해하고보다 효과적으로 행렬을 사용하여 저를 도왔다.당신은 그들에게 흥미있을 거라고 : 내가 지금 당신 상대적으로 같은 일을하고 있어요

http://stevehazen.wordpress.com/2010/02/15/matrix-basics-how-to-step-away-from-storing-an-orientation-as-3-angles/

:

+0

고맙습니다. 꽤 포괄적입니다. – Skurmedel

+0

XNA에서 3D 기반의 다른 작업을하고 정보 링크로 펌핑하고 싶다면 그냥 물어보십시오. 더 많은 고급 정보를 얻기 위해 많은 정보를 수집하고 컴파일하기 전에 많은 연구를했습니다. – Remm

+0

Hiya, Remm, 저는 3D 기반의 XNA 관련 작업을하고 있습니다. 정보 링크가 필요합니다. 나 제안이있어? –