OpenSceneGraph osg::Quat: 形状不旋转

OpenSceneGraph osg::Quat: shape not rotating

我有一个小函数可以创建 WorldObject 的新实例。

我想使用 osg::ref_ptr<osg::PositionAttitudeTransform> 进行平移和旋转,但有个问题我想不通。

我将 setTranslation()Vec3 一起使用,效果很好。但是 QuatmakeRotation() 什么都不做。

代码如下:

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;
}

我尝试了 rotation = {90,0,0}(度)和 rotation = {1,0,0}(弧度),但都没有效果。代码使用 Quat 的方式是否有错误?

您使用的旋转方法适用于弧度。
如果要绕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;