介绍
这篇文章主要介绍”OpenSceneGraph如何导出三角形数据”,在日常操作中,相信很多人在OpenSceneGraph如何导出三角形数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答“OpenSceneGraph如何导出三角形数据”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
在OpenSceneGraph开发中,为了方便会经常使用到一些不是三角形片的数据,比如四边形等数据,例如画一个管子用四边形带比用三角形片好计算得多。比如现在我们要画一个由两个平面组成的面,我可以这样做:
用osg:晶洞*,晶洞=new 用osg:晶洞; 用osg:几何*,polyGeom =, new 用osg:几何; 用osg: Vec3 myCoords []={ 用osg: Vec3 (0,1,0), 用osg: Vec3 (0, 0, 0), 用osg: Vec3 (1 1 0), 用osg: Vec3 (1,0,0), 用osg: Vec3 (2, 1, 0), 用osg: Vec3 (2 0 0) }; int numCoords =, sizeof (myCoords)/sizeof(用osg:: Vec3); 用osg: Vec3Array *, vertices =, new 用osg: Vec3Array (numCoords myCoords); polyGeom→setVertexArray(顶点); polyGeom→addPrimitiveSet (new 用osg: DrawArrays(用osg:: PrimitiveSet:: QUAD_STRIP 0 numCoords)); 晶洞→addDrawable (polyGeom);
这样就用6个点,用OpenGL提供的QUAD_STRIP方式画出了两个平面。但是如果要把这个平面用于碰撞检测等技术,那么就需要把这六个点所表示的四边形带转换成三角形片才行。这些三角形定点如下:
0, 1, 0 0,0,0 1,1,0 0,0,0 1,0,0 1,1,0 1,1,0 1,0,0 2,1,0 1,0,0 2,0,0 2,1,0
可以看出两个平面由4个三角形组成,而且都是逆时针排列(朝向一致)。以前我自己做过转换,但是感觉很麻烦.OpenSceneGraph osggeometry的例子中提供了一个printTriangles函数,它可以打印出一个可拉的所有的三角形片,不管最初的数据结构如何:
struct NormalPrint { void 操作符(),(const 用osg:: Vec3&, v1, const 用osg:: Vec3&, v2, const 用osg:: Vec3&, v3,, bool), const { 用osg: Vec3 normal =, (v2-v1) ^ (v3-v2); normal.normalize (); std:: cout & lt; & lt;,“t (“& lt; & lt; & lt;“), (“& lt; & lt; & lt;“), (“& lt; & lt; & lt;“),“& lt; & lt;“), normal (“& lt; & lt; & lt;“)“& lt; } };//,decompose Drawable primtives  into 三角形,,print out these triangles 以及computed 法线。 void printTriangles (const std:: string&,名字,,用osg:: Drawable&,可拉的) { std:: cout<& lt; 用osg: TriangleFunctor tf; drawable.accept (tf); std:: cout<}
核心的思想就是利用用osg:: TriangleFunctor这个模版。这个模版会让你重载()运算符,然后让可拉的去访问它。在这个过程中,所有原始的数据(不管是三角形片的,还是四边形的)都转换成了三角形片数据。
那么如何把三角形数据导出哪?只需要修改一下借助这个思路,将NormalPrint修改成我们需要的就对了。
struct GetVertex { void 操作符(),(const 用osg:: Vec3&, v1, const 用osg:: Vec3&, v2, const 用osg:: Vec3&, v3,, bool), const { vertexList→push_back方法(v1); vertexList→push_back方法(v2); vertexList→push_back方法(v3); } 用osg: Vec3Array *, vertexList; }; void getTriangles(用osg: Drawable&,可拉的) { 用osg: TriangleFunctor tf; tf.vertexList=new 用osg: Vec3Array; drawable.accept (tf); (用osg:: Vec3Array:: iterator itr=tf.vertexList→开始(); itr !=tf.vertexList→结束(); itr + +) { 用osg: Vec3 顶点=* itr; std:: cout<& lt; } std:: cout<}
以下是完整的示例文件:
//, PrimitiveSet.cpp :,定义控制台应用程序的入口点。//# include “stdafx.h" # include struct GetVertex { void 操作符(),(const 用osg:: Vec3&, v1, const 用osg:: Vec3&, v2, const 用osg:: Vec3&, v3,, bool), const { vertexList→push_back方法(v1); vertexList→push_back方法(v2); vertexList→push_back方法(v3); } 用osg: Vec3Array *, vertexList; }; void getTriangles(用osg: Drawable&,可拉的) { 用osg: TriangleFunctor tf; tf.vertexList=new 用osg: Vec3Array; drawable.accept (tf); (用osg:: Vec3Array:: iterator itr=tf.vertexList→开始(); itr !=tf.vertexList→结束(); itr + +) { 用osg: Vec3 顶点=* itr; std:: coutOpenSceneGraph如何导出三角形数据