2011-08-22 57 views
2

我在3D Direct X地图应用程序(又名Google地球)中遇到问题 所有坐标均以米为单位的地心坐标(XYZ)。 地图绘制在地球椭球上方。 一切都很好,除了一个问题。 当我进行非常近距离的缩放(每像素约1米)时,D3DXVec3Unproject函数返回不准确的结果。我有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 - 窗口正中(+/- 0.5像素),vScreen.z = 0.99,但vBack与m_vecAt相差数十米。

再次签名,说明其他一切正常,所以我假设所有矩阵和其他数据都可以正确计算。

唯一一个我能想到的原因是单浮点算法计算精度不够。

请帮忙。

谢谢你们。 我解决了这个问题。投影矩阵的近平面太靠近相机。

+0

是的,那将是* easy *解决方案:P –

回答

0

浮点精度可能是一个原因,但您应该研究的另一个问题是您正在使用的椭球体或大地水准面模型的精度。在大多数通常的模型中预计10〜40米范围内的误差。更精确的模型是可用的,但它们要复杂得多。 Wikipedia article有一些很好的链接。

0

它不能是大地水准面,因为示例代码是通用的3D投影代码,它不知道它的任何内容。它必须是浮点不准确。对屏幕空间后面的点(例如z〜1)是否特别糟糕?由于您将立方体投影到立方体上,因此投影后面的空间覆盖了更多的世界空间,因此任何不准确性都更加明显。

+0

我同意,大地水准面问题在这里超出范围。但我如何解决我的问题? – shlem

+0

使用双精度浮点数学运算,对于使用单精度浮点数进行硬编码的纯DirectX代码,说起来容易。你可能想看看使用Ogre(www.ogre3d.org)这样的引擎,它可以配置为使用双打。或捏他们的向量和矩阵数学代码:P –

+0

谢谢你的帮助。我解决了这个问题。投影矩阵的近平面太靠近相机。 – shlem