D3DXVec3Unproject在C ++中不准确

时间:2011-08-22 20:02:36

标签: c++ directx

我的3D Direct X地图应用程序(又称Google Earth)存在问题 所有坐标均为地心(XYZ),单位为米。 地图绘制在地球椭球上方。 一切都很好,除了一个问题。 当我进行非常接近的缩放(每像素大约1米)时,D3DXVec3Unproject函数返回不准确的结果。我有一个10-30米的错误,无法进行地图平移。 许多调查分析了如下问题:

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相差数十米。

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

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

请帮忙。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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