#pragma once
#include "../Common.h"
class NodeMatrix : public osg::MatrixTransform {
public:
NodeMatrix();
~NodeMatrix();
public:
/**
第一个参数:坐标原点
第二个参数:坐标轴
第三个参数:旋转角度
*/
void rotating(const osg::Vec3&pivot, const osg::Vec3&axis, float angularVelocity);
/************************************************************************/
/* 旋转模型 */
/************************************************************************/
void toRotate(float angle, const osg::Vec3&axis);
/************************************************************************/
/*缩放模型 */
/************************************************************************/
void toScale(const float&lev);
/************************************************************************/
void addMyChild(osg::ref_ptr<osg::Node> node);
/************************************************************************/
void toPosition(osg::Vec3&pos);
//限制模型的大小,和参数中的模型是一样的
void adapt(osg::Node* node);
private:
osg::ref_ptr<osg::MatrixTransform> pat;
osg::BoundingSphere ps;
};
#include "NodeMatrix.h"
NodeMatrix::NodeMatrix() {
pat = new osg::MatrixTransform;
addChild(pat);
}
NodeMatrix::~NodeMatrix() {
}
void NodeMatrix::rotating(const osg::Vec3&pivot, const osg::Vec3&axis, float angularVelocity) {
setUpdateCallback(new osg::AnimationPathCallback(pivot, axis, angularVelocity));
}
void NodeMatrix::toRotate(float angle, const osg::Vec3&axis) {
pat->setMatrix(osg::Matrix::rotate(angle,axis));
}
void NodeMatrix::toScale(const float&lev) {
pat->setMatrix(osg::Matrix::scale(lev, lev, lev));
}
void NodeMatrix::addMyChild(osg::ref_ptr<osg::Node> node) {
pat->addChild(node.get());
ps = node->getBound();
osg::notify(osg::NOTICE) << "X:" << ps.center().x() << " Y:" << ps.center().y() << " Z:" << ps.center().z() << std::endl;
}
void NodeMatrix::toPosition(osg::Vec3&pos) {
osg::Vec3 cps;
cps.set(-ps.center().x(), -ps.center().y(), -ps.center().z());
pat->setMatrix(osg::Matrix::translate(cps)*osg::Matrix::translate(pos));
}
void NodeMatrix::adapt(osg::Node* node) {
osg::BoundingSphere bs = node->getBound();
float level = bs.radius() / ps.radius();
pat->setMatrix(osg::Matrix::scale(level, level, level));
}
使用:
osg::ref_ptr<osg::Group> nodeMatrix() {
osg::ref_ptr<osg::Group> root = new osg::Group;
osg::ref_ptr<osg::Node> n1 = osgDB::readNodeFile("xyz.osgt");
osg::ref_ptr<NodeMatrix> nm = new NodeMatrix;
nm->addMyChild(n1);
nm->rotating(osg::Vec3(0.0, 0.0, 0.0), osg::Z_AXIS, 1.0);
nm->toRotate(1.2, osg::Y_AXIS);
nm->toScale(2.0);
root->addChild(nm.get());
return root;
}