OpenSceneGraph如何导出三角形数据

  介绍

这篇文章主要介绍”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:: cout

OpenSceneGraph如何导出三角形数据