OpenSceneGraph osg::Quat: форма не вращается

У меня есть небольшая функция для создания нового экземпляра 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?


person Dropye    schedule 07.06.2016    source источник


Ответы (1)


Используемый вами метод поворота работает с радианами.
Если вы хотите повернуть на 90 градусов вокруг оси X, вам нужно вызвать:

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;
person rickyviking    schedule 07.06.2016