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-----------------------------学到就要查,自己动手动脑!!! 基础知识目前不够,有感性 ...
随机推荐
- 原生 js 左右切换轮播图
使用方法: 可能很多人对轮播图感兴趣,下面奉上本人的 原生 js 轮播代码复制 js 到页面的最底部,样式在 css 里改,js 基本不用动,有什么不懂的可以 加本人 QQ172360937 咨询 或 ...
- 解决:未能加载文件或程序集“EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”
使用nuget管理程序包,有可能在不同时间安装不同版本的Entity Framework:在项目创建初期安装的是6.0.0.0版本,后来添加的类库,安装了6.1.1版本,所以出现这个问题. 解决办法: ...
- Codeforces 677E Vanya and Balloons(DP + 一些技巧)
题目大概说给一张地图,地图每个格子都有0到9中的某一个数字.现在要在一个格子放炸弹,炸弹爆炸后水柱有两种扩展方式,一种是上.下.左.右,另一种是左上.右下.右上.左下,且四个方向的长度都一样.问放哪个 ...
- EF框架step by step(6)—处理实体complex属性
上一篇的中介绍过了对于EF4.1框架中,实体的简单属性的处理 这一篇介绍一下Code First方法中,实体Complex属性的处理.Complex属性是将一个对象做为另一个对象的属性.映射到数据库中 ...
- EF框架step by step(3)—Code-First
CodeFirst是EF框架的第三种方式,也是最为复杂一种方式,本文将以EF4.1版本为基础,简要讲解一下用法,同时,也介绍DbContext的用法. 本文采用的示例仍然是前两篇采用的博客用户的示例. ...
- Mongoose学习参考文档——基础篇
Mongoose学习参考文档 前言:本学习参考文档仅供参考,如有问题,师请雅正 一.快速通道 1.1 名词解释 Schema : 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力 Model ...
- HDU 3089 (快速约瑟夫环)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3089 题目大意:一共n人.从1号开始,每k个人T掉.问最后的人.n超大. 解题思路: 除去超大的n之 ...
- Codeforces Round #243 (Div. 2) A. Sereja and Mugs
#include <iostream> #include <vector> #include <algorithm> #include <numeric> ...
- ACM Minimum Inversion Number 解题报告 -线段树
C - Minimum Inversion Number Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d &a ...
- BZOJ 1001 题解
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 18876 Solved: 4649[Submit][ ...