2013-06-26 4 views
1

변환 (스케일링 + 회전 + 번역)을 설명하는 터치 스크린상의 제스처가 주어지면 손가락이지도상의 해당 지점에 끈적 거리지 않도록 뷰 매트릭과 목표 위치를 변경하고 싶습니다 카메라가보고있다. 이것은 기본적으로 Google지도의 동작입니다. 카메라의 방향 벡터 (안구 - 대상)가지도에 수직 일 때 이것은 쉽습니다. 그러나 나는 원근법이 바뀌고 더 이상 직각이 아닌 경우에이를 어떻게 풀 수 있는지 알아낼 수 없다.원근감있는지도에서 카메라 이동

특히 방향 뷰가 평면과 직각을 이루는 한 회전은 사소한 것입니다 (화면에서 회전되지 않은 중심과 뷰 매트릭스의 축에 대해 대상과 눈을 회전시킵니다). 직교성 속성이 손실 될 때마다 이것은 어려워졌습니다. 사실, 이런 경우 회전이 타원이되어 새로운 목표물을 배치 할 위치를 잃어 버리게됩니다. 아이디어가 있으십니까?

+0

왜 downvote? 흥미로운 질문입니다. –

+1

"손가락이지도에 끈적 거리지 말라"는 의미를 구체적으로 표현할 수 있습니까? –

+1

그가 의미하는 바는 그가 Google지도에서지도를 그리는 것입니다. 한 손가락으로 드래그하면지도에 손가락을 투영하는 것이 같은 위치에 그대로 유지됩니다. 카메라가 움직이기 때문에 (게). 카메라가 뷰 축을 중심으로 회전하고 확대/축소되기 때문에 두 손가락과 동일합니다.이것은 직각 투영에 대해 간단하지만지도가 기울이면 원근 투영을 위해 어떻게해야합니까? 이게 맞습니까, 영업일? 또는 여전히 직각 투영법을 사용하고 있으며지도 만 회전 시키시겠습니까? –

답변

0

근본적인 문제는 원근 투영에서 개체를 변환하는 것이 preserve lengths이 아니라는 것입니다. 화면에 투영 된 (A ', B') 세계 좌표계의 선분 (A, B)을 WCS에서 (A + v, B + v)로 변환하면 점 (A '+ v1', B '+ v2')을 얻게되며 일반적으로 v1 '은 v2와 같지 않습니다. 반대로 (A ', B')를 (A '+ v', B '+ v') 화면으로 변환하면 투영 된 번역 (A + v0, B + v1)을 찾을 수 없습니다. (A '+ v', B '+ v')에 대입하면, v0는 v1과 동일하다.

즉, 문제가 잘못되었다는 의미입니다. 고유 한 솔루션이 없습니다. 실제로, 직각 투영을 사용하면 항상지도를 z 방향으로 변환 할 수 있으므로 고유 한 해결책이 없습니다. 그러나 투영법이 해당 축을 따라 투영되기 때문에 문제가되지 않습니다. 따라서 직각 투영법을 사용하면 무한한 수의 솔루션 중 어느 것이 선택되었는지 명확하게 알 수 있습니다. z를 변경하지 않는 솔루션. 원근 투영을 사용하면 명확하지 않습니다. 이는 주로 사용자가 탐색 할 수있는 방법에 달려 있습니다.

번역 제스처를 다루는 가장 직관적 인 방법은 카메라를 회전시키는 것입니다. 따라서지도를 번역하는 대신보기 원점을 중심으로 회전합니다. 직각 투영과 동일하다고 주장 할 수 있습니다. 카메라를 원근 투영에서 직각 투영으로 점진적으로 변환하면 시야를 좁히는 동안 뷰 원점을 더 멀리 멀리 이동시키고 무한대에 가까워지면 뷰 원점을 중심으로 회전하면 뷰 방향에 직각 인 평행 이동이됩니다.

그러나 손가락이 완벽하게 끈적 거리지는 않습니다. 두 손가락으로 번역 제스처를하려면 화면을 곡선으로 표현해야합니다. 그러나 평면이므로 화면의 경계 근처에서 원근 왜곡이 커집니다 (거리가 점점 왜곡됩니다). 손가락을 끈적 거리지 않게하려면보기 축을 따라 확대/축소 또는 확대를 추가 할 수 있지만 반대 직관적 인 것은 아닙니다. 당신이 언급 한 타원 운동이라고 생각합니다. 그래서 나는 찰과상을 긁어 내고 손가락의 중심 C의 이동을 뷰 원점을 중심으로 한 회전, C를 통해 뷰 레이 주변을 회전하는 손가락 회전 및 확대/축소 (FOV 변경)에 대한 꼬집는 동작으로 매핑합니다. .

카메라가 원점을 중심으로 회전하는지 여부는 사용자가 내비게이션을 수행 할 수있는 방법에 대해 현명한 선택입니다. 말할 수 없습니다. 아마도 그렇지 않습니다.