一、模型转动
//矩阵变换
osg::ref_ptr<osg::Node> MatrixOpation()
{
osg::ref_ptr<osg::Group> group= new osg::Group;
osg::ref_ptr<osg::MatrixTransform> maxT= new osg::MatrixTransform;
osg::ref_ptr<osg::MatrixTransform> maxTsub1= new osg::MatrixTransform;
osg::ref_ptr<osg::Node> node= osgDB::readNodeFile("robot.osg");
//模型沿着Z轴转动
maxTsub1->addChild(node.get());
maxTsub1->setMatrix(osg::Matrix::translate(5.0,0.0,0.0));
maxT->addChild(maxTsub1);
//回调函数,使用路径回调
//在模型渲染的过程中,也就是最后一步:viewer.run(),通过回调函数进行相关事件的调用
maxT->setUpdateCallback(new osg::AnimationPathCallback(osg::Vec3(5.0,0.0,0.0),osg::Z_AXIS,1.0));
group->addChild(maxT);
group->addChild(node.get());
return group;
}二、模型控制类实现模型的平移、旋转、缩放等操作
1.NodeMatrixTransform类
#include <osg/MatrixTransform>
#include <osg/Node>
#include <osg/BoundingSphere>
class NodeMatrxiTransform : public osg::MatrixTransform
{
public:
NodeMatrxiTransform(void);
~NodeMatrxiTransform(void);
public:
/**设置当前模型转动方式*/
void rotating(const osg::Vec3d &pivot, const osg::Vec3d &axis, float angularVelocity);
/**旋转模型*/
void toRotate(const osg::Matrix &mat);
/**旋转模型*/
void toRotate(float angle, const osg::Vec3f &axis);
/**缩放模型*/
void toScale(const osg::Matrix &mat);
/**缩放模型*/
void toScale(double &lel);
/**addsChild方法*/
void addsChild(osg::Node *node);
/**将模型移到目的点*/
void toPosition(osg::Vec3d &pos);
/**得到模型当前的位置*/
osg::Vec3d getPosition();
/**限制模型大小*/
void adapt(osg::BoundingSphere &sps);
/**限制模型大小*/
void adapt(osg::Node *node);
private:
osg::ref_ptr<osg::MatrixTransform> pat;
osg::BoundingSphere ps;
osg::Node * pnode;
float level;
osg::Vec3d position;
};2. NodeMatrixTransform.cpp文件
#include "nodematrxitransform.h"
#define NODE_MATRIX __declspec(dllexport)
NodeMatrxiTransform::NodeMatrxiTransform(void)
{
pat = new osg::MatrixTransform;
addChild(pat.get());
level = 1.0;
position = osg::Vec3d(0, 0, 0);
}
NodeMatrxiTransform::~NodeMatrxiTransform(void)
{
}
/**设置当前模型转动方式*/
void NodeMatrxiTransform::rotating(const osg::Vec3d &pivot, const osg::Vec3d &axis, float angularVelocity)
{
setUpdateCallback(new osg::AnimationPathCallback(pivot, axis, angularVelocity));
}
/**旋转模型*/
void NodeMatrxiTransform::toRotate(const osg::Matrix &mat)
{
pat->setMatrix(mat);
}
/**旋转模型*/
void NodeMatrxiTransform::toRotate(float angle, const osg::Vec3f &axis)
{
pat->setMatrix(osg::Matrix::rotate(angle, axis));
}
/**缩放模型*/
void NodeMatrxiTransform::toScale(const osg::Matrix &mat)
{
pat->setMatrix(mat);
}
/**缩放模型*/
void NodeMatrxiTransform::toScale(double &lel)
{
pat->setMatrix(osg::Matrix::scale(lel, lel, lel));
}
/**addsChild方法*/
void NodeMatrxiTransform::addsChild(osg::Node *node)
{
pat->addChild(node);
pnode = node;
ps = node->getBound();
osg::notify(osg::NOTICE)<<ps.center().x() << " " <<ps.center().y() << " " <<ps.center().z() << std::endl;
}
/**将模型移到目的点*/
void NodeMatrxiTransform::toPosition(osg::Vec3d &pos)
{
osg::Vec3d cps;
cps.set(-ps.center().x()*level, -ps.center().y()*level, -ps.center().z()*level);
pat->setMatrix(osg::Matrix::translate(cps)*osg::Matrix::translate(pos));
position = pos;
}
/**限制模型大小*/
void NodeMatrxiTransform::adapt(osg::BoundingSphere &sps)
{
float level = sps.radius()/ps.radius();
pat->setMatrix(osg::Matrix::scale(level, level, level));
}
/**限制模型大小*/
void NodeMatrxiTransform::adapt(osg::Node * node)
{
osg::BoundingSphere sps = node->getBound();
level = sps.radius()/ps.radius();
pat->setMatrix(osg::Matrix::scale(level, level, level));
}
/**得到当前的位置*/
osg::Vec3d NodeMatrxiTransform::getPosition()
{
return position;
}3. 导出dll
TEMPLATE = lib
DEFINES += NODE_MATRIXTRANSFORM------------------------------------------------------------------
//导出dll库
#if defined(NODE_MATRIXTRANSFORM)
# define NODE_MATRIXTRANSFORM_EXPORT Q_DECL_EXPORT
#else
# define NODE_MATRIXTRANSFORM_EXPORT Q_DECL_IMPORT
#endif
4. 引用dll 使用其方法
//pro文件
win32:DEPENDPATH +=C:/OpenSceneGraph/include \
$$PWD \
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/ -lNodeMatrixelse:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/ -lNodeMatrixdelse:unix:!macx: LIBS += -L$$PWD/ -lNodeMatrix
//cpp文件
#include "./nodematrixtransform.h"
osg::ref_ptr<NodeMatrxiTransform> nodeT= new NodeMatrxiTransform;
nodeT->addsChild(osgDB::readNodeFile("Cow.osg"));
nodeT->toPosition(osg::Vec3d(10.0, 0.0, 0.0));
nodeT->adapt(node.get());