基于像素误差实现地形LOD的一系列相关算法
LOD是指在实时运行状态下动态的改变物体网格的结构,以增加或减少物体的多边形数量.这种技术的目的是为了减少距离视线较远的物体的信息数据,减轻整个系统的负担.而当物体离视线越近时,该物体的多边形数量就会增多,使视觉效果不会下降.普通不规则物体的LOD是通过合并顶点,塌陷边等方式进行的.但对于有特殊结构的地形,LOD的方式有很大的改变.这几天作了一下这方面的东西.现在把关于地形LOD的相关算法,包括摄像机的基本投影算法作个总结.
地形在计算机图形学中通常是通过构造一个规则的(2^n +1) * (2^n + 1)的网格,在网格节点上导入地形高度数据而形成的.由于地形的网格结构非常规则.所以不适合利用通常的合并顶点等方式来改变它的多边形数量.常用的LOD算法是ROAM和QuadTree等.今天我不谈具体的LOD算法是怎么改变地形的网格结构的.而是谈谈在所有的地形LOD算法中通用的判断算法,简单的说就是判断一个局部的地形在什么时候应该改变网格结构.
如下图中的QuadTree算法,左下角的部分地形进行的细分.改变的地形结构.
判断算法分门别类,最常用的是对视点距离的判断和对局部地形表面的曲率的判断.其它还有对地形表面颜色对人眼视觉的影响度,地形对人眼的侧角度等更近一步的判断.但是后两种判断通常都是基于前面两种判断的结果集进行的.
视点距离判断非常简单,只需要判断地形网格节点相对于视点的距离,当小于某个阀值时,该顶点所在的局部就细分.反之,当距离够大时,该局部就合并成更简单的网格.减少要渲染的多边形数量.
对局部曲率的判断原理也很简单,如上图中,当顶点V0的实际高度V0’与它的原始高度V0在屏幕上的投影趋于相邻的像素点时.这样V0’其实可以近似的当成V0.当对地形的每个顶点都作同样的判断后,多边形的数据会明显的减少.
怎么判断V0和V0’在屏幕上投影的距离呢.这牵扯到很多东西,下面一一列出.
首先当然是投影算法. 在计算机图形学中,摄像机的原型是这样的
Near平面又叫投影面,一个物体在投影面的坐标就是从Eye出发一条通过该物体的射线,这条射线与Near平面的交点.
假设摄像机的3个方向轴(图中箭头)为R(ight),D(irection),U(p),如果将这3个向量正交化,那[R|D|U]就算一组标准正交基,我们假设物体在摄像机坐标系中是(X0,Y0,Z0),由于世界坐标系的标准正交基是单位矩阵,则它在世界坐标系的坐标是[R|U|D]*(X0,Y0,Z0) + E E是Eye的坐标.这里我用的是基于OpenGL的左乘规则,对向量的线性变换是用矩阵乘以
向量.如果是Direcx,应该是(X0,Y0,Z0) * [R|U|D]^T + E. 因此一个世界坐标系的向量可以通过下式转化为摄像机坐标系的向量. Y = R^T ( X – E);
利用一个4X4的齐次矩阵,我们可以把上诉变换转换为一个矩阵来表示.由于[R|U|D]^T的每一列是单位正交的,可以看成一个3X3旋转矩阵 R,则齐次矩阵可以化为
这个就是我们常说的View矩阵.当它乘以一个叫Model的矩阵后,就是OpenGL中更让人熟知的GL_MODELVIEW矩阵.
Model矩阵的相关原理不在本篇祥述.
今天到此为止,明天继续