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的计算的更多相关文章

  1. 【代码学习】GD库中图片缩印

    bool imagecopyresampled ( resource $dst_image, resource $src_image, int $dst_x, int $dst_y, int $src ...

  2. 【代码学习】GD库中添加图片水印

    函数 getimagesize() bool imagecopymerge( resource dst_im, resource src_im, int dst_x, int dst_y, int s ...

  3. 【代码学习】GD库中简单的验证码

    大体思路: 代码部分: <?php //1.创建画布 $img = imagecreatetruecolor(100,30); //2.设置颜色 值越小,颜色越深 $color1 = image ...

  4. Java 代码学习之理解数据类型中的坑

    package dailytest; import org.junit.Test; public class DataTypeTest { /** * 当有字符串第一次参与运算后,+成了连接符的作用 ...

  5. OGRE的学习资源

    本文介绍从哪儿开始学习OGRE(Object-Oriented Graphics Rendering Engine的简称,又叫做OGRE 3D),如何在网上找寻OGRE的学习资源. 首先是wikipe ...

  6. 用Ogre实现《天龙八部》场景中水面(TerrainLiquid)详解

    本文主要讲的是<天龙八部>游戏中水面(TerrainLiquid)的具体实现,使用C++,Ogre1.6. 天龙的水面做的比较简单,虽然没有倒影,但动态纹理+深度图做出的效果还行,看着不是 ...

  7. 学习Git的一点心得以及如何把本地修改、删除的代码上传到github中

    一:学习Github的资料如下:https://git.oschina.net/progit/ 这是一个学习Git的中文网站,如果诸位能够静下心来阅读,不要求阅读太多,只需要阅读前三章,就可以掌握Gi ...

  8. [持续更新] Python学习、使用过程中遇见的非代码层面知识(想不到更好的标题了 T_T)

    写在前面: 这篇博文记录的不是python代码.数据结构.算法相关的内容,而是在学习.使用过程中遇见的一些没有技术含量,但有时很令人抓耳挠腮的小东西.比如:python内置库怎么看.python搜索模 ...

  9. SSH 框架学习之初识Java中的Action、Dao、Service、Model-收藏

    SSH 框架学习之初识Java中的Action.Dao.Service.Model-----------------------------学到就要查,自己动手动脑!!!   基础知识目前不够,有感性 ...

随机推荐

  1. NOIP201103瑞士轮【B002】

    [B002]瑞士轮[B级]出自附中OJ————————————————————————————————————————————————————————————————————————————————— ...

  2. (转)POJ题目分类

    初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推. ...

  3. JavaScript无缝滚动

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. iOS学习21之UILabel, UITextField, UIButton, UIImageView

    1.UILabel 1> 概述 UILabel (标签): 是显示文本的控件.在App中 UILabel 是出现频率最高的控件 UILabel 是 UIView 子类,作为子类一般是为了扩充父类 ...

  5. mybatis 查询缓存问题

    <settings> <setting name="localCacheScope" value="STATEMENT" /> < ...

  6. ACM: 强化训练-Beautiful People-最长递增子序列变形-DP

    199. Beautiful People time limit per test: 0.25 sec. memory limit per test: 65536 KB input: standard ...

  7. 51Nod 1079 中国剩余定理 Label:数论

    一个正整数K,给出K Mod 一些质数的结果,求符合条件的最小的K.例如,K % 2 = 1, K % 3 = 2, K % 5 = 3.符合条件的最小的K = 23.   Input 第1行:1个数 ...

  8. [Cocos2D-x For WP8]ParallaxNode视差

    视差就是从有一定距离的两个点上观察同一个目标所产生的方向差异.从目标看两个点之间的夹角,叫做这两个点的视差角,两点之间的距离称作基线.只要知道视差角度和基线长度,就可以计算出目标和观测者之间的距离.游 ...

  9. 为什么我们要使用min-height和max-height样式属性?

    Css min-height应用地方解释我们有时设置一个对象盒子时候避免对象没有内容时候不能撑开,但内容多少不能确定所以又不能固定高度,这个时候我们就会需要css来设置min-height最小高度撑高 ...

  10. USACO 5.5 Picture(周长并)

    POJ最近做过的原题. /* ID: cuizhe LANG: C++ TASK: picture */ #include <cstdio> #include <cstring> ...