2016-06-07 254 views
0

我有一個小小的功能來創建一個WorldObject的新實例。osg :: Quat不旋轉

我想用

OSG :: ref_ptr < OSG :: PositionAttitudeTransform>

的平移和旋轉但我無法弄清楚的一個問題。

我使用setTranslation與Vec3女巫工作很vell。 但是,使用旋轉方式的Quat什麼都不做。

還有就是代碼:

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}(弧度),但既沒有任何效果。

使用四元組是否存在錯誤?

Dropye

回答

1

您正在使用的旋轉方法適用於弧度。
如果你想繞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;