使用OSG时遇到的问题
问题
在使用OSG写代码时,除去语法错误与逻辑错误,总会遇到一些奇奇怪怪的问题。在这里本人准备记录一下遇到的问题(不记录总是不长记性!)
矩阵操作的问题
之前自己练习osg,写了一个简易太阳系的demo。功能很简单:
- 中央有一个太阳,会自转,可设置半径与自转速度;
- 周围通过矩阵操作增加一些轨道线,可设置半径;
- 然后再增加一些星球,可以设置星球名称、星球半径、轨道半径、自转速度与公转速度。
- 通过设置材质,增加贴图,改变光照等,使得场景中只有太阳发光,各星球背朝太阳的部分没有光照;
- 通过抄袭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