您好,登錄后才能下訂單哦!
OpenSceneGraph中如何導出三角形數據,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
今天寫了一個導出三角形的類,可以導出一個Group的所有三角形數據(包括Group的所有child),主要用于碰撞檢測.比如有一個Group"自行車",這個Group包含有子Group"前輪"和子Group"后輪",子對象通過MatrixTransform與父對象相連.那么這個類可以將Group"自行車"包括"前輪"和"后輪"的三角形數據都導出到一個vector里面,方面用于碰撞檢測.
代碼片段如下:
struct GetVertex { void operator() (const osg::Vec3& v1,const osg::Vec3& v2,const osg::Vec3& v3, bool) const { osg::Vec3 v1New=v1*(*matrix); osg::Vec3 v2New=v2*(*matrix); osg::Vec3 v3New=v3*(*matrix); vertexList->push_back(v1New); vertexList->push_back(v2New); vertexList->push_back(v3New); } osg::Vec3Array* vertexList; osg::Matrix* matrix; }; class VertexVisitor: public osg::NodeVisitor { public: VertexVisitor():osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN){}; virtual void apply(osg::Geode& geode) { osg::NodePathList nodePathList=geode.getParentalNodePaths(stopAt); osg::NodePath firstNodePath=*(nodePathList.begin()); osg::Matrix matrix=osg::computeLocalToWorld(firstNodePath); osg::Geode::DrawableList drawableList=geode.getDrawableList(); osg::TriangleFunctor tf; tf.vertexList=vertexList; tf.matrix=&matrix; for(osg::Geode::DrawableList::iterator itr=drawableList.begin(); itr itr++) { (*itr)->accept(tf); } traverse(geode); } osg::Vec3Array* vertexList; osg::Group* stopAt; }; osg::Vec3Array* TriangleConvertor::Convert(osg::Group* group ) { osg::Vec3Array* vertexList=new osg::Vec3Array; VertexVisitor vertexVisitor; vertexVisitor.vertexList=vertexList; vertexVisitor.stopAt=group; group->accept(vertexVisitor); return vertexList; }
思路是使用一個visitor來遍歷Group下面所有的Geode,然后用osg::TriangleFunctor獲取所有的三角形片.在獲取的時候對每一個三角形進行矩陣變換,目的是將local坐標系的三角形數據轉換成world坐標系的三角形.獲取矩陣的方法是用osg::computeLocalToWorld這個方法.值得注意的是在尋找ParentPath的時候要設置haltTraversalAtNode這個參數為查詢起始的Group.這是因為,如果group還有父對象的話,那么會得到所有的對象,而不是返回基于group所在的坐標系的三角形片數據.(可能說的有些繞……)
這樣說明吧,舉個例子層次結構為一下:
Group Root MatrixTransform Position MatrixTransform Bike MatrixTransform FrontWheel Geode 1 Geode 2 MatrixTransform RearWheel Geode 3 Geode 4
注意一個MatrixTransform也是一個Group.這里我們需要得到Bike整個模型的三角形片,而且整個三角形片受到Position這個矩陣的影響.那么當遍歷到Geode 1這里的時候,如果調用geode.getParentalNodePaths(),那么就會返回NodeParentList如下:
Root Position Bike FrontWhell
這樣的話就相當于要把所有的三角形轉換成世界坐標系里面的值.不符合我們的要求.那么如果設置了haltTraversalAtNode=Bike,也就是說調用geode.getParentalNodePaths(Bike),那么NodeParentList如下:
Bike FrontWheel
這樣就滿足了我們的要求.然后經過計算的矩陣就是相對于Bike的矩陣,經過轉換的三角形片就是整個Bike的三角形片了. 最后整個三角形片通過Vec3Array返回.
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。