2011-08-22 5 views
2

3D Direct X 맵 응용 프로그램 (Google 어스라고도 함)에 문제가 있습니다. 모든 좌표는 미터 단위의 지구 좌표 (XYZ)입니다. 지도는 지구 타원체 위에 그려져 있습니다. 모든 것이 좋지만 하나의 문제는 제외됩니다. D3DXVec3Unproject 함수는 매우 가까운 줌 (픽셀 당 약 1m)으로 이동하면 부정확 한 결과를 반환합니다. 나는 10-30 미터의 오차가 있고지도 패닝을 만들 수 없다.D3DXVec3Unproject가 C++에서 정확하지 않습니다.

D3DXVECTOR3 vScreen, vBack; 
D3DXVec3Project(&vScreen, &m_vecAt, &m_viewPort, &m_matProj, &m_matView, &m_matWorld);  
D3DXVec3Unproject(&vBack, &vScreen, &m_viewPort, &m_matProj, &m_matView, &m_matWorld); 

m_vecAt가 보는 포인트입니다 다음과 같이 조사 많은 문제를 분리. D3DXVec3Project는 vScreen.z = 0.99 인 정확한 vScreen (+/- 0.5 픽셀)의 vScreen을 반환하지만 vBack은 m_vecAt와 수십 미터가 다릅니다.

다시 말하자면, 모든 것이 작동하므로 모든 행렬 및 기타 데이터가 올바르게 계산됩니다.

제가 생각할 수있는 유일한 이유는 단일 부동 소수점 연산의 계산 정밀도가 충분하지 않기 때문입니다.

도와주세요.

감사합니다. 문제가 해결되었습니다. 투영 행렬의 가까운면이 카메라에 너무 가깝습니다.

+0

그래, 그 쉬운 해결책이 될거야 : P –

답변

0

부동 소수점 정밀도가 한 가지 이유 일 수 있지만 조사해야 할 다른 문제는 사용중인 타원체 또는 지오이드 모델의 정확도입니다. 대부분의 일반적인 모델에서 10 ~ 40 미터의 오차가 예상됩니다. 더 정확한 모델을 사용할 수 있지만 훨씬 더 복잡합니다. Wikipedia article에는 따라갈 수있는 좋은 링크가 있습니다.

0

예제 코드가 아무 것도 모르는 일반적인 3D 프로젝션 코드 인 경우 지오이드가 될 수 없습니다. 부동 소수점 부정확성이어야합니다. 화면 공간의 뒤쪽 (즉, z ~ 1)의 점에 특히 나쁜가? 절두체를 큐브에 투영하고 있기 때문에 투영 된 볼륨의 뒤쪽에 더 많은 세계 공간이 포함되므로 부정확성이 더욱 커집니다.

+0

그 지오이드 문제는 여기에 해당하지 않는다. 하지만 어떻게하면 내 문제를 해결할 수 있을까? – shlem

+0

단 정밀도 부동 소수점을 사용하도록 하드 코딩 된 순수 DirectX 코드에 비해 수행하기 쉬운 부동 소수점 연산을 사용하십시오. Ogre (www.ogre3d.org)와 같은 엔진을 사용하여 복식을 사용하도록 구성 할 수 있습니다. 또는 벡터 및 행렬 수학 코드를 집어 넣으십시오. P –

+0

도움 주셔서 감사합니다. 나는 그 문제를 해결했다. 투영 행렬의 가까운면이 카메라에 너무 가깝습니다. – shlem

관련 문제