Ogre代码学习之1——Ogre中地形lod的基础:deltaHeight的计算
Ogre的地形系统中的重要概念:高度差,英文HeightDeltas,表示某个完整细节中的顶点,在某个它被隐去的lod中被插值之后的高度和原始高度(即高度图中的高度)之差。
DeltaHeight = interp_h - actual_h
每个四叉树的每个lod中都会有一个最大的高度差,用来保存这个lod在这个四叉树块中相对于原始数据的最大差距,显而易见,这个高度差可以认为表示了该lod的失真程度,失真越大,就应该在越远的地方使用该lod。因此,这个值可以用来帮助确定当前状态使用哪一个lod。
计算这个的函数是Terrain::calculateHeightDeltas
首先,这个函数的参数是Rect,Rect的成员是整数,因此这个参数代表了高度图上的行和列,而并不是3D坐标。另外这个Rect是表示有变化的地形部分,也就是diry的Rect。
这个地方有一个技巧,就是在四叉树结构中加了一个calcMaxDeltaHeight变量,用于计算最大lod,在计算之前将它清零。计算过程中更新这个数值,结束以后,这个数值就代表了这个lod的最大deltaHeight。如果没有这个变量,这个过程会增加无关的临时变量,也会让计算的逻辑没现在这么清晰。
接下来分析一下这个函数大体的思路:
1 限制Rect在正确的范围,也就是0——Size。
2 初始化各个四叉树节点中每个lod的calcMaxDeltaHeight为0。
3 开始五层循环:
第一层,对所有lod迭代,之所以放在第一层,是因为不同的lod,由于会影响周边顶点,因此之后的地形数据迭代的范围会不同。
第二、三层,迭代地形二维数据按这个lod所划分的所有地形块,lod地形块大小为1<<lod,也就是2^lod,也就是代码中的step。
第四、五层,迭代每个lod地形块中的每个被隐掉的点。当这个点x向和y向都不能整除step时,说明它是被隐掉了,需要计算高度差。
4 最后,调用四叉树根节点的postCalcDeltaHeight来处理最后的工作。最后的工作包括:
a. 确保每个父节点上细节最丰富的lod的高度差比他所有孩子节点的最大高度差更大。
b. 确保每个叶子节点的lod高度差随lod增加而增加
该函数通过插值得到了隐去顶点的高度差,然后通过调用四叉树的notifyDelta方法,将这个点的高度差发送到四叉树每个属于这个Rect的节点(也即递归调用notifyDelta)。
这个函数完成以后,四叉树中凡是涉及到dirtyRect的每个节点的lod的最大高度差都会得到更新。计算复杂度为o(Nl * dirtyRect.width*dirtyRect.height * logN),其中Nl为lod数量,N为地形图的边长,必须是2^n+1。
Ogre代码学习之1——Ogre中地形lod的基础:deltaHeight的计算的更多相关文章
- 【代码学习】GD库中图片缩印
bool imagecopyresampled ( resource $dst_image, resource $src_image, int $dst_x, int $dst_y, int $src ...
- 【代码学习】GD库中添加图片水印
函数 getimagesize() bool imagecopymerge( resource dst_im, resource src_im, int dst_x, int dst_y, int s ...
- 【代码学习】GD库中简单的验证码
大体思路: 代码部分: <?php //1.创建画布 $img = imagecreatetruecolor(100,30); //2.设置颜色 值越小,颜色越深 $color1 = image ...
- Java 代码学习之理解数据类型中的坑
package dailytest; import org.junit.Test; public class DataTypeTest { /** * 当有字符串第一次参与运算后,+成了连接符的作用 ...
- OGRE的学习资源
本文介绍从哪儿开始学习OGRE(Object-Oriented Graphics Rendering Engine的简称,又叫做OGRE 3D),如何在网上找寻OGRE的学习资源. 首先是wikipe ...
- 用Ogre实现《天龙八部》场景中水面(TerrainLiquid)详解
本文主要讲的是<天龙八部>游戏中水面(TerrainLiquid)的具体实现,使用C++,Ogre1.6. 天龙的水面做的比较简单,虽然没有倒影,但动态纹理+深度图做出的效果还行,看着不是 ...
- 学习Git的一点心得以及如何把本地修改、删除的代码上传到github中
一:学习Github的资料如下:https://git.oschina.net/progit/ 这是一个学习Git的中文网站,如果诸位能够静下心来阅读,不要求阅读太多,只需要阅读前三章,就可以掌握Gi ...
- [持续更新] Python学习、使用过程中遇见的非代码层面知识(想不到更好的标题了 T_T)
写在前面: 这篇博文记录的不是python代码.数据结构.算法相关的内容,而是在学习.使用过程中遇见的一些没有技术含量,但有时很令人抓耳挠腮的小东西.比如:python内置库怎么看.python搜索模 ...
- SSH 框架学习之初识Java中的Action、Dao、Service、Model-收藏
SSH 框架学习之初识Java中的Action.Dao.Service.Model-----------------------------学到就要查,自己动手动脑!!! 基础知识目前不够,有感性 ...
随机推荐
- Ubantu下面命令听歌(豆瓣fm)
在Linux下一直是不太方便的事情,下面推荐一个方法: 终端中输入以下命令安装豆瓣fm: >> sudo pip install douban.fm >> sudo apt-g ...
- Asp.net_完美设置页面最小宽度(兼容ie)
div+css的布局相比table布局简化了前端开发的复杂性,也会带来一些问题,现在我们就说一下浮动定位在页面大小改变时布局错位的解决办法,给页面设置最小宽度: 只需更改全局css样式表 body { ...
- Python基础11- 函数之自定义函数
自定义函数语法结构:def fun1([x],[y],....): 语句1 语句2 使用def语句来定义函数,在def后依次写出函数名.小括号.参数(可无).冒号,然后缩进写函数体 1.无参函数:de ...
- SIFT特征提取分析
SIFT特征提取分析 sift 关键点,关键点检测 读'D. G. Lowe. Distinctive Image Features from Scale-Invariant Keypoints[J] ...
- HTTP协议---HTTP请求中的常用请求字段和HTTP的响应状态码及响应头
http://blog.csdn.net/qxs965266509/article/details/8082810 用于HTTP请求中的常用请求头字段 Accept:用于高速服务器,客户机支持的数据类 ...
- 使用CSS3的appearance属性改变元素的外观
昨天在和同事一起完成项目的时候,我使用了appearance来渲染select,但是在firefox下出现问题,不完美,最后去除了.但还是要学习下这个属性.大家都知道每个浏览器对HTML元素渲染都不一 ...
- ACM Arithmetic Expression
Description Given N arithmetic expressions, can you tell whose result is closest to 9? Input Line 1: ...
- Hibernate4Maven
How to create a Maven project with Hibernate libs? This blog will be a demo to describe this issue. ...
- MongoDB 用户配置
====[安装]====DOS下切换到文件所在盘符 例如 D:\MongoDB\bin设置数据库保存位置 mongod.exe --dbpath D:\MongoDB\Data [--auth]//用 ...
- CentOS 6.5/6.6 安装mysql 5.7 最完整版教程
Step1: 检测系统是否自带安装mysql # yum list installed | grep mysql Step2: 删除系统自带的mysql及其依赖命令: # yum -y remove ...