OpenSceneGraph osg::Quat: 形状不旋转
OpenSceneGraph osg::Quat: shape not rotating
我有一个小函数可以创建 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;
}
我尝试了 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;
我有一个小函数可以创建 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;
}
我尝试了 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;