[材质贴图] 基于FFT的大规模海面的实现方法(上篇)

查看:1679 |回复:1 | 2019-5-28 07:42:46

您需要 登录 才可以下载或查看,没有账号?注册

x
简介
   为了构建动态海浪,利用Phillips频谱计算海浪频域的振幅值,通过IFFT将频域的振幅值变换到时域的高度值,从而构建海面高度场。因为Phillips频谱是从真实海洋中得到的统计数据,所以能够模拟出较高真实感的深海海浪。为了实现无限海面,本文采用投影网格的方式。
2_66349_be52a914030ff77.jpg
投影网格
一、大致算法:
1、 在投影空间创建一个规则的网格Grid(坐标在[-1,1])。
2、 将上一步骤创建的网格Grid投影到一个水平面Plane上。
3、 对网格Grid进行Displace(置换)。
4、 然后再将Grid变换回投影空间,输出屏幕。
2_66349_3107e8d7fd7c8b1.jpg

二、具体细节
1、怎么在投影空间创建一个规则的网格Gird呢?
我们知道一个模型要显示到屏幕上,需要经过世界变换->视图变换->投影变换->视口变换。我们创建的Grid是不需要经过世界变换和视图变换,因为它的x,y坐标是在[-1,1],z坐标值为0,已经是在投影空间了。
2、怎么将Grid投影到世界空间的一个水平面上呢?
   这个问题其实可以分为两个:
A、 怎么构建以网格的顶点坐标为起点,方向是指向水平面的射线(世界空间)?
B、 怎么求空间射线和平面的交点?

               其中dir.y不能等于0,若是等于0,射线就平行或是在水平面Plane上。


下面给出求空间线段与水平面Plane交点的代码:


三、算法的缺陷
1、Camera朝向水平面Plane的时候,该算法能很好地工作,但是当Camera的Look方向平行于水平面Plane或是夹角大于90°的时候,该算法就崩溃了,没法求出正确的交点,投影网格也就失效了。
  2、Camera的高度小于水平面Plane时,算法也出现问题。


  3、当投影网格用DisplacementMap进行偏移时,可能边缘会出现间隙


四、改进的方法


       我们必须想办法将投影网格固定在视截体内。并且投影网格要适当增大一些,以防止进行Displace时,边缘出现间隙。


   设定一个Displaceable,Displaceable是Camera的视截体与平面baseUp和平面baseDown的交集(图中以蓝线标记的区域)。为水平面Plane设定一个上限baseUp和一个下限baseDown,baseUp要>=水波的波峰,baseDown
<=水波的波谷,否则边缘会出现间隙。创建一个新的Camera,我们称之为Projector,我们为这个Projector制定一些约束条件:
1、  Projector始终朝向水面。
2、  Projector始终处在baseUp的上面。


上面提到的两个约束条件都很容易实现,这里就不再复述了。比较难的是,要求出投影空间网格Grid与水平面Plane的交点,就需要先得到Projector的ViewMatrix和ProjectMatrix,ViewMatrix可以很容易得到,那么怎么得到ProjectMatrix呢?算法如下:


如上图所示,
1、  求出A、B、C、D、E、F、G、H八个交点,并且加入到列表List中
2、  判断Camera的视截体NearClip和FarClip的八个顶点是否在BaseUp和BaseDown之间,是的话,也加入列表List中。
3、  此时List中的顶点就是Displaceable的顶点。
4、  将List表中的顶点投影到水平面上Plane(其实就顶点的y坐标值等于水平面Plane的y坐标值)。


5、  将上述4步骤得到的顶点坐标变换到一个投影空间



    然后得到最大的MaxProj和最小的MinProj,如果是以水平面Plane计算交点的话, MaxProj和MinProj都会是在[-1,1]的范围,但是以BaseDown和BaseUp计算的交点的话,那么MaxProj和MinProj的值域会稍稍超出[-1,1]。那么我们下一步就是要做一个修正,就是要将Camera投影空间的Grid坐标变换到[MinProj,MaxProj]这个范围内,这样我们构建的射线就由RayOri变成了RayNew,这样就能可控地(设定baseUp和baseDown)扩大了投影网格的范围。如下图所示:

图片:8.png




评分

参与人数 3元素币 +4 活跃度 +28 展开 理由
大西几 + 4 + 10 很好,很强大
七濑丸 + 10 这个厉害了
诺一 + 8 支持一下!

查看全部评分

2019-5-28 07:42:46  
 赞 赞 0

使用道具 登录

1个回答,把该问题分享到群,邀请大神一起回答。
2#
资源甚好,且行且阅读
回复 收起回复
2019-5-28 10:03:17   回复
 赞 赞 0

使用道具 登录

CG 游戏行业专业问题

图文教程技术文章技术文库3D建模
显示全部 9
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表