D3DXVec3Unproject在c++中是不准确的

D3DXVec3Unproject is inaccurate in C++

本文关键字:不准确 c++ D3DXVec3Unproject      更新时间:2023-10-16

我有一个问题在我的3D直接X地图应用程序(又名谷歌地球)所有坐标都以地心为中心(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像素)。z = 0.99,但vBack与m_vecAt相差几十米

再次标记,其他一切都可以工作,所以我假设,所有矩阵和其他数据都是正确计算的。

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

请帮助。

谢谢大家。我解决了这个问题。投影矩阵近平面离摄像机太近

float的精度可能是一个原因,但您应该调查的另一个问题是您正在使用的椭球体或大地水准面模型的精度。在大多数常用模型中,误差预计在10~40米范围内。更精确的模型是可用的,但它们要复杂得多。维基百科有一些很好的链接。

它不可能是大地水准面,因为示例代码是通用的3D投影代码,对它一无所知。必须是浮点误差。对于屏幕后方的点(如z ~ 1)是否特别糟糕?因为你将一个截锥体投射到一个立方体上,投影体的背面覆盖了更多的世界空间,所以任何不准确的地方都更加明显。