前言

最近想做水面模拟,比较原始的方法是通过解wave function进行模拟,先看一下效果。


一、波动方程

使用的波动方程为:

其中z表示点(x,y)处t时刻的高度,v表示传播的速度。

因为水波随着时间的增大,会逐渐平息,这就需要一个有衰减项,固公式需要写为:

u为液体粘稠度,用以控制波在液体表面的存在时间。

为了方便起见,我们使用以下公式来计算z关于x的偏导数:

那么

这里使用dx替代2dx,则二次偏导写为

使用上述方法完成z对x,y,t的偏导计算并带入波动方程中,同时我们假设dx=dy=d, 最后解得:

我们令

故有

mk的计算代码为:

float d = damping * dt + 2.0f;
float ed = speed * speed * dt * dt / dx / dx;
mk.x = (damping * dt - 2.0f) / d;
mk.y = (4.0f - 8.0f * ed) / d;
mk.z = 2.0f * ed / d;

二、大致流程

波动方程模拟水面的大致流程如下:

1、先创建好水面的网格,初始化的网格点y值均设为0;

2、每个一段时间对水面的随机位置进行触碰,对应的代码如下:

if (oceanTimef > oceanDisturbTime)
{int randX, randY;float randM;randX = rand() % (meshSize.x - 600);randX += 300;randY = rand() % (meshSize.y - 600);randY += 300;int tmpRand = rand() % 3;tmpRand++;randM = (float)tmpRand / 200.0f;ocean.disturb(randX, randY, randM);oceanTime = 0;
}

3、更新触碰后的水面高度,对应的代码如下:

void OceanWave::disturb(int x, int y, float magnitude)
{if (x > 1 && x < (oceanMeshSize.x - 1) && y>1 && y < (oceanMeshSize.y - 1)){float halfMag = 0.5f * magnitude;int index = y * oceanMeshSize.x + x;/*vertices[index].pos.y += magnitude;vertices[index - 1].pos.y += halfMag;vertices[index + 1].pos.y += halfMag;vertices[index - oceanMeshSize.x].pos.y += halfMag;vertices[index + oceanMeshSize.x].pos.y += halfMag;*/curHeight[index] += magnitude;curHeight[index + 1] += halfMag;curHeight[index - 1] += halfMag;curHeight[index + oceanMeshSize.x] += halfMag;curHeight[index - oceanMeshSize.x] += halfMag;checkCudaErrors(cudaMemcpy(preHeightDev, curHeightDev, numMapBytes, cudaMemcpyDeviceToDevice));checkCudaErrors(cudaMemcpy(curHeightDev, curHeight, numMapBytes, cudaMemcpyHostToDevice));}
}

4、程序运行的每一帧,都需要按照波动方程跟新水面的高度,对应的代码如下:

__global__ void updateHeightKernel(float* preHeight, float* curHeight, float* nextHeight, float3 mk, int2 meshSize)
{int idxx = threadIdx.x + blockIdx.x * blockDim.x;int idxy = threadIdx.y + blockIdx.y * blockDim.y;if (idxx < (meshSize.x - 1) && idxy < (meshSize.y - 1)){uint basicIndex = idxy * meshSize.x + idxx;if (idxx < 1 || idxy < 1)return;float mh = 0.0f;mh += mk.x * preHeight[basicIndex];mh += mk.y * curHeight[basicIndex];mh += mk.z * (curHeight[basicIndex + 1]+ curHeight[basicIndex - 1] +curHeight[basicIndex + meshSize.x] + curHeight[basicIndex - meshSize.x]);nextHeight[basicIndex] = mh;}
}

水面模拟--波动方程相关推荐

  1. Unreal Engine 4 基于网格的水面模拟实现

    http://blog.csdn.net/shangguanwaner/article/details/51862644 Unreal Engine 4 水面模拟实现 一般游戏里水面的模拟都是实用动态 ...

  2. [DirectX11]Gerstner波 实现简单的水面模拟

    上一篇文章中,介绍了一个简单数值方法来模拟圆形扩散波的效果,但是这种方法对于自然中像海浪一样的波 就无能为力了.所以,这篇文章介绍用Gerstner波来模拟水面波纹效果. 一.Gerstner波介绍 ...

  3. 使用OpenGL模拟水面

    本文会对一个基于波动方程来模拟水面实现的OpenGL程序进行分析.会给出程序基本组成,绘制流程示意图.并且对着色器中使用的原理进行推导并给出比较详细的注释. 前言 关于程序源代码,其中使用的着色器其实 ...

  4. 游戏中的实时水体模拟技术分享:波形叠加法与波动方程

    海洋,溪流,湖泊等水体的模拟在游戏中是十分常见的技术,每个开发人员或多或少都听说过几种制作水体的方法.不过想要把水体模拟做好,做出高质量,其中还是有很多值得注意的地方.这篇文章就是总结一下个人制作水体 ...

  5. shader 反射 水面_2D水面波光效果,以及一些2D常用shader的实现

    水面模拟是游戏行业的一个常见问题.在3D领域,水面模拟技术已经非常成熟,无论是unity也好,ue4也好,都有很多现成的代码可以直接拿来使用.不过在2D游戏中,水面模拟的开源实现还不是太多,跟3D完全 ...

  6. OpenGL结合水池模型的动态水面实战

    写在一次计算机图形学Project后的回顾 摘要:通过光照贴图(漫反射贴图)绘制为静态水面和水池模型添加纹理和光照,通过正弦波叠加的物理模型实现动态水面震动的效果! 注1:由于代码的很多部分都添加了汉 ...

  7. cesium结合shader系列之有倒影的流动水面

    有倒影的流动水面 若仅想实现动态水面效果,利用cesium的相关接口配置material的uniforms就可以实现了.但这种方式调配出的水面相对失真,无法实现现实水面具反射周围地物效果.为了更逼真的 ...

  8. flash与javacript:图片交互

    最近几天有点懒,其实有时候很想突破自己思维去写一点新的事物,例如最近看另一个水墨模拟,水面模拟,这些都让我感受震惊,有时候老外创造的思维和我们真有所不一样,flash 可以模拟力学,可以模拟软体,也可 ...

  9. 计算机图形学中需要掌握的数学基础知识有哪些?

    计算机图形学中使用了大量数学知识,尤其是矩阵和线性代数.虽然我们倾向于认为3D图形编程是紧跟最新技术的领域之一(它在很多方面确实是),但它用到的很多技术实际上可以追溯到上百年前,其中一些甚至是由文艺复 ...

最新文章

  1. 苹果向求职者抛出的8大难题
  2. 8核32g mysql性能_MySQL性能优化之参数配置
  3. linux下tomcat无法访问问题(换一种说法:无法访问8080端口)
  4. ifix如何设画面大小_天涯明月刀手游研发揭秘:如何做出有“豪华感”的国风MMO大世界?...
  5. 《objective-c基础教程》学习笔记(四)—— OC面向对象编程初探
  6. Opencv--undistortPoints()和cvUndistortPoints()
  7. python编程(python和c相互调用)
  8. a*算法matlab代码_10分钟带你入门MATLAB
  9. Bailian2753 菲波那契数列(POJ NOI0202-1755)【数列+记忆化递归】
  10. NNACL2021 放榜啦~
  11. oracle实现累加,oracle用sum函数实现累加
  12. java同步锁-详细易懂
  13. ISSCC 2017论文导读 Session 14 Deep Learning Processors,A 2.9TOPS/W Deep Convolutional Neural Network
  14. Houdini 官方HDA SideFX Labs 安装
  15. mac 批量删除word中的空白行
  16. 学习分享 | 适合初学者练习的C/C++开源项目
  17. python红楼梦人物词频统计_用 Python 分析《红楼梦》
  18. 单片机工程师需要掌握什么?单片机编程培训哪里有?
  19. python每个if条件后面都要使用冒号_Python基础:条件控制if
  20. 根据示波器存储的波形数据得到两列信号的相位差(MATLAB源码)

热门文章

  1. 子非鱼,安知鱼之乐?
  2. 好书推荐-《策略思维》
  3. SEO基础知识:什么是网站结构,为什么重要?
  4. SQL学习之-2.9 数据清理相关知识
  5. c语言程序设计 李俊,深入浅出C语言程序设计(第2版)习题集和编程指导
  6. 有备无患 婚宴发言经典串场词摘录
  7. python运势预测程序_基于Python的星座运势接口调用代码实例
  8. 云开发周公解梦微信小程序源码/支持流量主功能
  9. 亚马逊ERP系统是什么?他有什么用
  10. 在自动UNDO管理情况下,如何手工增加undo段