千家信息网

OpenSceneGraph中如何导出三角形数据

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,OpenSceneGraph中如何导出三角形数据,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。今天写了一个导出三角形的类
千家信息网最后更新 2026年10月31日OpenSceneGraph中如何导出三角形数据

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();itritr++){(*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 RootMatrixTransform PositionMatrixTransform BikeMatrixTransform FrontWheelGeode 1Geode 2MatrixTransform RearWheelGeode 3Geode 4

注意一个MatrixTransform也是一个Group.这里我们需要得到Bike整个模型的三角形片,而且整个三角形片受到Position这个矩阵的影响.那么当遍历到Geode 1这里的时候,如果调用geode.getParentalNodePaths(),那么就会返回NodeParentList如下:

RootPositionBikeFrontWhell

这样的话就相当于要把所有的三角形转换成世界坐标系里面的值.不符合我们的要求.那么如果设置了haltTraversalAtNode=Bike,也就是说调用geode.getParentalNodePaths(Bike),那么NodeParentList如下:

BikeFrontWheel

这样就满足了我们的要求.然后经过计算的矩阵就是相对于Bike的矩阵,经过转换的三角形片就是整个Bike的三角形片了. 最后整个三角形片通过Vec3Array返回.

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

三角形 三角 数据 矩阵 坐标 对象 坐标系 时候 前轮 后轮 就是 方法 自行车 帮助 检测 碰撞 清楚 这样的话 也就是 也就是说 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司排名 湖北九亚互联网络科技有限公司 互联网科技公司简介 朗新科技与工业互联网 互联网金融公司科技 成都互联网科技公司 甘肃拓世互联网科技有限公司 科技大学互联网专业好不好 开启互联网科技时代小说 博兴的互联网电子科技公司 未来五年的互联网科技 996高科技互联网公司 互联网安防科技感 互联网科技包装股份有限公司上市 西安有哪些互联网高科技企业 中国科技和美国互联网 陕西彩京云互联网科技有限公司 长沙易易互联网科技有限公司 恒生互联网科技趋势 小牛互联网科技有限公司地址 互联网属科技 疫情对互联网科技公司影响 卓越科技(互联网 ) 互联网金融和金融科技 互联网科技大奖都有哪些公司 广西互联网科技孵化中心 济南小医互联网科技有限公司招聘 广州梦谷互联网科技有限公司领导 互联网科技平台产品运营 现代科技的标志之一的互联网
0