2013-11-01 4 views
1

개체 주변을 궤도에 따라 안내해야하는 카메라가 있습니다. 이 객체는 법선 벡터로 설명되는 임의의 회전을가집니다. 그 행성의 특정 삼각형을 내려다 보는 카메라와 함께 구형 행성을 상상해보십시오.법선 벡터의 회전 행렬, 극점을 뒤틀어 서

현재의 구현 방법은 고전적인 벡터 교차 방법을 사용하여 삼각형의 법선에서 회전 행렬을 생성 한 다음이 행렬을 표준 궤도 카메라의 기초로 사용하는 것입니다. 이것은 행성의 적도 부근에서 정상적으로 작동하지만, 일단 극에 가까워지면 카메라가 점점 더 불규칙하게 행동하여 극의 중심으로 가깝게 오르면 시작됩니다.

나는 두 벡터가 서로 가깝기 때문에 이것이 첫 번째 벡터 십자가에 의한 것이라고 판단했습니다. 현상에 대한 기술적 이름이 무엇인지 확신 할 수 없습니다. 첫 번째 벡터가 0,1,0이면 법선이 0, 1, 0 또는 0, -1, 0에 가까워 질 때 광란이 발생합니다.

이 문제에 대한 설명이 많이 있지만 작업 솔루션. 내가 가장 가까이 온 것은 여기에 있었다 : http://xboxforums.create.msdn.com/forums/p/13278/13278.aspx 그것은 'singularity'를 다루기 위해 그것이 발견되었을 때 다른 벡터를 사용한다고 언급한다. (행성 구가 구 좌표계로 투영 된 6 quadtrees에서 생성되기 때문에) 카메라가 행성 표면에 언제 생겨나는지 쉽게 판단 할 수 있지만 새로운 벡터로 전환하면 매우 눈에 띄는 순간이 있습니다.

여기에 현재 코드입니다 :

나는 triNormal이 극 얼굴 중 하나에있을 때 감지, 그러한 권리로 뭔가 다른 '기원'설정을 실험 한
Vector3 triNormal; //the current normal of the target vertex 
Vector3 origin = Vector3.Forward; 
Matrix orientation.Forward = origin; 

orientation.Up = triNormal; 
orientation.Right = Vector3.Cross(orientation.Up, orientation.Forward); 
orientation.Right.Normalize(); 
orientation.Forward = Vector3.Cross(orientation.Right, orientation.Up); 
orientation.Forward.Normalize(); 

. 카메라는 얼굴에 부착되면 제대로 작동하지만 교차 할 때 즉시 새로운 회전에 맞 춥니 다. 이는 참조 벡터가 방금 변경되었으므로 의미가 있지만 원활한 사용자 환경을 위해 제거해야합니다. 나는 궤도 카메라가 새로운 좌표계를 방해하기 위해 카메라의 편위를 상쇄하는 방법을 찾아 냈지만, 카메라가 현재 목표로하고있는 구의 위치에 따라 일정한 값이 아닌 것처럼 보입니다. 차이점이 무엇인지 계산할 수있는 방법이 확실하지 않습니다.

또한 XNA와 C#에서와 같이 오른쪽 좌표계를 사용하고 있습니다. 당신이 왜

답변

0

는 이해가 안 돼요이 :

이미 orientation.Right를 얻기 위해 이전 orientation.Forward을 사용했습니다
orientation.Forward = Vector3.Cross(orientation.Right, orientation.Up); 
orientation.Forward.Normalize(); 

.

어쨌든
(당신이 법선 벡터는 나는 당신이 그들을 정상화해야합니다 생각하지 않는다 "교차"하는 경우.), triNormal 대상 정점의 현재 정상이며, 카메라는 아래로보고하는 경우 , 당신이 가지고 있어야한다고 생각 :

orientation.Forward = -triNormal 
+0

아마 정규화가 필요하지 않습니다; 그게 문제가 될 수 없다는 것을 확인하는 것은 온전한 검사입니다. 두 번째 십자가를 지으면 많은 영향을 미치지 않습니다. 그것이 회전에서 회전 행렬을 생성하는 것으로 보이는 모든 다른 알고리즘에 있기 때문에 거기에 있습니다 - 나는 그것이 정확히 무엇을하는지 괜찮은 설명을 찾지 못했습니다. 전달 벡터를 -triNormal로 설정하면 작동하지 않습니다. 만약 내가 + triNormal로 설정된 위쪽 벡터와 함께 거기에두고, 행렬은 아무것도 표시되지 않습니다 무효로 보인다. 유일하게 설정된 경우와 동일합니다. – Stardreamer

+0

물론'Forward = -triNormal'을 설정하면'Up = triNormal'을 남겨 둘 수 없지만 다른 법선을 알아낼 수는 없습니다. – pinckerman