视频网站怎么做算法,网站开发与维护都有些什么,网络营销策划的原则,wordpress怎样静态化在OpenSceneGraph开发中#xff0c;为了方便会经常使用到一些不是三角形片的数据#xff0c;比如四边形等数据。例如画一个管子用四边形带比用三角形片好计算得多。比如现在我们要画一个由两个平面组成的面#xff0c;我可以这样做#xff1a; osg::Geode*geodenewosg::Geo…在OpenSceneGraph开发中为了方便会经常使用到一些不是三角形片的数据比如四边形等数据。例如画一个管子用四边形带比用三角形片好计算得多。比如现在我们要画一个由两个平面组成的面我可以这样做 osg::Geode* geodenew osg::Geode; osg::Geometry* polyGeom new osg::Geometry; 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(vertices); polyGeom-addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUAD_STRIP,0,numCoords)); geode-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的Example osggeometry中提供了一个printTriangles函数它可以打印出一个drawable所有的三角形片不管最初的数据结构如何 struct NormalPrint { void operator() (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 \t(v1) (v2) (v3) ) normal (normal)std::endl; } }; // decompose Drawable primtives into triangles, print out these triangles and computed normals. void printTriangles(const std::string name, osg::Drawable drawable) { std::coutnamestd::endl; osg::TriangleFunctorNormalPrint tf; drawable.accept(tf); std::coutstd::endl; } 核心的思想就是利用osg::TriangleFunctor这个模版。这个模版会让你重载()运算符然后让Drawable去visit它。在这个过程中所有原始的数据不管是三角形片的还是四边形的都转换成了三角形片数据。 那么如何把三角形数据导出哪只需要修改一下借助这个思路将NormalPrint修改成我们需要的就对了。 struct GetVertex { void operator() (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 drawable) { osg::TriangleFunctorGetVertex tf; tf.vertexListnew osg::Vec3Array; drawable.accept(tf); for(osg::Vec3Array::iterator itrtf.vertexList-begin(); itr!tf.vertexList-end(); itr) { osg::Vec3 vertex*itr; std::coutvertexstd::endl; } std::coutstd::endl; } 以下是完整的示例文件
//PrimitiveSet.cpp : 定义控制台应用程序的入口点。
// #include stdafx.h#include iostreamstruct GetVertex { void operator() (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 drawable) { osg::TriangleFunctorGetVertex tf; tf.vertexListnew osg::Vec3Array; drawable.accept(tf); for(osg::Vec3Array::iterator itrtf.vertexList-begin(); itr!tf.vertexList-end(); itr) { osg::Vec3 vertex*itr; std::coutvertexstd::endl; } std::coutstd::endl; }
osg::Node* createGeode() { osg::Geode* geodenew osg::Geode; osg::Geometry* polyGeom new osg::Geometry; 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(vertices); polyGeom-addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUAD_STRIP,0,numCoords)); geode-addDrawable(polyGeom); getTriangles(*polyGeom); return geode; }
int _tmain(int argc, _TCHAR* argv[]) { //Set up viewer osgViewer::Viewer viewer; osg::ref_ptrosg::GraphicsContext::Traits traitsnew osg::GraphicsContext::Traits; traits-x200; traits-y200; traits-width800; traits-height600; traits-windowDecorationtrue; traits-doubleBuffertrue; traits-sharedContext0; osg::ref_ptrosg::GraphicsContext gcosg::GraphicsContext::createGraphicsContext(traits.get()); osg::ref_ptrosg::Camera cameranew osg::Camera; //osg::Camera cameranew osg::Camera; camera-setGraphicsContext(gc.get()); camera-setViewport(new osg::Viewport(0,0,traits-width,traits-height)); camera-setDrawBuffer(GL_BACK); camera-setReadBuffer(GL_BACK); osgGA::TrackballManipulator* tmnew osgGA::TrackballManipulator; viewer.setCameraManipulator(tm); viewer.addSlave(camera.get()); //Set up root node osg::ref_ptrosg::Group rootnew osg::Group; root-addChild(createGeode()); //Start show! viewer.setSceneData(root.get()); viewer.realize(); while(!viewer.done()) { viewer.frame(); } }