第3課時《osg模型控制》

2021-07-12 04:55:38 字數 2886 閱讀 6552

1.新增結點

//osg中使用

osg::node

和osg::group

裝載模型,node是group的父類,可以通過以下**新增多個模型。

osg::

ref_ptr

<

osgviewer

::viewer

>

viewer

=new

osgviewer

::viewer

;

osg::

ref_ptr

<

osg::

group

>

root=

newosg

::group

;root->addchild(osgdb::readnodefile("glider.osg"));

root->addchild(osgdb::readnodefile("osgcool.osgt"));
viewer->setscenedata(root);
//注意:模型的的預設位置在原點,也就是場景的中間。

2. 刪除結點

//可以通過removechild和removechildren方法刪除結點,需要的引數為索引值或結點本身的指標。

osg::ref_ptf* 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

root=

newosg::group();

osg::ref_ptr

sw=newosg::switch();

osg::ref_ptr

osgcool=

osgdb::readnodefile("osgcool.osgt");

sw->addchild(osgcool,

false);

sw->addchild(osgdb::readnodefile("glider.osg"));
root->addchild(sw);
viewer.setscenedata(root);

超級指標機制,其實就是引用乙個計數器。引用一次加一,釋放一次減一。當減至0時,記憶體釋放。

使用結點的三種方法:

方法一(超級指標):

osg:

:ref_ptr::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所占用的資源沒有釋放。在有大量互動以及場景變換時,建議使用超級指標。

模型的移動、旋轉、縮放其實都是對矩陣進行操作,矩陣可以當作乙個特殊的結點加入到組結點中。

詳細的講解在第5課時進行講解。

第3課時 體驗python

學科 人工智慧 年級 四年級上冊 課題 第3課時 體驗python 課時數 1課時 教材分析 在前面了解人工智慧含義及機器學習含義的基礎上,學生已經體驗過一些人工智慧的應用,本節課讓學生了解人工智慧離不開程式語言,通過python語言的初步學習,初步了解人工智慧程式語言,並能夠通過簡單編寫pytho...

第6課時 語音識別

學科 人工智慧 年級 四年級上 課題 第6課時 語音識別 課時數 1課時 教材分析 本課內容選自 人工智慧啟蒙 第一冊第4節 語音識別 部分的內容,本節課要求學生通過學習,初步理解語音識別的含義 簡單了解語音識別的6個過程 了解並體驗語音識別在生活中的常見應用。學情分析 學生通過前面幾節課的學習,了...

第1課時《Qt osgEarth 程式設計入門》

1.首先編譯osg osgearth 原始碼,配置環境變數,將osg及osgearth 對應的bin目錄加入系統環境中。2.在qt中的pro檔案中進行引用 include deployment.pri win32 includepath c osgearrh include c opensceneg...