【OSG】使用OSG时遇到的问题

本文记录了使用OpenSceneGraph(OSG)时遇到的三个问题:1) 矩阵操作错误导致的自转轨迹问题;2) 将SolarSystem节点误设为Geode类型导致的保存文件异常;3) Vec3与Vec3d在计算法线时产生的困扰。通过解决这些问题,加深了对OSG的理解。
摘要由CSDN通过智能技术生成

问题

在使用OSG写代码时,除去语法错误与逻辑错误,总会遇到一些奇奇怪怪的问题。在这里本人准备记录一下遇到的问题(不记录总是不长记性!)

矩阵操作的问题

之前自己练习osg,写了一个简易太阳系的demo。功能很简单:

  1. 中央有一个太阳,会自转,可设置半径与自转速度;
  2. 周围通过矩阵操作增加一些轨道线,可设置半径;
  3. 然后再增加一些星球,可以设置星球名称、星球半径、轨道半径、自转速度与公转速度。
  4. 通过设置材质,增加贴图,改变光照等,使得场景中只有太阳发光,各星球背朝太阳的部分没有光照;
  5. 通过抄袭osg源码,搞了一个天空穹,此处代码较长没有深究,加了只是为了效果更好看。忽略

本来是一个比较简单的东西,但在设置自转时,轨迹和想象中的不一样,本以为只要一个矩阵就可以完成:

	maxPlanetZ->addChild(planet);//自转矩阵
	//planetTrackRadius是轨道半径,z_planetSpeed是自转速度
	maxPlanetZ->setUpdateCallback(new osg::AnimationPathCallback(
		osg::Vec3(planetTrackRadius, 0.0, 0.0), osg::Z_AXIS, z_planetSpeed));

后来发现AnimationPathCallback这个函数的第一个参数并不是代表节点的位移,而是代表着第二个参数的轴的位移,最后的结果是星球绕着Vec3(planetTrackRadius, 0.0, 0.0)这个点的z轴旋转(可以想象一下月球绕着地球转动的样子)。大致画一下:
大致就这个意思
当明白了“靠不住”第一个参数时,问题就简单了,自转直接设置两个矩阵去完成,一个位移矩阵,一个旋转矩阵(事实上在学习《osg72讲》的时候,作者已经讲到了这块,奈何自己没有记住,所以现在记录一下)。这里还需要注意一下,一定要先位移,再旋转,否则轨迹还会有问题。自转设置好之后,再加上公转的矩阵就ok了:

	//行星自转变换矩阵
	//位移矩阵
	maxPlanetZ1->addChild(planet);
	maxPlanetZ1->setMatrix(osg::Matrix::translate(planetTrackRadius, 0.0, 0.0));
	//旋转矩阵
	maxPlanetZ2->addChild(maxPlanetZ1);
	maxPlanetZ2->setUpdateCallback(new osg::AnimationPathCallback(
		osg::Vec3(planetTrackRadius
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值