LiveForMyself 发表于 2016-11-17 10:46:00

OSG绕Z轴旋转总是世界坐标系?烦请大神看一下,就一下下

想实现的效果:坦克绕物体坐标系PITCH,YAW,ROLL正常旋转
但现实的效果:坦克绕物体坐标系PITCH,YAW正常,ROLL总是以世界坐标系来旋转
使用的是MatrixTransform,
也用PositionAttitudeTransform试过,也是一样的效果,后来我用一个MatrixTransform表示位移,另一个表示旋转,还是无法解决问题

节点结构
MatrixTransform *tankLocalMT
----Node *tank
变量
doublepitch,yaw,roll;
Quat_rotate;
Vec3d_translate;
Vec3d_scale;

烦请大神看一下,困扰很久了
代码:

Matrix tankData::setState()
{
        _rotate.makeRotate(
                osg::DegreesToRadians(pitch), Vec3d(1, 0, 0),
                osg::DegreesToRadians(yaw), Vec3d(0, 1, 0),
                osg::DegreesToRadians(roll), Vec3d(0, 0, 1)
                );
        returnMatrix(
                Matrix::scale(_scale)*
                Matrix::rotate(_rotate)*
                Matrix::translate(_translate)
                );
}

//向前移动
void tankData::moveForward()
{
        _translate=_translate+(distance*flySpeed);
        tankLocalMT->setMatrix(setState());
}


//朝正后方移动
void tankData::moveBack()
{
        _translate=_translate-(distance*flySpeed);
        tankLocalMT->setMatrix(setState());
}
//Roll旋转
void tankData::turnRoll()
{
        roll++;
        if (roll == 180) roll = -180;
        tankLocalMT->setMatrix(setState());
       
}
void tankData::turnRoll_()
{
        roll--;
        if (roll == 180) roll = -180;
        tankLocalMT->setMatrix(setState());
}

//Pitch旋转
void tankData::turnPitch()
{
        if (pitch < 90)
        {
                pitch++;
                tankLocalMT->setMatrix(setState());
        }
}
void tankData::turnPitch_()
{
        if (pitch >- 90)
        {
                pitch--;
                tankLocalMT->setMatrix(setState());
        }
       
}
//Yaw旋转
void tankData::turnYaw()
{
        yaw++;
        if (yaw == 180) yaw = -180;
        tankLocalMT->setMatrix(setState());
}
void tankData::turnYaw_()
{
        yaw--;
        if (yaw == 180) yaw = -180;
        tankLocalMT->setMatrix(setState());
}

zjw 发表于 2020-6-17 20:52:30

楼主你好,请问问题解决了吗?我也遇到了这个问题,setMatrix(osg::Matrix::rotate(d_Rotation, osg::X_AXIS, d_Rotation, osg::Z_AXIS, 0, osg::Y_AXIS)*osg::Matrix::translate(d_Position));只有第一个参数的轴是是物体坐标系的轴,后面两个轴既不是物体坐标系,也不是世界坐标系,怀疑可能受到第一个旋转的影响,把轴也转了,不知道怎么修正
页: [1]
查看完整版本: OSG绕Z轴旋转总是世界坐标系?烦请大神看一下,就一下下