您的位置:首页 > 编程语言 > C语言/C++

OSG 模型添加(含自己画的模型,已有模型),对添加的模型做平移 缩放等。

2013-11-19 10:51 411 查看
添加已有模型 

在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();

}

效果如图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  osg 模型添加 源码 c++