osg 示例程序解析之osgdelaunay
osg 示例程序解析之osgdelaunay
转自: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);
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()); // this fills the holes of each pyramid with geometry
会看到如下的效果:

我们看到受约束的地方仍然形成了三角形,没有生成生4边形的空洞,如果我们把第一句的注释去掉,会看到如下结果:

说明建立约束条件后,只有使用trig->removeInternalTriangles()方法,才能使约束生效,通过本示例程序,我们可以知道如何基于离散点及约束条件,构建受约束的三角网的方法
osg 示例程序解析之osgdelaunay的更多相关文章
- ACEXML解析XML文件——简单示例程序
掌握了ACMXML库解析XML文件的方法后,下面来实现一个比较完整的程序. 定义基本结构 xml文件格式如下 <?xml version="1.0"?> <roo ...
- OSG中的示例程序简介
OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示 ...
- OSG中的示例程序简介(转)
OSG中的示例程序简介 1.example_osganimate一)演示了路径动画的使用 (AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera ...
- <WebGIS之OpenLayers全面解析>示例程序运行问题
运行<WebGIS之OpenLayers全面解析>中的示例程序时,无法加载*.json文件. 查看到提示如下错误:GET http://localhost:11232/demos/data ...
- 【ABAP系列】SAP ABAP解析XML的示例程序
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP解析XML的示例 ...
- 【rabbitmq】rabbitmq概念解析--消息确认--示例程序
概述 本示例程序全部来自rabbitmq官方示例程序,rabbitmq-demo: 官方共有6个demo,针对不同的语言(如 C#,Java,Spring-AMQP等),都有不同的示例程序: 本示例程 ...
- [OSG]OSG例子程序简介
1.example_osganimate一)演示了路径动画的使用(AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera.CameraView.M ...
- RocketMQ生产者示例程序
转载请注明出处:http://www.cnblogs.com/xiaodf/ 本示例展示了一个RocketMQ producer的简单实现,通过解析文本文件获取输入数据,将数据经过Avro序列化后发送 ...
- epub、ocf等常用电子书格式浅析----附JAVA示例程序
一. 电子书介绍 转载请注明http://www.cnblogs.com/xckk/p/6020324.html Epub(Electronic Publication)是一个完全开放和免费的电子书标 ...
随机推荐
- [UML]UML系列——用例图中的各种关系(include、extend)
用例图中的各种关系 一.参与者与用例间的关联关系 参与者与用例之间的通信,也成为关联或通信关系. 二.用例与用例之间的关系 包含关系(include) 扩展关系(extend) 包含关系 (1) 概 ...
- Backbone 学习笔记
Backbone 是一款基于模型-视图-控制器 MVC 模式的轻量级javascript 框架 ,可以用来帮助开发人员创建单页Web应用. 借助Backbone 我们可以使用REST的方式来最小化客户 ...
- WampServer数据库导入sql文件
WampServer中MySQL如何导入sql文件: http://jingyan.baidu.com/article/3c343ff7f9c7940d377963c0.html
- LwIP移植和使用
LwIP移植和使用 本手册基于lwip-1.4.x编写,本人没有移植过1.4.0之前的版本,更早的版本或许有差别.如果看官发现问题欢迎联系<QQ: 937431539 email: 93743 ...
- 【Maven】Eclipse安装Maven插件后导致Eclipse启动出错
本文纯属复制粘贴:具体请参照原文: Eclipse安装Maven插件后,Eclipse启动问题:Maven Integration for Eclipse JDK Warning. 解决方法: 1. ...
- Python全栈开发【基础二】
Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...
- mysql in
2016年4月13日 17:11:19 星期三 摘抄自<高性能mysql> 在很多数据库中, IN() 完全等同于多个 OR 的连结 MySQL的IN 会先将列表中的数据线进行排序, 然后 ...
- Python 开发轻量级爬虫05
Python 开发轻量级爬虫 (imooc总结05--网页下载器) 介绍网页下载器 网页下载器是将互联网上url对应的网页下载到本地的工具.因为将网页下载到本地才能进行后续的分析处理,可以说网页下载器 ...
- 移动端web开发技巧
META相关 1. 添加到主屏后的标题(IOS)
- 配置nodejs环境
一.由于node有多种版本号,每个版本号的API肯定也有些细微的差别,在工作中有可能要经常切换node的版本号,因此可以下载nvm使其来管理node的版本号. 首先下载nvm,官网:https://g ...