【OSG细节实现】节点围绕位于axisPos平行于axis的轴进行旋转

//绕着与axis平行的任意轴旋转
    void rotate(const std::string& name, float angle, osg::Vec3 axisPos, osg::Vec3 axis)
    {
        AniNodeMap::iterator itr = _anMap.find(name);
        if(itr != _anMap.end())
        {
            osg::Quat quat;
            quat.makeRotate(angle, axis);

            //先移动到axis,旋转,然后再移动到axisPos
            osg::Matrix matrix = osg::Matrix::translate(axisPos) * 
                osg::Matrix::rotate(quat) * 
                osg::Matrix::translate(-axisPos);

            if(itr->second)
            {
                osg::Matrix matrix1 = dynamic_cast<osg::MatrixTransform*>(itr->second)->getMatrix();
                matrix1 *= matrix;
                dynamic_cast<osg::MatrixTransform*>(itr->second)->setMatrix(matrix1);
            }
        }
    }

posted on 2014-04-01 11:34  programmervicky  阅读(935)  评论(0)    收藏  举报

导航