查看: 1379|回复: 3

关于地形漫游器

[复制链接]

该用户从未签到

发表于 2010-7-14 16:23:45 | 显示全部楼层 |阅读模式
这里谈谈我制作地形漫游器的方式,就是通过键盘鼠标的输入,改变相机的位置和视线方向。
也就是说,一个地形漫游器只要完成两件事就够了:
1、改变相机的位置
2、改变相机的朝向

这里多的疑问倒是没有,唯独对于“改变相机的位置”,由于地形一般都比较大,相机的位置有较大的活动空间(一个VPB地形,通常宽度都超过1e6的数量级,幅面非常大),这种情况下,通过漫游器的getInverseMatrix方法获取的相机矩阵,肯定会同时包含很大的数值(矩阵最后一行的平移参数)和很小的数值(旋转参数),这样的矩阵通常是很不利的,比如在矩阵相乘或者求逆的时候,会导致比较大的浮点误差。

我这里遇到的最大的误差,就在osgViewer::eventTraversal函数里面的那个“osg::Matrix matrix(osg::Matrix::inverse(localCameraVPW) * masterCameraVPW)”。虽然我现在一定程度上规避了这个问题,但是并没有根治,若地形的幅面继续增大,浮点误差仍然会出现。

这个浮点误差通常会导致漫游器颤抖,如何规避这个浮点误差呢?大伙儿有经验么?

该用户从未签到

 楼主| 发表于 2010-7-14 16:24:58 | 显示全部楼层
可以考虑将语句“osg::Matrix matrix(osg::Matrix::inverse(localCameraVPW) * masterCameraVPW)”中的矩阵全部改为使用osg::Matrixd,即使用double版本的矩阵,精度可以一定程度的提高,但是显然这样不是根治问题的办法。

该用户从未签到

发表于 2010-7-14 16:58:44 | 显示全部楼层
这个问题我以前再某本书上见过,矩阵运算始终存在这样的问题,貌似解决方法是通过一系列计算消除误差。你可以试试四元数或者欧拉角,当然这两个也有优点和缺点。

该用户从未签到

发表于 2010-7-14 22:06:59 | 显示全部楼层
我觉得您可以考虑变换坐标系,放在局部坐标系中来考虑
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表