查看: 1689|回复: 8

场景模型抖动

[复制链接]

该用户从未签到

发表于 2010-8-17 22:01:45 | 显示全部楼层 |阅读模式
本帖最后由 buaahc 于 2010-8-18 08:49 编辑

三维场景中卫星围绕地球转动
卫星上面有一个太阳敏感器,太敏是卫星节点的子节点,仿真程序给卫星节点发送数据,太敏将跟随卫星一起运动
然后再在场景中加一根光圆柱模型节点表示太阳光照射方向(这个光圆柱节点自己是一个独立节点,不依附于任何其它节点)
当然太阳光的方向是始终不变的,即此光柱节点的方向是始终不变的
要求是:这跟光柱节点的一端要始终跟在太敏上,即光圆柱节点位置不断改变,方向不变,实际上就是把运动中太敏在世界坐标系中的坐标赋给这个光柱模型节点即可,(我用的方法是:太敏子节点相对卫星父节点的安装矩阵matrix1*卫星节点在世界坐标系的位置矩阵matrix2,然后再getTrans(),以得到太敏在世界坐标系的坐标,然后赋给光柱节点)现在光柱节点已经能够跟随着太敏一起运行了,但是这个跟随太敏的光柱模型节点在场景中一直不断的抖动晃动。。。这是什么原因?
非常非常期待您的解答,非常感谢~~

该用户从未签到

发表于 2010-8-18 09:00:41 | 显示全部楼层
我猜测这是否是您的位置坐标过大造成的,注意OpenGL对于超出float类型有效数字范围的数据,其显示结果会有浮点数误差。正确的解决方法是使用矩阵嵌套,在OSG中就是使用多级Transform节点作为父节点

该用户从未签到

 楼主| 发表于 2010-8-18 09:05:40 | 显示全部楼层
恩,我觉得也是这个原因,所以ARRAY我全部是改成了OSG::VEC3D的形式 可是还是抖动。。。
(正确的解决方法是使用矩阵嵌套,在OSG中就是使用多级Transform节点作为父节点)能具体说一下么,看不懂。。。

该用户从未签到

发表于 2010-8-18 09:20:50 | 显示全部楼层
我全部是改成了OSG::VEC3D的形式
很遗憾这样没有作用,因为这个浮点误差是显卡硬件的特性,而非OSG或OpenGL的。

MatrixTransform1
  |
MatrixTransform2
  |
……
  |
YourNode

只要每级的Transform节点变换值都不超出有效数字,并且结果矩阵能够将YourNode变换到正确位置,就不会产生抖动了

该用户从未签到

发表于 2010-8-18 09:22:35 | 显示全部楼层
osg::MatrixTransform* root = new osg::MatrixTransform;
root->setMatrix( osg::Matrix::translate( relativeCoordinate ) );

root->addChild( someNode );

该用户从未签到

 楼主| 发表于 2010-8-18 10:04:51 | 显示全部楼层
MatrixTransform1->setMatrix(...);
MatrixTransform2->setMatrix(...);
MatrixTransform2->addChild(MatrixTransform1);
MatrixTransform2->addChild(node);
可是模型现在一动不动了。。。模型在场景原点中心。。。

该用户从未签到

发表于 2010-8-18 12:34:28 | 显示全部楼层
MatrixTransform2->addChild(MatrixTransform1);
MatrixTransform2->addChild(node);
很显然您这里的逻辑存在问题

该用户从未签到

 楼主| 发表于 2010-8-18 12:58:28 | 显示全部楼层
那应该怎样呢,实在是做不出来了,刚学才一个月左右。。。。

该用户从未签到

发表于 2010-8-18 15:28:34 | 显示全部楼层
这和学习时间没有关系,您不觉得这里的逻辑有问题吗?难道这里不应该是:
  1. MatrixTransform1->addChild(MatrixTransform2);
  2. MatrixTransform2->addChild(node);
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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