水波演示程序:
ScreenShot
这个水波模拟程序和其它常见的算法不太一样。这是用虎克定理来近似模拟水波波动的。具体的算法如下。
我们知道,当水面是平静的是时候。也就是说水面各点处于平衡位置时候。水面上的任何点的受力都是平衡的。但是有任何的扰动发生,就会有点偏离平衡位置。受力也就会不平衡,即会产生加速度。由于这些点受力是遵守虎克定理的,如果知道某一刻水面的状态,理论上,我们可以精确的计算出任何时候的水面状态(外干扰为0)。
当然在我们的程序里,计算是不需要精确的。否则我们得建立复杂的微分方程……。我们在这里做如下的假设:一)水面上的点是离散的。二)一个点在dt的时间里受力是相同的。三)一个点受力只和周围的8个点有关。有了这样的三个假设,我们就可以建立我们的物理近似模型了。
首先,我们来计算一个点的受力和他们周围点的位置的关系。设某个时刻S点的位移为S,速度为Vs
S点的受力 Fs = k * b * [(B1+B2+B3+B4) - 4 * S ] + k * a * [(A1+A2+A3+A4)-4*S]。k为虎克系数。a,b分别是两种距离点上的权系数。(距离不一样,效果当然不一样了。)
所以在这一刻,S 点的加速度就是 a = Fs * dm (dm是水的质量。)。 下个时刻S点的速度就是Vs2 = Vs - a * dt (dt为时间间隔)。下个时刻的惟一为 S2 = S + Vs2 * dt (dt为时间间隔)。
一切都准备好了。现在该是我们实现程序的时候了。水面上的点的位移可以由一个数组来保存起来。我们需要两个数组来保存位移,一个保存当前的位移,一个用来计算下一刻的位移(计算的时候要用到当前的位移)。同时还要有一个数组来保存当前的速度。在程序里,我们计算加速度的时候,可以把dt假设成1。这样可以提高速度。同时可以把dm*k当成一个数就可以了。注意的是,如果这些常数取的不好,就得不到你想要的结果。在我的程序里,dm*k=1。b=1。a=3。dt=1。其次我们还要对水波进行衰减,不然你的水波就停不下来了:-)。水波的扩散具体的代码如下:
void RippleSpread()
{
for(int y=1;y<H-1;y++)
for(int x=1;x<W-1;x++)
{
int a =( 16*pBack[y][x]-
(3*pBack[y-1][x]+
3*pBack[y+1][x]+
3*pBack[y][x-1]+
3*pBack[y][x+1]+
1*pBack[y-1][x-1]+
1*pBack[y-1][x+1]+
1*pBack[y+1][x+1]+
1*pBack[y+1][x-1])
)/16;
pV[y][x] -= a;//计算下一刻的速度
pV[y][x] -= pV[y][x]>>6;//速度的自动衰减
pFront[y][x] =pBack[y][x] + pV[y][x];//下一刻的位移
pFront[y][x]-= pFront[y][x]>>8;//位移的衰减
}
//交换缓冲区
int (*pTemp)[W]=pFront;
pFront=pBack;
pBack=pTemp;
}
最后,我们要根据水面位移的数据来渲染水波。我们知道水面波动后,是有坡度的,我们真正好可以用坡度扭曲图象来产生水波的效果。做法如下。对水面上的任何一个点(X,Y)。算出offsetX和offsetY。然后把图象中(X+offsetX,Y+offsetY)里的数据拷贝到该位置就可以了。这里给出了渲染的代码:
void RenderRipple()
{
int xoff,yoff,nx,ny;
COLOR cl;
DRAWSTRUCT ds;
DRAWSTRUCT dst;
BeginDraw(&dst,lpDDS_Texture);
BeginDraw(&ds,lpDDS_Back);
for(int y=1;y<H-1;y++)
{
for(int x=1;x<W-1;x++)
{
xoff=pFront[y][x+1]-pFront[y][x-1];
yoff=pFront[y-1][x]-pFront[y+1][x];
nx=x+xoff/10;
ny=y+yoff/10;
if(nx>=W) continue;
if(nx<0) continue;
if(ny>=H) continue;
if(ny<0) continue;
GetColor(dst,nx,ny,&cl);
SetColor(ds,x,y,&cl);
}
}
EndDraw(lpDDS_Texture);
EndDraw(lpDDS_Back);
}
分享到:
相关推荐
"源码":意味着这里的资源是可供研究、学习、修改或再利用的原始编程代码,对于开发者来说具有很高的价值。 【文件名分析】 "虎克源码":这是压缩包内的主要文件,很可能包含了整个对战平台的源代码文件夹或文件...
《虎克对战平台 v 3.7 源码解析与技术探讨》 虎克对战平台,作为一款在游戏社区中广受欢迎的对战平台,其版本v3.7的发布引起了开发者和游戏玩家的高度关注。特别是这次伴随源码的公开,为深入理解平台的运行机制和...
【标题】"虎克对战平台校园V2.3"是一个专为学生设计的游戏对战平台,包含了客户端软件、服务端程序以及相应的源代码。这个版本可能是针对校园网络环境优化的,旨在提供流畅、安全的在线游戏体验。平台可能包含了各种...
6. **文件编码问题**:文件名“»¢¿Ë”可能由于编码不兼容或显示问题导致,用户需要使用正确的工具或方法来解码和访问这些文件,以确保能正常使用虎克平台。 7. **安全与隐私**:在下载和安装任何平台时,用户应...
【标题】"虎克3.4对战源代码"指的是一个特定版本的“虎克”游戏的对战模式的源代码,版本号为3.4。在编程和游戏开发领域,源代码是程序的原始编写形式,包含了程序员编写的指令,可以被编译器或解释器转化为可执行...
在这个上下文中,它可能是虎克对战平台2.1的安装文件,用户需要使用解压工具(如WinRAR)来解压并安装。 在使用此类对战平台时,用户应关注以下几个知识点: 1. **兼容性**:确保平台与你的操作系统兼容,例如...
【标题】"虎克对战平台 局域网上的浩方"揭示了这款软件的核心功能,即在局域网环境中提供类似浩方对战平台的游戏联机服务。浩方对战平台是早年间非常流行的一款游戏对战工具,主要用于支持各种多人在线竞技游戏的...
【标题】:“虎克校园个人对战平台!”是一款专为学生设计的在线竞技对战平台,类似浩方平台,提供个性化的游戏体验。 【描述】:这个平台的设立旨在为校园内的游戏爱好者提供一个便捷、自有的竞技环境,与浩方平台...
(注意:内核库仅供开发人员使用,普通用户请用校园版)。 虎克对战平台校园版是基于NetHOOK API开发的一套非常简洁、高效的免费对战平台,包含客户端和服务器,并且客户端是开源项目,大家可以使用此平台轻松搭建...
5. 源码管理:开发人员可能会使用Git或其他版本控制系统来管理和协作源码,保证代码的质量和一致性。 6. 开发工具与框架:对战平台的开发可能涉及各种编程语言(如C++、Java、Python等),以及相关开发工具和框架,...
【标题】"虎克对战平台源代码,基于inlinehook" 涉及的主要知识点是游戏对战平台的开发和inlinehook技术的应用。这是一份关于构建网络对战平台的源代码,它利用了inlinehook这一技术来实现特定功能。 【inlinehook...
【标题】:“虎克对战平台”是一款专为校园网络设计的在线对战平台,它...总的来说,“虎克对战平台”是一个专为校园网络设计的游戏对战解决方案,它通过优化的网络架构和自定义配置,为在校学生提供了独特的游戏体验。
《虎克船长游戏策划书》是一份详细阐述游戏开发全过程的重要文档,旨在为游戏开发者提供宝贵的参考。此策划书中涵盖了多个关键领域的内容,包括目标受众定位、系统需求、安装流程、帮助系统以及文档编制等多个方面,...
【标题】:“pny虎克盘16G量产工具SM3254AE芯片.rar”是一个针对PNY品牌16GB闪存盘的特殊维护工具,该工具主要用于对使用SM3254AE主控芯片的U盘进行量产修复和初始化操作。这款工具的目的是解决在日常使用中可能遇到...
游戏这个是南通大学的游戏平台能在上面玩游戏 感觉还是不错的
一款使用于局域网联机模式下的对战平台 让没有网的朋友们不在寂寞 主要用于校园网络系统
标题中的“行业分类-设备装置-一种虎克铰偏置的六自由度平台”表明了这个压缩包内容属于机械设备领域,具体是关于一种利用虎克铰设计的具有六个自由度的运动平台。六自由度平台通常用于模拟或再现物体在三维空间中的...
其中虎克API采用了delphi、VC、易语言等三种语言的开发测试例子及源码,已测试在cs1.6下完美使用。同时本资源整理补充了开发所需的编译环境和编译工具。 虎克API.rar 虎克校园版_Client3.4.rar 虎克校园版_Server...
格子波尔兹曼方法(Lattice Boltzmann method,LBM)和浸入边界方法(Immersed boundary method,IBM)皆为近年来发展的可替代Navier-Stokes(N-S)方程求解复杂流体力学问题的数值模拟方法。本文采用浸入边界-格子波尔兹曼...
更新信息 ----------------------------------- '+' = 增加新功能 '-' = 修复Bug或者减少功能 '*' = 增强功能或者改变功能 ----------------------------------- =================================== ...