zoukankan      html  css  js  c++  java
  • 滴水效果模拟

    目标详解:

    本应用模拟滴水效果,尤其指的是远距离观察大量滴水的现象,比如下雨,水帘等。

    技术分析:

    首先从物理角度,模拟水滴在重力作用下的运动形式,这样决定了水滴的位置和速度;

    然后,从对环境的反射和折射角度,计算水滴的视觉呈现。

    技术细节:

    • 运动的物理建模

    关于水滴运动的物理建模,请参考这篇文章:Numerical model for the fall speed of raindrops in a rainfall simulator

    建模中考虑到的因素包括:重力Gravity, 流体阻力Friction。其中流体阻力的计算考虑了不同水滴尺寸下,阻力的不同计算公式,要完全理解需要一些流体力学的知识,我已经把流体力学课程的内容忘记干净了,这里只是对其中公式的简单套用。

    • 运动的数值计算方法

    以上文章中的公式没办法直接计算。我们使用了Runge-Kutta fourth-order solver方法,更新delta t时间间隔后的速度和位置。对于,RK4方法,请参考Wiki: http://en.wikipedia.org/wiki/Runge-Kutta

    • 水滴的生成和消亡

    本应用采用的粒子系统如下:

    首先,给定一个三维点作为粒子(即水滴)发生器,这个发生器每隔一段时间间隔产生一个新的水滴,水滴掉落到地面后就死亡。

    然后,在场景中,安放任意数量的粒子发生器即可。比如,要形成水帘的效果,可以在一条直线上安放距离间隔相等的一定数量的发生器。

    根据这一步的结果来看,模拟效果不够自然,所以做了些调整。第一,粒子发生器产生的水滴位置加了一个随机偏移值,用于模拟自然环境中,即使是同一位置产生的水滴,也会有位置偏差。第二,粒子的产生时间间隔,也加了随机值,消除可观察到的规则运动模式。

    • 视觉呈现

    我发现,到此时,还缺少一种水滴的材质感。

    最初的尝试,是使用水滴或圆形的纹理,让每一个粒子呈现水滴状。但是效果不好。于是意识到整体的效果更重要,单独水滴的效果在这个应用中,不属于决定性因素。

    最后的解决方法是,给一个三维场景,更重要的是,添加一个点光源,用于突出水滴的反射和折射效果(用于突出水滴的材质)。

    具体来说,每一个水滴,呈现的颜色由两部分决定,一个是反射,一个是折射。如果通过反射或折射能够到达点光源,那么它的亮度将主要由灯光决定;否则,它的亮度由环境颜色决定。

    最后,考虑视觉暂留因素,效果就是,速度越快的水滴,拖尾越长。

    代码实现

    本来想用DX11,全部计算都放到GPU上做。可惜我的显卡不支持。

    最终,粒子的物理运动计算还是放在了CPU上。为了实现CPU计算和GPU计算的并行性,CPU和GPU的计算相差一帧,GPU渲染的是上一帧CPU的计算结果。

    最终效果

    下载地址

    https://files.cnblogs.com/mchz/Droplets_Demo.rar

    运行环境要求

    WinXP SP2 or Higher
    DirectX11 Runtime & DirectX10 Supported Video Card
    VS2012 Runtime(https://files.cnblogs.com/mchz/vcredist_x86.rar)

  • 相关阅读:
    BZOJ 2212/BZOJ 3702
    BZOJ 4761 Cow Navigation
    BZOJ 3209 花神的数论题
    BZOJ 4760 Hoof, Paper, Scissors
    BZOJ 3620 似乎在梦中见过的样子
    BZOJ 3940 Censoring
    BZOJ 3942 Censoring
    BZOJ 3571 画框
    BZOJ 1937 最小生成树
    BZOJ 1058 报表统计
  • 原文地址:https://www.cnblogs.com/mchz/p/3506241.html
Copyright © 2011-2022 走看看