水波模拟算法范文

2024-07-27

水波模拟算法范文(精选3篇)

水波模拟算法 第1篇

Green-Naghdi理论的全非线性浅水波数值模拟

Green-Naghdi (G-N) theory is a fully nonlinear theory for water waves. Some researchers call it a fully nonlinear Boussinesq model. Different degrees of complexity of G-N theory are distinguished by “levels” where the higher the level, the more complicated and presumably more accurate the theory is. In the research presented here a comparison was made between two different levels of G-N theory, specifically level Ⅱ and level Ⅲ G-N restricted theories. A linear analytical solution for level Ⅲ G-N restricted theory was given. Waves on a planar beach and shoaling waves were both simulated with these two G-N theories. It was shown for the first time that level Ⅲ G-N restricted theory can also be used to predict fluid velocity in shallow water. A level Ⅲ G-N restricted theory is recommended instead of a level Ⅱ G-N restricted theory when simulating fully nonlinear shallow water waves.

作 者:赵彬彬 段文洋 Bin-bin Zhao Wen-yang Duan 作者单位:刊 名:船舶与海洋工程学报(英文版)英文刊名:JOURNAL OF MARINE SCIENCE AND APPLICATION年,卷(期):9(1)分类号:U6关键词:Green-Naghdi theory Boussinesq model fully nonlinear water waves shoaling waves

水波模拟算法 第2篇

1、海水波光粼粼,候鸟歌声阵阵。

2、我们可以看一下池塘表面上的水波。

3、海水波荡。

4、作为一种力学比拟,我们可以想象海滩上被水波移动的卵石。

5、向倾斜着的海滩接近的水波为我们提供了一幅明显的折射图像。

6、北风呼呼地吹着,但这里,在峭壁的遮掩下却风平浪静,水波不兴。

7、我思念着勃莱特,我的思路不再零乱,开始好象顺着柔滑的水波前进了。

8、海湾水波不兴,宛如一个湖泊,只有一些海鸥在海边上空旋转,啼叫,整个地区是一片肃静、荒凉。

9、水波可以严重干扰游泳选手的比赛成绩。

10、求解浅水波方程的半离散中心迎风方法

11、浅水波在多孔弹性介质海床上的传播

12、当他发牢骚时,水波动着有礼貌地倾听着。

13、广义浅水波方程解的整体存在性

14、有人说,爱是河流,水波荡漾,浸没柔弱的芦苇

15、浅水波方程新的多孤子解

16、微风使海面水波荡漾。

17、基于划分方法的浅水波方程并行求解的实现

18、在盘中之水波光?巡,海中之水深沉幽奥

19、在这宁静宽广水波里

20、但现在又出现了更多的水波纹,一位对手出现了。

21、非线性浅水波在不连续点的传播

22、中间的韩国记者在大叫,做着水波的动作。

23、如水波纹、荔枝纹、双斜纹等

24、水波将蹑足来吻你的颈项,在你耳边低语。

25、水波系统解的渐近性

26、可渗透型结构的非线性水波绕射作用问题

27、维广义浅水波方程类孤子解和类周期解

28、维扩散长水波方程的衰变解和其它精确解

29、色散长波方程和变形色散水波方程特殊形状的多孤子解

30、一般变系数耗散长水波方程的精确解

31、水波活动的形式与光的传达形式有类似之处。

32、水波流动的方式与光的传播方式有相似之处。

33、针对浅水波方程

34、当天你在静止水波里相伴曾热爱还是甜蜜到太闷

35、当水波经过时,在水面上下浮动的软木不会随水漂走。

36、两艘轮船停泊在水波不兴的海面上,我以为它们是海上的鬼怪。

37、锦涤水波纹

38、流中水平无旋浅水波与大圆柱相互作用

39、在哈密顿体系下水容器内非线性浅水波理论和实验方法

40、水波不兴的湖面就像一面清澈的镜子,为高高挺立的群山所环抱。

41、三维二阶水波绕射问题的有限元时域计算

42、最精彩的有水底圆形鱼场,有360度的橱窗在水波之下、河獭。

43、通过浅水波的物理模型,我们可以自动地模拟水波的运动。

44、把引力波想象成投入池塘中的石头引起的水波可能会帮助理解。

45、即西卡蒙水波。产于欧洲。色泽白皙光洁,呈现光水影的效果。

46、就像池塘中的水波,引力波在产生后的传播过程中也会损失能量。

47、Burgers方程和whitham ? broer ? kaup浅水波方程组为例来说明这一方法。

48、如果我们观察水波的横截面,我们会看到波形是按一定的间隔重复的。

49、摘要浅水波周期保持常值,而波长缩减时其计算需进行迭代。

水波模拟算法 第3篇

使用着色语言的一般做法是:用着色语言编写若干Shader作为脚本, 应用程序直接或者通过图形引擎间接来调用图形函数库 (Direct3D与OpenGL) 的相关API函数实现Shader脚本的读入、编译和运行。渲染开始后, 多个Shader在GPU中运行, 承担流水线的某些环节, 完成画面的绘制。

为提高开发效率, 本文采用图形引擎OGRE来实现对Shader的编译和驱动。OGRE (Object Oriented Graphics Engine) 是一个扩展性强、跨平台的通用3D图形引擎, 隐藏了底层图形函数库的所有细节, 提供了一组面向场景的接口, 应用OGRE可以更加便捷地显示动态3D模型, 构建场景和开发三维应用程序。

1 软件结构设计

整个软件的结构是:用波形构造原理编制水波模拟的顶点着色器和像素着色器代码, 部分运用了物理模型。以脚本形式放在OGRE的资源路径, 在应用程序中创建水面网格模型。模型的材质脚本中加入水面纹理和着色器声明。程序运行时, OGRE引擎读入水面网格的材质脚本, 以此装载着色器, 实现水波模拟。

1.1 应用程序框架

为简明计, 应用程序主框架类WaveApplication继承自OgreSDK中的ExampleApplication类, 应用程序所有工作放在重写的WaveApplication::createScene () 方法里, 该方法首先创建一个平面 (Ogre::Plane) , 从平面生成mesh文件, 进而生成水面实体 (Ogre::Entity) , 用Entity::setMaterialName () 方法载入水面材质脚本。

1.2 水面材质脚本

水面网格的材质脚本中包含了对着色器声明的引用和水面纹理, 如下:

material SimpleWaveMaterial // 水面材质名字

{ technique

{ pass

{ // 顶点着色器声明 (见节1.3) 的引用

vertex_program_ref SimpleWaveVS

{ // 顶点着色器的各种参数

param_named BumpScale float 0.2

param_named textureScale float2 25 26

// 波浪在两个方向上的传播速度

param_named bumpSpeed float2 0.015 0.005

// 波形的时间参数, 每一帧由应用程序进行更新

param_named_auto time time_0_x 100.0

// 基波频率和振幅

param_named waveFreq float 0.028

param_named waveAmp float 1.8

}

// 像素 (片段) 着色器声明 (见节1.3) 的引用

fragment_program_ref SimpleWaveFS

{ // 像素着色器参数

param_named deepColor float4 0 0.3 0.5 1.0

param_named shallowColor float4 0 1 1 1.0

param_named reflectionColor float4 0.95 1 1 1.0

param_named reflectionAmount float 1.0

param_named reflectionBlur float 0.0

param_named waterAmount float 0.3

param_named fresnelPower float 5.0

param_named fresnelBias float 0.328

param_named hdrMultiplier float 0.47

1 }

texture_unit // 波形纹理

{ texture waves2.dds

tex_coord_set 0

filtering linear linear linear

}

texture_unit //与天空盒共用的立方体纹理

{ cubic_texture morning.jpg combinedUVW

tex_address_mode clamp

tex_coord_set

1 filtering linear linear linear

}}}}

水面纹理是两个纹理单元的混合, 实现天水一色效果, 纹理图片如图1所示:

1.3 着色器声明

着色器声明脚本的作用是将着色器源码文件名, 着色器函数入口地址和着色器需要的硬件配置信息通知OGRE引擎。

vertex_program SimpleWaveVS cg

{ // 顶点着色器脚本文件名

source SimpleWaveHLSL_Cg.vert

entry_point main // 入口地址

profiles vs_1_1 arbvp1 // 配置信息

default_params // 默认参数

{ param_named_auto WorldViewProj worldviewproj_matrix

param_named_auto eyePosition camera_position_object_space

}}

fragment_program SimpleWaveFS cg

{ source SimpleWaveHLSL_Cg.frag

entry_point main

profiles ps_2_0 arbfp1

}

2 水波模拟的着色器

2.1 顶点着色器 (Vertex Shader)

着色器代码采用Cg语言编写。顶点着色器的作用是根据当前波形, 生成顶点位置信息、向对象空间转换的矩阵、法线贴图坐标, 联同摄像机位置信息, 输出至像素着色器。顶点着色器代码如下:

struct VS_INPUT // 顶点着色器的输入结构

{ float4 Position : POSITION;

float2 TexCoord : TEXCOORD0;

};

struct VS_OUTPUT // 顶点着色器的输出结构

{ float4 Position : POSITION;

// 切空间到世界空间的转换矩阵

float3 rotMatrix1 : TEXCOORD0;

float3 rotMatrix2 : TEXCOORD1;

float3 rotMatrix3 : TEXCOORD2;

float2 bumpCoord0 : TEXCOORD3;

float2 bumpCoord1 : TEXCOORD4;

float2 bumpCoord2 : TEXCOORD5;

float3 eyeVector : TEXCOORD6;

};

struct Wave { // 正弦波数据结构

float freq; float amp; // 频率和振幅

float phase; float2 dir; // 相位和方向

};

VS_OUTPUT main (VS_INPUT IN, // VS入口函数

uniform float4x4 WorldViewProj,

uniform float3 eyePosition,

uniform float BumpScale,

uniform float2 textureScale,

uniform float2 bumpSpeed,

uniform float time,

uniform float waveFreq,

uniform float waveAmp

)

{

VS_OUTPUT OUT;

Wave wave[2] = { // 基波和谐波

{ 1.0, 1.0, 0.5, float2 (-1, 0) },

{ 2.0, 0.5, 1.7, float2 (-0.7, 0.7) }

};

wave[0].freq = waveFreq;

wave[0].amp = waveAmp;

wave[1].freq = waveFreq * 3.0;

wave[1].amp = waveAmp * 0.33;

float4 P = IN.Position;

float ddx = 0.0, ddy = 0.0;

float deriv;

float angle;

// 利用相位和频率不同的两个正弦波实现波浪的叠加

for (int i = 0; i

{ angle = dot (wave[i].dir, P.xz) * wave[i].freq + time * wave[i].phase;

P.y += wave[i].amp * sin ( angle ) ;

deriv = wave[i].freq * wave[i].amp * cos (angle) ;

ddx -= deriv * wave[i].dir.x;

ddy -= deriv * wave[i].dir.y;

}

// 生成从切空间到目标空间的转换矩阵

// 副法线和切线方向大小由输入参数 BumpScale 控制

OUT.rotMatrix1.xyz = BumpScale * normalize (float3 (1, ddy, 0) ) ;

OUT.rotMatrix2.xyz = BumpScale * normalize (float3 (0, ddx, 1) ) ; OUT.rotMatrix3.xyz = normalize (float3 (ddx, 1, ddy) ) ; // Normal

OUT.Position = mul (WorldViewProj, P) ;

// 计算法线贴图的坐标

OUT.bumpCoord0.xy = IN.TexCoord*textureScale + time * bumpSpeed;

OUT.bumpCoord1.xy = IN.TexCoord*textureScale * 2.0 + time * bumpSpeed * 4.0;

OUT.bumpCoord2.xy = IN.TexCoord*textureScale * 4.0 + time * bumpSpeed * 8.0;

OUT.eyeVector = P.xyz - eyePosition;

return OUT;

}

2.2 像素着色器 (Fragment Shader)

像素着色器对每个像素的法线贴图坐标从切空间转换到世界空间, 实现天空和水波的纹理混合, 根据菲涅尔效应进行修正, 最终生成每个像素的颜色。

struct FS_INPUT // 像素着色器输入

{ float4 Position : POSITION;

float3 rotMatrix1 : TEXCOORD0;

float3 rotMatrix2 : TEXCOORD1;

float3 rotMatrix3 : TEXCOORD2;

float2 bumpCoord0 : TEXCOORD3;

float2 bumpCoord1 : TEXCOORD4;

float2 bumpCoord2 : TEXCOORD5;

float3 eyeVector : TEXCOORD6;

};

float4 main (FS_INPUT IN,

uniform sampler2D NormalMap,

uniform samplerCUBE EnvironmentMap,

uniform float4 deepColor,

uniform float4 shallowColor,

uniform float4 reflectionColor,

uniform float reflectionAmount,

uniform float reflectionBlur,

uniform float waterAmount,

uniform float fresnelPower,

uniform float fresnelBias,

uniform float hdrMultiplier

) : COLOR

{ // 输入的三组法线贴图坐标混合, 减小纹理重复的效果。

float4 t0 = tex2D (NormalMap, IN.bumpCoord0) * 2.0 - 1.0;

float4 t1 = tex2D (NormalMap, IN.bumpCoord1) * 2.0 - 1.0;

float4 t2 = tex2D (NormalMap, IN.bumpCoord2) * 2.0 - 1.0;

float3 N = t0.xyz + t1.xyz + t2.xyz;

float3x3 m; // 转换矩阵

m[0] = IN.rotMatrix1;

m[1] = IN.rotMatrix2;

m[2] = IN.rotMatrix3;

N = normalize ( mul ( N, m ) ) ;

// 反射效果计算

float3 E = normalize (IN.eyeVector) ;

float4 R;

R.xyz = reflect (E, N) ;

R.z = -R.z;

R.w = reflectionBlur;

float4 reflection = texCUBE, bias (EnvironmentMap, R) ;

// 高动态范围效果 (HDR)

reflection.rgb *= (reflection.r + reflection.g + reflection.b) * hdrMultiplier;

// 菲涅尔效应

float facing = 1.0 - max (dot (-E, N) , 0) ;

float fresnel = saturate (fresnelBias + pow (facing, fresnelPower) ) ;

float4 waterColor = lerp (shallowColor, deepColor, facing) * waterAmount;

reflection = lerp (waterColor, reflection * reflectionColor, fresnel) * reflectionAmount;

return waterColor + reflection;

}

程序运行后绘制的水波效果如图2所示:

3 结束语

本文采用基于构造的方法编写水波着色器, 实时绘制水波画面, 效果较好。着色器脚本被Ogre引擎调用, 在调试时, 可以很方便地修改脚本参数和配置而不用编译整个程序。将来可以修改着色器, 接受水面舰船模型的位置速度参数, 模拟实现航行尾迹效果。

摘要:水波模拟是虚拟场景真实感绘制的一项重要内容。归纳了水波模拟的原理和实现方式, 出于实时绘制速度因素的考虑, 应用高级着色语言通过开源图形引擎OGRE实现了利用可编程图形显示硬件来实现水波的绘制, 效果较为真实, 满足PC平台上虚拟场景实时绘制的需求。

关键词:水波模拟,着色语言,顶点着色器,像素着色器,虚拟现实,OGRE

参考文献

[1]杨怀平, 胡事民, 孙家广.一种实现水波动画的新算法[J].计算机学报, 2002 (6) .

上一篇:北兴公司上半年现场管理工作总结下一篇:真实有用的考研感想