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-----------------------------学到就要查,自己动手动脑!!! 基础知识目前不够,有感性 ...
随机推荐
- Linux中cp覆盖不提示
cp覆盖时,无论加什么参数-f之类的还是提示是否覆盖,这在大量cp覆盖操作的时候是不能忍受的. 1. 把a目录下的文件复制到b目录 cp –r a/* b 2. 执行上面的命令时,b存在的每个文件都会 ...
- shell中命令之间数据的传递
1.管道 "|" ls | cat -n > out.txt 2. 子shell 2.1 子shell 说明 在shell脚本中可以用()操作符可以定义一个子shell #/ ...
- footer元素
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Rock-Paper-Scissors Tournament[HDU1148]
Rock-Paper-Scissors TournamentTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- unity meshrender理解
网格渲染器,其中unity里面多有的材质在渲染的时候都是会划分成三角形的,所以当添加一些物体的时候,例如3d text的时候,默认添加网格渲染器. 最常用的就是获取材质. 下面是一个利用网格渲染器获得 ...
- BZOJ3424 : Poi2013 Multidrink
详细做法以及证明请看论文<Hamiltonian paths in the square of a tree>. 首先将1到n的路径提取出来,作为主干. 定义毛毛虫为去掉叶子之后只有一条单 ...
- Hadoop Streaming框架使用(一)
Streaming简介 link:http://www.cnblogs.com/luchen927/archive/2012/01/16/2323448.html Streaming框架允许任何程 ...
- Hadoop学习笔记(2)
Hadoop序列化:Long 和Int---变长编码的方法: 如果整数在[ -112, 127] ,所需字节数为1,即第一个字节数就表示该值. 如果大于127,则第一个字节数在[-120,-113]之 ...
- doPost方法与doGet方法
例子我们发现forward跳转访问Servlet说不定的感觉,其实我们要想弄明白这个问题,就要从forward本身来研究了. 我们都知道 forward跳转是转发请求,不转发地址的,简单点说,forw ...
- hdu1019 Least Common Multiple
Problem Description The least common multiple (LCM) of a set of positive integers is the smallest po ...