4.2水的建模
4.2.1 3D网格
用三维网格表示水可以让各种水行为的仿真成为可能。主要的想法很简单:我们确定受力情况并计算网格上所有元素的所受力的效果。虽然这些力很容易描述,但计算本身代价昂贵。物理模拟必须精确,但对于水表面来说,我们不必如此精确。如果不考虑计算的花销,那么三维网格可用于渲染的小面积的水,在这种情况下,例如, Navier - Stokes方程可以应用地很好。物理模拟超出了本文的范围,这里我只讨论实时渲染的解决方案。虽然三维网格在实时情况下只能表示少量的水,但预渲染的计算可以提高真实程度。绘制水下的纹理,刻蚀现象或水花溅起也能通过预渲染过程在实时动画中获得更高的性能。有几篇文章介绍了这种技术(如Deep-Water Animation and Rendering,http://www.gamasutra.com/view/feature/3036/deep_water_animation_and_rendering.php和Meshuggah Demo and Effect browser,http://meshuggah.4fo.de/OceanScene.htm ),但它们已超出了本文所讨论的范围。为了实现我们的目的,需要一个简单的描述水的方法。
4.2.2 2D网格– 高度图
三维网格水体比较精确的近似,但如果加上一些限制,我们可以使用一个简单的解决办法。为了绘制水面,我们只需要知道它的形状,在这种情况下,水面的高度对应某一给定的(x , y )坐标。这意味着,水体可以简化为一个高度场,该高度场使用一个有两个变量的函数返回给定二维空间中的点的高度。这种方法与三维网格相比会受到一些限制,因为函数只能返回一个值,一个高度场能返回给定(x,y)坐标的高度,这意味着重叠波可以无法通过这种方式加以描述,如图4-1所示:
与三维网格相比,二维网格的主要优势是它更容易使用,具有更简单的数据结构。如果高度场储存在一个纹理中,它通常被称为高度图。同样,渲染过程称为位移映射(displacement-mapping),因为原始的几何数据会根据高度图中所储存数据的大小发生偏移。
不同的优化技术可以有更好的实时性能。例如,如果高度图是由一个连续函数定义的,那么就不需要计算出整个水面,只渲染可见部分就足够了。在其他情况下,例如,在使用Navier - Stokes方程的时候,高度图的每个元素都需要更新,即使它们在相机中是不可见的。下面的段落会讨论一些优化方法。
发布时间:2009/4/16 下午2:32:17 阅读次数:6615