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)

  • 相关阅读:
    java对象的实例化过程
    关键字super
    方法的重写
    继承
    JavaBean
    this关键字
    类的构造方法
    四种访问权限修饰符
    封装和隐藏
    初入博客园——你我共勉,至我的准读者朋友们
  • 原文地址:https://www.cnblogs.com/mchz/p/3506241.html
Copyright © 2011-2022 走看看