OSG中的节点
1.多个模型添加到一个场景中去
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osg/Node>int main(void)
{
osgViewer::Viewer viewer;
osg::Group * root = new osg::Group();
root->addChild(osgDB::readNodeFile("sofa.osg"));
root->addChild(osgDB::readNodeFile("cow.osg"));
viewer.setSceneData(root);
viewer.realize();
viewer.run();
return 0;
}
出现下面效果:
删除节点:
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osg/Node>
int main(void)
{
osgViewer::Viewer viewer;
osg::Group * root = new osg::Group();
root->addChild(osgDB::readNodeFile("sofa.osg"));
osg::Node * cow = osgDB::readNodeFile("cow.osg");
root->removeChild(cow);
viewer.setSceneData(root);
viewer.realize();
viewer.run();
return 0;
}
添加节点:
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osg/Node>
int main(void)
{
osgViewer::Viewer viewer;
osg::Group * root = new osg::Group();
root->addChild(osgDB::readNodeFile("sofa.osg"));
osg::Node * cow = osgDB::readNodeFile("cow.osg");
root->addChild(cow);
viewer.setSceneData(root);
viewer.realize();
viewer.run();
return 0;
}
隐藏节点:
仅仅隐藏物体,其真实还是占内存的
node->setNodeMask()
可以设置隐藏与显示,node->setNodeMask(0x0)
表示隐藏,node->setNodeMask(1)
表示显示。
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osg/Node>
int main(void)
{
osgViewer::Viewer viewer;
osg::Group * root = new osg::Group();
osg::Node * osg = osgDB::readNodeFile("sofa.osg");
root->addChild(osg);
root->addChild(osgDB::readNodeFile("cow.osg"));
osg->setNodeMask(0x0);
viewer.setSceneData(root);
viewer.realize();
viewer.run();
return 0;
}
结果如下:sofa被隐藏,只有cow显示
模型矩形的变换
模型的移动、旋转、缩放其实都是对矩阵进行操作,矩阵可以当作一个特殊的结点加入到组结点中。
通过osg::MatrixTransform
定义变换矩阵,
通过setMatrix(osg::Matrix::translate(x, y, z))
实现模型移动,
通过setMatrix(osg::Matrix::scale(x, y, z))
实现模型缩放,
通过setMatrix(osg::Matrix::rotate(x, y, z))
实现模型旋转。
osg的坐标轴,默认向上是Z,向右是X,向内是Y
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
# include <osg/Node>
# include <osg/MatrixTransform>
int main(void)
{
osgViewer::Viewer viewer;
osg::ref_ptr<osg::Group> root = new osg::Group;
osg::ref_ptr<osg::Node> sofa = osgDB::readNodeFile("sofa.osg");
osg::ref_ptr<osg::MatrixTransform> trans = new osg::MatrixTransform;
trans->setMatrix(osg::Matrix::translate(0, 0, 2));
trans->addChild(sofa.get());
osg::ref_ptr<osg::MatrixTransform> scale = new osg::MatrixTransform;
scale->setMatrix(osg::Matrix::scale(0.5, 0.5, 0.5) * osg::Matrix::translate(0, 0, -2));
scale->addChild(sofa.get());
osg::ref_ptr<osg::MatrixTransform> rot = new osg::MatrixTransform;
rot->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians(45.0), 1, 0, 0) * osg::Matrix::scale(0.5, 0.5, 0.5) * osg::Matrix::translate(4, 0, -2));
rot->addChild(sofa.get());
root->addChild(sofa.get());
root->addChild(trans.get());
root->addChild(scale.get());
root->addChild(rot);
viewer.setSceneData(root.get());
viewer.realize();
viewer.run();
return 0;
}
根据自己给的角度或长度进行平移,旋转,缩放