osg示例代码解析---osgdelaunay
2017-01-02 16:42
405 查看
声明:本文转载自:http://lzchenheng.blog.163.com/blog/static/838335362010821103038928/点击打开链接
本示例程序主要说明如何用osgUtil::DelaunayTriangulator类建立约束的delaunay三角网,delaunay三角网主要用于基于离散点数据构建三维表面。如经常用于构建地形表面,本示例程序就是用该类构建一个地形,然后添加一些约束条件,在地形上绘制道路、区域等要素,示例程序的主要函数为:makedelaunay(),该函数输入的参数是约束的数目,输出的是一个组节点,下面对这个函数的实现进行说明。
1、生成离散点数据
该函数首先随机生成一些离散点数据,代码如下:
2、生成一些约束类
这些类派生自osgUtil::DelaunayConstraint,如
osg::ref_ptr<ArealConstraint> dc2; 约束区域
osg::ref_ptr<ArealConstraint> forest; 约束区域,作为一片树林
osg::ref_ptr<LinearConstraint> dc3; 约束区域,一条线。。。。。
然后确定约束的边或点,如当输入的参数大于0时,确定金字塔的底边作为约束边
如下代码所示:
addInputConstraint()方法用于向三角网中添加约束条件。
其余的约束条件的生成与添加与其类似。
3、三角化处理
添加完约束条件后,进行三角化处理,如下代码所示: trig->setInputPointArray(points);
/** NB you need to supply a vec3 array for the triangulator to calculate normals into */
osg::Vec3Array *norms=new osg::Vec3Array;
trig->setOutputNormalArray(norms);
trig->triangulate();
4、将三角化的图元添加到叶节点中
//添加构建的三角形作为图元
gm->addPrimitiveSet(trig->getTriangles());
gm->setNormalArray(trig->getOutputNormalArray());
gm->setNormalBinding(osg::Geometry::BIND_PER_PRIMITIVE);
geode->addDrawable(gm.get());
5、绘制约束的几何体
为了方便看出约束的效果,我们用线框的方式显示图形,把叶节点的状态改为线框显示方式。 osg::PolygonMode *pLolyMode=new osg::PolygonMode();
pLolyMode->setMode(osg::PolygonMode::FRONT_AND_BACK ,osg::PolygonMode::LINE);
stateset->setAttribute(pLolyMode);
geode->setStateSet( stateset );
在绘制约束体之前,先要使用removeInternalTriangles()方法,移开约束条件构建的三角形,对于绘制金字塔的代码:
for ( std::vector < pyramid* >::iterator itr=pyrlist.begin(); itr!=pyrlist.end(); itr++) {
//移开金字塔约束边形成的三角形,形成4个4边形空洞
trig->removeInternalTriangles(*itr);
//绘制金字塔
geode->addDrawable((*itr)->makeGeometry()); // this fills the holes of each pyramid with geometry
}
如果我们注释以下两句:
//trig->removeInternalTriangles(*itr);
//geode->addDrawable((*itr)->makeGeometry());
会看到如下的效果:
我们看到受约束的地方仍然形成了三角形,没有生成生4边形的空洞,如果我们把第一句的注释去掉,会看到如下结果:
说明建立约束条件后,只有使用trig->removeInternalTriangles()方法,才能使约束生效,通过本示例程序,我们可以知道如何基于离散点及约束条件,构建受约束的三角网的方法。
以上内容转载自网易-陈恒的博客 http://lzchenheng.blog.163.com/blog/static/838335362010821103038928/
本示例程序主要说明如何用osgUtil::DelaunayTriangulator类建立约束的delaunay三角网,delaunay三角网主要用于基于离散点数据构建三维表面。如经常用于构建地形表面,本示例程序就是用该类构建一个地形,然后添加一些约束条件,在地形上绘制道路、区域等要素,示例程序的主要函数为:makedelaunay(),该函数输入的参数是约束的数目,输出的是一个组节点,下面对这个函数的实现进行说明。
1、生成离散点数据
该函数首先随机生成一些离散点数据,代码如下:
//随机生成地形坐标点,存储到Points中 int eod=0; while(eod>=0) { osg::Vec3d pos=getpt(eod); if (pos.z()>-10000){ points->push_back(pos); eod++; } else { eod=-9999; } }
2、生成一些约束类
这些类派生自osgUtil::DelaunayConstraint,如
osg::ref_ptr<ArealConstraint> dc2; 约束区域
osg::ref_ptr<ArealConstraint> forest; 约束区域,作为一片树林
osg::ref_ptr<LinearConstraint> dc3; 约束区域,一条线。。。。。
然后确定约束的边或点,如当输入的参数大于0时,确定金字塔的底边作为约束边
如下代码所示:
//令5个金字塔的底边作为约束边 for(unsigned int ipy=0; ipy<5; ipy++){ osg::ref_ptr<pyramid>pyr=new pyramid; float x=2210+ipy*120, y=1120+ipy*220; //设置金字塔绘制的位置及大小尺寸 pyr->setpos(osg::Vec3(x,y,getheight(x,y)),125.0+10*ipy); //确定金字塔底面4边形4个顶点坐标 pyr->calcVertices(); //make vertices //底面4条边构成约束 pyr->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_LOOP,0,4) ); //添加约束边,金字塔底面4边形4条边作为约束 trig->addInputConstraint(pyr.get()); //存储约束边 pyrlist.push_back(pyr.get()); }
addInputConstraint()方法用于向三角网中添加约束条件。
其余的约束条件的生成与添加与其类似。
3、三角化处理
添加完约束条件后,进行三角化处理,如下代码所示: trig->setInputPointArray(points);
/** NB you need to supply a vec3 array for the triangulator to calculate normals into */
osg::Vec3Array *norms=new osg::Vec3Array;
trig->setOutputNormalArray(norms);
trig->triangulate();
4、将三角化的图元添加到叶节点中
//添加构建的三角形作为图元
gm->addPrimitiveSet(trig->getTriangles());
gm->setNormalArray(trig->getOutputNormalArray());
gm->setNormalBinding(osg::Geometry::BIND_PER_PRIMITIVE);
geode->addDrawable(gm.get());
5、绘制约束的几何体
为了方便看出约束的效果,我们用线框的方式显示图形,把叶节点的状态改为线框显示方式。 osg::PolygonMode *pLolyMode=new osg::PolygonMode();
pLolyMode->setMode(osg::PolygonMode::FRONT_AND_BACK ,osg::PolygonMode::LINE);
stateset->setAttribute(pLolyMode);
geode->setStateSet( stateset );
在绘制约束体之前,先要使用removeInternalTriangles()方法,移开约束条件构建的三角形,对于绘制金字塔的代码:
for ( std::vector < pyramid* >::iterator itr=pyrlist.begin(); itr!=pyrlist.end(); itr++) {
//移开金字塔约束边形成的三角形,形成4个4边形空洞
trig->removeInternalTriangles(*itr);
//绘制金字塔
geode->addDrawable((*itr)->makeGeometry()); // this fills the holes of each pyramid with geometry
}
如果我们注释以下两句:
//trig->removeInternalTriangles(*itr);
//geode->addDrawable((*itr)->makeGeometry());
会看到如下的效果:
我们看到受约束的地方仍然形成了三角形,没有生成生4边形的空洞,如果我们把第一句的注释去掉,会看到如下结果:
说明建立约束条件后,只有使用trig->removeInternalTriangles()方法,才能使约束生效,通过本示例程序,我们可以知道如何基于离散点及约束条件,构建受约束的三角网的方法。
以上内容转载自网易-陈恒的博客 http://lzchenheng.blog.163.com/blog/static/838335362010821103038928/
相关文章推荐
- osg 示例程序解析之osgdelaunay
- osg 示例程序解析之osgdelaunay
- iPhone SDK 解析 xml的官方示例代码
- JDK 解析 X.509证书和CRL 示例代码
- js正则解析URL参数示例代码
- JAVA Vector源码解析和示例代码
- 在java中使用dom4j解析xml(示例代码)
- jdom解析XML示例代码
- osg示例解析之osganimationsolid(1)
- js正则解析URL参数示例代码
- 深入解析phpCB批量转换的代码示例
- jquery解析JSON数据示例代码
- 如何在WebService接收一个XML文件并解析,客户端如何发送这个XML文件?急求简单代码示例。。
- Android 解析JSON数据示例代码[CODE]
- [Android实例] Android JSON解析示例代码
- JavaScript解析URL参数示例代码
- Android JSON解析示例代码
- dom4j,读,写,解析,xml文件 示例代码
- Android 开发中用到的几个多线程解析(代码示例)
- PHP图片加水印代码示例解析