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. Js+XML 操作

    xml文件Login.xml如下. 复制代码 代码如下: <?xml version="1.0" encoding="utf-8" ?> <L ...

  2. BFS HDOJ 2102 A计划

    题目传送门 题意:中文题面 分析:双层BFS,之前写过类似的题.总结坑点: 1.步数小于等于T都是YES 2. 传送门的另一侧还是传送门或者墙都会死 3. 走到传送门也需要一步 #include &l ...

  3. LaunchCharacter

    /** Set a pending launch velocity on the Character. This velocity will be processed on the next Char ...

  4. git 学习笔记5--rm & mv,undo

    rm 删除文件 rm <file> #Unix删除文件 git rm <file> # git删除文件 git rm -f <file> # git强制删除文件 g ...

  5. URAL1996 Cipher Message 3(KMP + FFT)

    题目 Source http://acm.timus.ru/problem.aspx?space=1&num=1996 Description Emperor Palpatine has be ...

  6. WPF:在ControlTemplate中使用TemplateBinding

    A bit on TemplateBinding and how to use it inside a ControlTemplate. Introductio Today I'll try to w ...

  7. CF# Educational Codeforces Round 3 F. Frogs and mosquitoes

    F. Frogs and mosquitoes time limit per test 2 seconds memory limit per test 512 megabytes input stan ...

  8. [转]crontab环境变量设置

    原文连接:http://blog.csdn.net/zc02051126/article/details/20480289 come from http://www.360doc.com/conten ...

  9. js的隐含参数(arguments,callee,caller)使用方法

    在提到上述的概念之前,首先想说说javascript中函数的隐含参数: arguments arguments 该对象代表正在执行的函数和调用它的函数的参数.[function.]arguments[ ...

  10. vsfptd

    如果想通过vsftpd来在主机和虚拟机之间拿数据,可以通过这种方法: 在主机的资源管理器中输入:ftp://虚拟机里面Linux的IP(如192.168.2.112)/ 如果反过来,需要如下:ftp: ...