码迷,mamicode.com
首页 > 其他好文 > 详细

海洋模拟

时间:2015-05-31 13:38:04      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

本文基于[Jerry Tessendorf 2004]的方法对海洋动画进行了模拟

1、介绍

海面模拟是计算机图形领域研究前几年很热门的问题,也是一个挑战,在这方面的主要问题是对大面积开阔深水区域的模拟,在这种情况下使用传统模拟3D流体的方法将意味着极其巨大的网格,以及海量的运算,使用这种方法在普通的计算机上是几乎不可能模拟出来的。然而[Jerry Tessendorf 2004]提出的基于高度场y=h(x,z)的水面模拟,为普通计算机模拟海面提供了可能,甚至在现代大规模GPU计算下也能进行实时模拟。而我们对海面的视觉模拟则相对简单。

2、基于快速傅里叶变换的海面模拟

基于流体方程的模拟公式

对于大规模水域,远离海岸线的相对平静海面u被假设为无旋场,有,其中是某势场,根据不可压缩条件所以对其使用伯努利方程得到

技术分享

线性化方程

进一步假设u足够小且没有巨浪去掉二次项得

技术分享

定义海面为0高度有

U = gh

根据质量守恒有

技术分享

技术分享

设x=(x垂直,y),y指向水面之下有,那么可以假设表面方程有如下形式

技术分享

这个式子考虑左边因子为零有

技术分享

设压力为0有

技术分享(20)

联立上述两个方程有

技术分享(21)

方程(20)(21)最终描述了海面的运动

方程(21)两边同时求导,带入方程(20)最终得到

技术分享

为了解决技术分享这个不寻常的符号求两次导数,最后得到

技术分享

方程的解

我们给出一个特殊解分量形式:

技术分享

将这个式子带入原方程,得到

技术分享

这里k是index向量的模,对于这个方程我们取技术分享,这个值称为色散关系(Dispersion Relation)

再考虑xz方向边界条件具有周期性,使用NxN的网格来度量h的xz平面L是实际尺寸,那么在指定时间t网格索引为技术分享的点的高度为

技术分享

为了使得和项只有实数部分对Cos项经过变换即得

技术分享

式中h0项为波普参数,使用这个式子可以执行FFT来计算结果。

基于统计模型的海洋波普

对于上式的变换,[Jerry Tessendorf 2004]提出使用基于统计的现象模型,所以我们使用了一个海洋学统计模型Phillips spectrum,这个模型的所有原始数据来自于多年海洋学观察,优点是可以选择风速和风向,他的经验公式是:

技术分享

为了具有随机性我们使用高斯分布来取得随机波普:

技术分享

现在h0项已经有了明确的定义可以计算数据带入了,我们在核心代码部分给出计算代码。

基于GPU的快速傅里叶变换

 这个前面的博文已经讲过了就不再说了

FFT算法实现——基于GPU的基2快速傅里叶变换

2维FFT算法实现——基于GPU的基2快速二维傅里叶变换

 

光线跟踪

 

方法

 

在视觉仿真上相对简单的采用了光线跟踪的方法,使用光线跟踪的目的并不是使图像看起来更加真实,而是我的确只会使用管线跟踪来进行渲染,我们使用了pbrt渲染器来进行水面的渲染。

 

材质

 

在材质的选择上,选择了混合材质,使用了Lambertian BRDF来计算基本的漫反射SpecularReflection BRDF来计算高光反射其中还要计算非导体的菲涅尔反射,BTDF我们则使用SpecularTransmission。这个材质在pbrt中被高度参数化,在渲染时我们选择了如下参数:

 

漫反射颜色

0,0.1,0.15

高光反射颜色

0.9,0.9,0.9

散射颜色

0.1,0.1,0.1

粗糙度

0.9

折射率

1.34

 

关于pbrt嵌入这篇文章说过

 

【pbrt】使用openFrameworks调用pbrt

 

最后是结果:

技术分享

 

 

256X256Grid渲染海面

技术分享

512X512渲染海面

视频

海洋渲染动画视频

 

海洋模拟

标签:

原文地址:http://www.cnblogs.com/wubugui/p/4541812.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!