添加已有模型
在osg中同时加入多个模型(A,B,C……),可通过Group->addChild(A)添加。然后再把group添加到viewer中就可以了
添加自定义模型
添加用户自定义模型,我使用函数osg::ref_prt<osg::Node> createSceneGraph() 自己画了一个模型,然后通过group->addChild(createSceneGraph().get());添加到场景里
平移,缩放,旋转
osg::ref_ptr<osg::Node> cow = osgDB::readNodeFile("cow.osg");
//上平移 5
osg::ref_ptr<osg::MatrixTransform> tran = new osg::MatrixTransform;
tran->setMatrix(osg::Matrix::translate(0,0,5));
tran->addChild(cow.get());
//缩放 0.5倍 右移8,上移5
osg::ref_ptr<osg::MatrixTransform> scale = new osg::MatrixTransform;
scale->setMatrix(osg::Matrix::scale(0.5,0.5,0.5)*osg::Matrix::translate(8,0,5));
scale->addChild(cow.get());
//旋转 平放30°
osg::ref_ptr<osg::MatrixTransform> rotate = new osg::MatrixTransform;
rotate->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians(30.0),1,1,1)*osg::Matrix::scale(0.5,0.5,.05)*osg::Matrix::translate(6,0,-5));
rotate->addChild(cow.get());
完整代码:
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Node>
#include <osg/Geometry>
#include <osg/Geode>
#include <osg/MatrixTransform>
//#include <osg/Group>
//自定义模型
osg::ref_ptr<osg::Node> createSceneGraph()
{
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
//画顶点
osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
geom->setVertexArray( v.get() );
v->push_back( osg::Vec3( -6.f, 0.f, -1.f ) );
v->push_back( osg::Vec3( -3.f, 0.f, -1.f ) );
v->push_back( osg::Vec3( -3.f, 0.f, 1.f ) );
v->push_back( osg::Vec3( -6.f, 0.f, 1.f ) );
//给颜色
osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
geom->setColorArray(c.get());
geom->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
c->push_back( osg::Vec4( 1.f, 0.f, 0.f, 1.f ) );
c->push_back( osg::Vec4( 0.f, 1.f, 0.f, 1.f ) );
c->push_back( osg::Vec4( 0.f, 0.f, 1.f, 1.f ) );
c->push_back( osg::Vec4( 1.f, 1.f, 1.f, 1.f ) );
// 为唯一的法线创建一个数组
osg::ref_ptr<osg::Vec3Array> n = new osg::Vec3Array;
geom->setNormalArray( n.get() );
geom->setNormalBinding( osg::Geometry::BIND_OVERALL );
n->push_back( osg::Vec3( 0.f, -1.f, 0.f ) );
// 由保存的数据绘制四个顶点的多边形
geom->addPrimitiveSet(new osg::DrawArrays( osg::PrimitiveSet::QUADS, 0, 4 ) );
// 向Geode 类添加几何体(Drawable)并返回Geode
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->addDrawable( geom.get() );
return geode.get();
}
int main()
{
osgViewer::Viewer viewer;
osg::ref_ptr<osg::Group> group = new osg::Group;
osg::ref_ptr<osg::Node> cow = osgDB::readNodeFile("cow.osg");
//上平移
osg::ref_ptr<osg::MatrixTransform> tran = new osg::MatrixTransform;
tran->setMatrix(osg::Matrix::translate(0,0,5));
tran->addChild(cow.get());
//缩放
osg::ref_ptr<osg::MatrixTransform> scale = new osg::MatrixTransform;
scale->setMatrix(osg::Matrix::scale(0.5,0.5,0.5)*osg::Matrix::translate(8,0,5));
scale->addChild(cow.get());
//旋转
osg::ref_ptr<osg::MatrixTransform> rotate = new osg::MatrixTransform;
rotate->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians(30.0),1,1,1)*osg::Matrix::scale(0.5,0.5,.05)*osg::Matrix::translate(6,0,-5));
rotate->addChild(cow.get());
group->addChild(osgDB::readNodeFile("robot.osg"));
group->addChild(createSceneGraph().get());
group->addChild(tran.get());
group->addChild(scale.get());
group->addChild(rotate.get());
viewer.setSceneData(group);
viewer.realize();
return viewer.run();
}
效果如图