|
问题帖子为“大坐标模型抖动问题”,经过向论坛发帖询问,终于把抖动问题解决了,这里我简单总结分享一下。
在我看来抖动原因主要可能有以下几点:
1、更新摄像机viewmatrix顺序
2、float精度问题
3、数据源问题
4、数据是否每帧有数据
解决办法:
1、首先针对 跟踪摄像机 的viewMatrix,要在我们更新 跟踪节点 位置状态之后在计算更新,否则你先计算了viewMatrix,但是你的viewMatrix的位置是上一次更新 跟踪节点 的相关位置,当前帧 跟踪节点 位置已经变化,这样看起来就是抖动的方向在模型前进方向前后来回抖动。这里更新 跟踪节点 的位置时,你最好使用updataCallback更新,如果是EventHandler中更新,那么也会有抖动,因为EventHandler是不稳定的,你操作键盘鼠标多了在同一帧就会多次更新EventHandler。
2、float精度不够,就是用多个MatrixTransform级联,比如10个MatrixTransform, ScenceRoot->MatrixTransform[0]->MatrixTransform[1]->.....->MatrixTransform[9]->modelMatrixTransform,这样的话如果你的坐标位置是pos=(-1321996.5812316998,5336824.9109224305,3223085.4500543983),那你可以把MatrixTransform[0-9]->setMatrix(osg::Matrix::translate(pos/10.0)),只在最后一个modelMatrixTransform设置你这个模型的各种旋转即可,这样就解决了多个MatrixTransform分担精度的问题。
3、对于数据源的问题,我们可以程序内部或者外部不断产生一个单方向自增的数据,然后设置到模型位置,看是否抖动,如果抖动就是你前面1和2可能没合适,如果不抖动那么你再把仿真数据替换上,看是不是仿真数据本身就是抖动的,如果仿真数据自身就抖动那么让相关人员修改吧。
4、到达这个问题基本上你的抖动已经不是抖动了,而是数据可能每隔100毫秒或者更加长的时间才有一次更新,那么看起来就是一卡一卡的,解决办法是修改数据产生的时间间隔步长,或者就是自己接收到数据后做插值。
我能遇到的和能想到的就这么多了,希望对后面遇到相关问题的人能够有所帮助,同时如果哪里有错误希望大家指出。
|
|