我有一个小函数来创建WorldObject
的新实例。
我想使用osg::ref_ptr<osg::PositionAttitudeTransform>
进行翻译和轮播,但有一个问题我无法理解。
我将setTranslation()
与Vec3
一起使用,效果非常好。但Quat
只有makeRotation()
无效。
以下是代码:
osg::ref_ptr <osg::PositionAttitudeTransform> getWorldObjectClone(const char* name, osg::Vec3 position = osg::Vec3(0, 0, 0), osg::Vec3 rotation = osg::Vec3(0, 0, 0))
{
osg::ref_ptr <osg::PositionAttitudeTransform> tmp = new osg::PositionAttitudeTransform;
osg::Quat q(0, osg::Vec3(0, 0, 0));
tmp = dynamic_cast<osg::PositionAttitudeTransform*>(WorldObjects[name]->clone(osg::CopyOp::DEEP_COPY_ALL));
tmp->setPosition(position);
q.makeRotate(rotation.x(), 1, 0, 0);
q.makeRotate(rotation.y(), 0, 1, 0);
q.makeRotate(rotation.z(), 0, 0, 1);
tmp->setAttitude(q);
return tmp;
}
我尝试了旋转= {90,0,0}(度)和旋转= {1,0,0}(弧度)但两者都没有效果。代码如何使用Quat
?
答案 0 :(得分:3)
您使用的旋转方法适用于弧度 如果要围绕X轴旋转90度,则需要调用:
q.makeRotate(osg::PI_2, 1, 0, 0 );
// or the equivalent
q.makeRotate(osg::PI_2, osg::X_AXIS);
请记住,对makeRotate的每次调用都会将完整的四元数重置为给定的旋转。如果您尝试连接多个旋转,则必须将相应的四元数相乘 例如:
osg::Quar xRot, yRot;
// rotate 90 degrees around x
xRot.makeRotate(osg::PI_2, osg::X_AXIS);
// rotate 90 degrees around y
yRot.makeRotate(osg::PI_2, osg::Y_AXIS);
// concatenate the 2 into a resulting quat
osg::Quat fullRot = xRot * yRot;