第3课时《osg模型控制》

原创 2016年05月30日 11:38:53

一、结点基本操作

1.添加结点

  //OSG中使用 osg::Node  osg::Group 装载模型,Node是Group的父类,可以通过以下代码添加多个模型。
  osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
   osg::ref_ptr<osg::Group> root= new osg::Group;
  root->addChild(osgDB::readNodeFile("glider.osg"));
  root->addChild(osgDB::readNodeFile("osgcool.osgt"));
  viewer->setSceneData(root);
//注意:模型的的默认位置在原点,也就是场景的中间。

2. 删除结点

//可以通过removeChild和removeChildren方法删除结点,需要的参数为索引值或结点本身的指针。

   osg::ref_ptf<osg::Node> * glider = osgDB::readNodeFile("glider.osg");
   root->addChild(osgDB::readNodeFile("osgcool.osgt"));
    osg::Node * glider = osgDB::readNodeFile("glider.osg");
    root->addChild(glider);
    root->addChild(glider);
    root->removeChild(glider);
    root->removeChild(glider);
注意:如果删除一个结点,那么该结点下的所有结点都会被删除。如果一个极点被加入到一组中多次,那么这两次是分别存在的,删除一次还有一次。

3. 隐藏结点

//隐藏的模型仍在渲染,不会从内存中消失,损耗并未减少,只不过隐藏了而已。node->setNodeMask() 可以设置隐藏与显示, node->setNodeMask(0x0) 表示隐藏, node->setNodeMask(1) 表示显示。 可以通过下面代码实现隐藏指定模型:
    root->addChild(osgcool);
    root->addChild(osgDB::readNodeFile("glider.osg"));
    osgcool->setNodeMask(0x0);

4. 结点开关

//可以使用结点开关 osg::Switch 打开或关闭结点,在关闭时结点所占用的内存将被释放掉。

       osg::ref_ptr<osg::Group> root = new osg::Group();
        osg::ref_ptr<osg::Switch>  sw = new osg::Switch();
        osg::ref_ptr<osg::Node> osgcool = osgDB::readNodeFile("osgcool.osgt");
        sw->addChild(osgcool, false);
        sw->addChild(osgDB::readNodeFile("glider.osg"));
        root->addChild(sw);
        viewer.setSceneData(root);

5. 超级指针

超级指针机制,其实就是引用一个计数器。引用一次加一,释放一次减一。当减至0时,内存释放。

使用结点的三种方法:

方法一(超级指针):

osg::ref_ptr<osg::Node> node = new osg::Node();
  group->addChild(node.get());

    这是最好的方法,十分安全,也是OSG中最常用的方法。在 new osg::Node() 时申请了一个Node的资源,这时在堆内引用该Node的计数器会被置1。在 group->addChild(aNode.get()) 时又引用了一次,会再加1。在这两次引用都结束时,Node的资源就会被释放。

方法二:

group->addChild(new osg::Node());

这个方法也是很实用的,但是无法引出Node的指针,也许在别处可以用到,事实上会经常用到。如果已经这样做了,得到Node指针也不是不可以的,可以使用NodeVisitor来得到Node的指针,也可以使用findChild方法来做这件事。

方法三:

osg::Node * node = new osg::Node();
 group->addChile(node);

这个应该是最常用,但是最不好的方法,原因在于如果在 osg::Node*node = new osg::Node() 之后发生了错误,抛出了异常,Node所占用的资源没有释放。在有大量交互以及场景变换时,建议使用超级指针。

6. 模型矩阵变换

模型的移动、旋转、缩放其实都是对矩阵进行操作,矩阵可以当作一个特殊的结点加入到组结点中。

  • 通过 osg::MatrixTransform 定义变换矩阵, 
  • 通过 setMatrix(osg::Matrix::translate(x, y, z)) 实现模型移动, 
  • 通过 setMatrix(osg::Matrix::scale(x, y, z)) 实现模型缩放, 
  • 通过 setMatrix(osg::Matrix::rotate(x, y, z)) 实现模型旋转。

详细的讲解在第5课时进行讲解。


版权声明:本文为博主原创文章,未经博主允许不得转载。

osg模型的移动,旋转和缩放

简述     和其他三维引擎一样,模型的矩阵操作是比不可少的。 osg中有一个专门的类来处理。即osg::MatrixTransform类。同样osg::MatrixTransform这个类的祖宗类也...
  • niu2212035673
  • niu2212035673
  • 2017年07月15日 22:08
  • 476

osg中设置模移动旋转缩放

osg::ref_ptrosg::Node> xcModel = osgDB::readNodeFile("Models/www.ive"); if(xcModel.valid()) ...
  • woaicd
  • woaicd
  • 2017年07月31日 17:25
  • 217

第5课时《osg矩阵变换(下)》

一、模型转动 //矩阵变换 osg::ref_ptrosg::Node> MatrixOpation() { osg::ref_ptrosg::Group> group= new osg::...
  • u013207966
  • u013207966
  • 2016年05月29日 16:50
  • 890

osg 矩阵转换后,获取矩阵中模型的位置

#include "stdafx.h" #include #include #include #include #include #include #include #include ...
  • yueye30121
  • yueye30121
  • 2014年11月26日 16:41
  • 633

第4课时《osg矩阵变换(上)》

1.osg空间方向           OSG坐标轴如上图图所示,x轴表示屏幕水平方向,y轴表示和屏幕垂直方向即屏幕里面方向,z轴表示屏幕垂直方向,每个箭头指向表示正方向 。而OpenGL的坐...
  • u013207966
  • u013207966
  • 2016年05月29日 14:56
  • 1100

OSG模型简单控制

结点基本操作 添加结点 OSG中使用osg::Node和osg::Group装载模型,Node是Group的父类。 可以通过下面代码再场景中显示多个模型: #include #include #i...
  • milkcu
  • milkcu
  • 2014年02月18日 13:46
  • 2628

OSG学习:移动/缩放/旋转模型

移动和缩放以及旋转都是对矩阵进行操作,这些操作如果要叠加直接矩阵相乘就可以了。 下面的示例代码中,加入了四个bignathan,一个是默认加入在最中间,一个向上移2单位,一个是向下移2单位且缩放0.5...
  • u012130706
  • u012130706
  • 2017年07月02日 16:28
  • 206

osg中使用MatrixTransform来实现模型的平移/旋转/缩放

MatrixTransform是从Transform - Group继承而来,因此可以在它的下面挂接Node对象。 通过设置其矩阵,来实现其下子节点的模型变换。 -- 用局部坐标系来理解(局部坐标...
  • TimothyFly
  • TimothyFly
  • 2012年08月03日 10:40
  • 7806

零基础入门学习Python(3)--小插曲之变量和字符串

前言 小甲鱼说,在对前边的小游戏改善前,先了解下,Python中的变量与字符串。 主要内容 变量 变量名就像我们现实社会的名字,把一个值赋值给一个名字时,Ta会存储在内存中,称之为变量(...
  • wanbin6470398
  • wanbin6470398
  • 2018年01月31日 11:04
  • 17

Python 小甲鱼教程 课后练习33 异常处理

第一题: 要求如下,检测输入是否为整数,如果是整数的话,通过,不是的话,捕获错误并报错! 代码如下: def int_input(prompt=''):     whi...
  • bestallen
  • bestallen
  • 2016年07月17日 16:17
  • 707
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第3课时《osg模型控制》
举报原因:
原因补充:

(最多只允许输入30个字)