日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

getParentalNodePaths、osg::NodePathList、osg::NodePath详解

發布時間:2023/12/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 getParentalNodePaths、osg::NodePathList、osg::NodePath详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

osg::NodePathList、osg::NodePath在osg的osg\Node頭文件中定義如下:

可以看到NodePath 是以osg::Node為元素的vector容器,osg::NodePathList是以NodePath為元素的容器。具體說明如下:

  • NodePath表示一條路徑,其中的每個元素表示路徑中的每個節點,就像從“西長安街--->故宮”,這里的“西長安街--->故宮”是一條路徑,路徑中的每個節點就相當于這條路徑中的公交站,比如:從西長安街到故宮要經過“天安門西”、“天安門東”、“故宮”三個公交站,這里的“天安門西”、“天安門東”、“故宮”就是NodePath中的Node。
  • osg::NodePathList表示從西長安街到故宮的所有路徑的集合,因為從西長安街到故宮可以有很多條路可到,比如:從“西長安街--->府右街---->西安門-->北海北->故宮”。
  • 類似的,從父節點(或祖宗節點)到當前節點可以有好多路徑。OSG允許一個節點具有多個父節點,在osg::Node類中:

  • getParent()方法返回一個osg::Group指針作為父節點。他需要一個表示父節點列表中索引的整數參數,因為某個節點可能有多個父。
  • getNumParents()方法返回父節點的總數。如果節點只有一個父節點,該方法將會返回1,而此時只有getParent(0)是正確可用的。
  • getParentalNodePaths()方法返回由場景的根節點到當前節點(包含當前節點)的所有可能路徑。他返回一個osg::NodePath變量的列表。
  • 場景視圖的總根節點始終為場景視圖下的相機節點。
  • 如下圖,假定我們有如下一個場景圖:

    從Root節點到Child4節點,共有兩條路徑。分別為:

  • Root ---->L_Child1?---->L_Child2?---->L_Child3?---->Child4?
  • Root ---->R_Child1?---->R_Child2?---->R_Child3?---->Child4?
  • 上面的兩條路徑就是osg::NodePathList容器的元素,即osg::NodePathList[0]就是上面的條目1;osg::NodePathList[1]就是上面的條目2.

    osg::NodePathList[0][0]、osg::NodePathList[0][1]、osg::NodePathList[0][2]、osg::NodePathList[0][3]、osg::NodePathList[0][4]對應上面條目1中的Root 、L_Child1、L_Child2?、L_Child3?、 Child4。

    osg::NodePathList[1][0]、osg::NodePathList[1][1]、osg::NodePathList[1][2]、osg::NodePathList[1][3]、osg::NodePathList[1][4]對應上面條目1中的Root 、R_Child1、R_Child2?、R_Child3?、Child4 。

    如下代碼:

    int main(int argc, char** argv) {osg::ref_ptr<osgViewer::Viewer> spViewer = new osgViewer::Viewer();spViewer->setName("Viewer");osg::Camera* pCamera = spViewer->getCamera();pCamera->setName("Camera");osg::ref_ptr<osg::Group> spRoot = new osg::Group();spRoot->setName("Root");osg::ref_ptr<osg::Node>spNode = osgDB::readNodeFile("cow.osg");spNode->setName("Node");spRoot->addChild(spNode.get());spViewer->setSceneData(spRoot);osg::NodePathList lstPath = spNode->getParentalNodePaths();int m = lstPath.size();cout << "Path size:" << m << "\r\n";for (size_t iPathIndex = 0; iPathIndex < lstPath.size(); ++iPathIndex){size_t iNodeSize = lstPath[iPathIndex].size();cout << iPathIndex << "----> size:" << iNodeSize << "\r\n";for (size_t iNodeIndex = 0; iNodeIndex < iNodeSize; ++iNodeIndex){string strName = lstPath[iPathIndex][iNodeIndex]->getName();cout << "Node Name:" << strName << "\r\n";}}return spViewer->run(); }

    按照上面畫出父子關系圖如下:

    結合上面對osg::NodePathList、osg::NodePath、getParentalNodePaths講解,應該能明白程序輸出如下:

    總結

    以上是生活随笔為你收集整理的getParentalNodePaths、osg::NodePathList、osg::NodePath详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。