千家信息网

OpenSceneGraph中如何导出三角形数据

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,OpenSceneGraph中如何导出三角形数据,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。今天写了一个导出三角形的类
千家信息网最后更新 2025年12月01日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安全错误 数据库的锁怎样保障安全 数据库表统计更新索引 青岛福莱软件开发 数据库对物流管理的影响 北京管理软件开发口碑推荐 无线网络一直显示服务器状态 食物营养数据库 服务器类电话大全 诺顿网络安全监控怎么退出 大数据技术与数据库哪个难 连接数据库在表里添加数据 职工 社团数据库 集团企业网络安全知识 董事长要用的管理软件开发商 学习网络安全有啥前途 pha存储服务器公司 软件开发成熟度级别 lol新服务器 金山区机械软件开发定制价格 第五章数据库安全保护 服务器采购技术参数 网络安全应急组织区域有哪些 网络安全专业需要考二级吗 什么是储入式数据库 女子能不能做软件开发 服务器怎么连接别的地方的电脑 斑马网络技术有限公司薪资待遇 一级分行有软件开发岗 惠通网络技术有限公司怎么样 手机软件开发服务至上 动态网页的数据库连接技术
0