91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

OpenSceneGraph中如何導出三角形數據

發布時間:2021-12-20 11:02:37 來源:億速云 閱讀:136 作者:柒染 欄目:大數據

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返回.

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

綦江县| 宝丰县| 沂源县| 盖州市| 大冶市| 湖北省| 搜索| 九龙坡区| 德庆县| 东辽县| 平利县| 太康县| 三穗县| 巴林左旗| 甘洛县| 刚察县| 天长市| 高州市| 且末县| 西乌珠穆沁旗| 阳春市| 应城市| 边坝县| 庄浪县| 晋宁县| 剑河县| 嘉祥县| 余江县| 桃源县| 高邑县| 宜良县| 柘荣县| 临泽县| 莱阳市| 玉龙| 松滋市| SHOW| 竹山县| 大新县| 平罗县| 太和县|