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;  

}  

根据自己给的角度或长度进行平移,旋转,缩放



猜你喜欢

转载自blog.csdn.net/qq_36190177/article/details/80083117