D3DXVec3Unproject在c++中是不准确的
D3DXVec3Unproject is inaccurate in C++
我有一个问题在我的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)是否特别糟糕?因为你将一个截锥体投射到一个立方体上,投影体的背面覆盖了更多的世界空间,所以任何不准确的地方都更加明显。
相关文章:
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- GDB 断点在 Mac 上是不准确的
- cout 打印不准确的结果,printf 打印准确的结果
- C++中的 Json:将数字解析为字符串以避免浮点不准确
- 为什么OpenCV Templete匹配函数根本不准确
- 控制台分辨率程序不准确
- 来自 cmath 库的 asin() 函数返回不准确的值
- TBB Parallel_用于计数,增量变量不准确
- LIBCURL:网络上传下载速度的输出不准确
- GPROF分析工具是不准确的执行时间
- 使用FP:快速导致错误的VC 结果(不仅仅是不准确)结果 - 这是编译器错误
- GPU驱动程序中的Vulkan纹理映射不准确
- CPP重新排序示例,而计时器不准确
- 浮点数的不准确导致计算错误
- 是什么原因导致字符数从cin不准确和非常大
- LAPACKE特征解不准确.如何改进它
- C++,Lapack-Cholesky分解实现结果不准确
- 有错误或不准确的二叉搜索
- 如果浮点数和双倍数不准确,银行如何进行涉及货币的准确计算
- 为什么助推:几何地理Vincenty绕赤道的距离不准确