rotationquaternionsopenscenegraph

OpenSceneGraph osg::Quat: shape not rotating


I have a small function to create a new instance of a WorldObject.

I want to use osg::ref_ptr<osg::PositionAttitudeTransform> for translation and rotation but there is a problem I can't figure out.

I use setTranslation() with a Vec3 which works very well. But the Quat with makeRotation() just does nothing.

Here is the code:

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

I tried rotation = {90,0,0} (degrees) and rotation = {1,0,0} (radians) but both have no effect. Is there an mistake in how the code is using the Quat?


Solution

  • The rotation method you are using works with radians.
    If you want to rotate 90 degrees around the X axis, you need to call:

    q.makeRotate(osg::PI_2, 1, 0, 0 );
    // or the equivalent
    q.makeRotate(osg::PI_2, osg::X_AXIS);
    

    Keep in mind that every call to makeRotate will reset the full quaternion to the given rotation. If you're trying to concatenate several rotations, you have to multiply the corresponding quaternions.
    For instance:

    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;