OpenSceneGraph osg :: Quat:形状不旋转

时间:2016-06-07 12:21:54

标签: rotation quaternions openscenegraph

我有一个小函数来创建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

时出错

1 个答案:

答案 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;