本帖最后由 wangq 于 2011-7-11 08:59 编辑
程序运行效果
想实现这样一个效果:模型原始状态为A,在A的基础上绕X轴旋转得到状态B,在A的基础上绕Z轴旋转得到状态C,最后想得到的状态效果D为B与C的合成。 现在用的是osg:o
sitionAttitudeTransform 这个类 osg::ref_ptr<osg::PositionAttitudeTransform> matrixst = new osg::PositionAttitudeTransform; matrixst->setAttitude(osg:uat(osg::PI_2, osg::X_AXIS));
// (1) matrixst->setAttitude(osg::Quat(osg::PI_2, osg::Z_AXIS));
//(2) 但是看程序运行效果,好像只有 (2) 起作用了,(2)将(1)屏蔽了。 换一种写法: osg::ref_ptr<osg::PositionAttitudeTransform> matrixnd = new osg::PositionAttitudeTransform; matrixnd->setAttitude(osg::Quat(osg::PI_2, osg::X_AXIS) * osg::Q- osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
- osg::ref_ptr<osg::Group> root = new osg::Group;
- osg::ref_ptr<osg::PositionAttitudeTransform> matrixst = new osg::PositionAttitudeTransform;
- osg::ref_ptr<osg::PositionAttitudeTransform> matrixnd = new osg::PositionAttitudeTransform;
- osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("dan.ive");
- //////////////////////////////////////////////////////////////////////////////////////////////////
- matrixst->addChild(node);
- matrixst->setPosition(osg::Vec3(20., 0., 0.));
- matrixst->setAttitude(osg::Quat(osg::PI_2, osg::X_AXIS));
- matrixst->setAttitude(osg::Quat(osg::PI_2, osg::Z_AXIS));
- //////////////////////////////////////////////////////////////////////////////////////////////////
- matrixnd->addChild(node);
- matrixnd->setPosition(osg::Vec3(40., 0.,0. ));
- matrixnd->setAttitude(osg::Quat(osg::PI_2, osg::X_AXIS) * osg::Quat(osg::PI_2, osg::Z_AXIS));
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- root->addChild(node);
- root->addChild(matrixst);
- root->addChild(matrixnd);
- viewer->setSceneData(root);
- viewer->run();
复制代码 uat(osg::PI_2, osg::Z_AXIS)); 这种效果好像是这样的:模型绕X轴得到状态B,然后在状态B的基础上绕Z轴旋转得到状态C,也不是我希望达到的。 上面两种效果都达不到我想要的,请问OSG如何才能实现旋转的合成呢?请大侠用代码解释 |