注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

豆芽兵的生存探索

因,记录。留下历史,看到未来...

 
 
 

日志

 
 

RealFlow 翻译教程之——简单的烟(二)  

2011-12-05 22:52:06|  分类: RealFlow探索 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
RealFlow 翻译教程之——简单的烟(二) - 豆芽兵 - 豆芽兵的天地
 

简单的涡流,漩涡

更新(Oct.212011

我们检测到脚本中有一个小错误。估计你们中大部分人已经纠正了这个bug,但对那些不太熟悉Python的人还是有必要的。PDF已经做了更新。

旧版本


if (scene.getAxisSetup() = AXIS_SETUP_YXZ):



forceVec= Vector.new(0, stokesForce, 0)


else:



forceVec= Vector.new(0, 0, stokesForce)




particle.setExternalForce(vortexVec)



正确版本


if (scene.getAxisSetup() == AXIS_SETUP_YXZ):



vortexVec= Vector.new(0, stokesForce, 0)


else:



vortexVec= Vector.new(0, 0, stokesForce)




particle.setExternalForce(vortexVec)

(译者注:其实就是(scene.getAxisSetup() == AXIS_SETUP_YXZ) 中赋值符号(=),改为等于号(==

更新(11.15.2011

正确的PDF已经放在下载区了,还包含了了RFS文件。这个文件可以直接载入RealFlow。还可以复制相关脚本,到场景的脚本辅助器(scripted  daemon)中。

非常抱歉给你造成的不便,但有时一些很小的错误,无论你一个人检查多少遍都找不出来。感谢你的理解。

旋转和漩涡在RealFlow平台是不太容易实现的,大部分要借助第三方工具或三维软件的插件。当然这些工具运用高度复杂的算法和功能去实现绝对逼真的烟雾,但有时候差不多的效果就足够了,例如远处的烟雾或预渲染时。

这个免费教程是非常基础的,但也是非常快的方法做到烟雾上升效果。您将了解如何使用基方程,它们放入一个脚本创建卷曲/紊乱的粒子。这个简短的讨论,实际就是像你在玩一样,你可以添加自己的拓展,获得更自然的结果,因为本身这种方法有限制。尽管方法有所局限,却是简单有效的能达到好的效果的方法。作为一个辅助效果,你将学习到关于流体一些有趣的东西。

在右边的第一个视频向你展示了流体模拟形成蘑菇云形的烟。第二个视频是一个特写,你可以清楚的看到粒子如何固定在一个路径,并创建涡流的。

RealFlow 翻译教程之——简单的烟(二) - 豆芽兵 - 豆芽兵的天地

展示出你的作品

当然一个教程只能是一种解决问题的方法,我们希望你多调调参数,力和动画曲线,并展示出你的实现方法。我们对你作的成果很感兴趣,你可以在网站上发静帧或给我们视频链接。

------------------------------------------------------------------上面是原网站简介----------------------------------------------------------------------------



漩涡

RealFlow能处理多种模拟任务:流体,刚体和柔体,波浪,风格化流体。用这些工具几乎能完成所有的任务,但仍有一种不行:气态液体(gaseous fluids)

当然没有必要用复杂的计算写一个基于Python的烟雾解算器。另外最常见的方法已经被申请成专利了。(例如 J. Stam’s “Stable Fluids”流体静力学)所以,如果你要编写一个商业烟雾解算器,你必须开发自己的方法,那是一件非常困难的事。此外一切都要适应RealFlow本身,比方说,特色。

RealFlow 翻译教程之——简单的烟(二) - 豆芽兵 - 豆芽兵的天地

1.RF_toolfactory VortexFlow插件基于密度的烟雾模拟。

当你看一下模拟的烟雾时,我会发现两个重要的事。

1.烟雾上升是由于浮力

2.有大的涡流还有小的涡流(紊乱、卷边)

产生小的紊乱和卷边方法,称为(涡流限制 Vorticity Confinement)。这个技术引入速度(velocity)在某些领域,创建小的速度随机。涡流限制(vorticity Confinement)实际上增加了烟雾的真实感,使一切变得自然。

然而在许多情况下,是不需要这么多细节的。例如缩放很大的烟流(烟羽),或远处的烟雾源。问题是,要做大的涡流是非常困难的使用RealFlow标准流体解算器。

所提出的方法实在是很基础的,只达到近似级水准,但你在使用这方法时可能会找到一个新的方法来拓展脚本,去达到更好的效果。真正工作使用时,一定要经过试验,脚本对错误是非常敏感的。因此,本教程实际上是快速的方法提示,而不是全面详细的讨论。但也许你会觉得很有意思,看看你可以用这个方法获得什么。

准备

主要的困难是,迫使流体粒子沿着圆圈发射器路径运动,像升起的烟雾。实现这种行为的方法或公式是一定要引入Python脚本。一个好主意是在互联网上搜索,你很快就会发现两种基本方法:层流(laminar)和湍流(turbulent flow)

在层流流体下在某一个方向没有湍流,可以在水管或通道观察到这样的行为。湍流是非常难以描述的,因为流体看起来没有一个确定方向。

在湍流中你能看到漩涡和不同方向的流动。层流和湍流之间有这样一个关系:超过一定标准时,层流可以变成湍流。这个标准就是的雷诺数(Reynolds numbe。在漏斗,狭窄的管道或障碍物里面的流体可以看到,这两种状态之间的转换。

层流

这种方法将要使用的公式被称为“Stokes定律”。这个术语,用来描述流体中球形体(粒子)的摩擦力。这力的大小也取决于粒子半径和流体粘度。跟其它任何摩擦力一样,Stoke力导致body/particel减速。在我们例子中,力作用在周围流体。

Fs = 6  η R v

Fs 是Stokes 力,∏是 pi,η('Eta')是流体动力学粘度。R是粒子半径,v是速度。这个方法优点,RealFlow可以提供所有必要参数给这个公式。这个思路是创建一个层流的力场抵消流体的上升运动来减速粒子。另一方面,粒子的浮力使流体上升。这上升流体在层流力场影响下会减缓粒子。这意味着,必须作用在粒子云外面。

为得到粘稠的效果必须要有很高的粘度值(viscosity)。这也将减慢整个粒子流,当粒子流累积在流体前面。因为动力学粘度值 1是水20°C时,它可以被忽略掉。但你能模拟不同流体。为什么最终是负的力,是为了抵消了上升粒子流:

  Fs = - 6 ∏ηR v

RealFlow 翻译教程之——简单的烟(二) - 豆芽兵 - 豆芽兵的天地

图 2:层流(laminar flow)说明

引入负号,因为这力能抵消粒子向上运动。最终,我们得计算粒子半径 R。当你参考RealFlow手册时,会看在发射器"Resolution"参数下看到这个半径公式。这正是我们需要的:

RealFlow 翻译教程之——简单的烟(二) - 豆芽兵 - 豆芽兵的天地
 

湍流(TURBULENT FLOW)

思考湍流时你会遇到一个困难。当流体在障碍物周围,物体后面就会产生低压区。

在前面有高一点的压力。这不同的压力就是流体的阻力,这力可以被表达成:


RealFlow 翻译教程之——简单的烟(二) - 豆芽兵 - 豆芽兵的天地

Cw是阻力系数,是障碍物横截面。因为我们可以把流体粒子看作一个个小球体,Cw值是0.45,A就是简单的圆面积:∏R2(译者注:原文应该写错了)

RealFlow 翻译教程之——简单的烟(二) - 豆芽兵 - 豆芽兵的天地

3:湍流图例

尽管这个公式能产生一种力,但仅是一方面,并不能产生湍流。仅仅是流体经过时的力(fluid experiences 不知道合适怎么说)。要找到层流变成湍流时间点,雷诺系数(Reynolds number)(后面写为Re)是很重要的。定义Re不是隐藏的,可从RealFlow标准参数来计算,但这仅仅是达到实际效果并不能正确描述湍流物理现像。

湍流和卷曲需要一个更加复杂的方法,基于从Navier - Stokes方程的向量场。这各种物理性质的向量场,通常存储成网格(grid)。这是“基于网格的流体”一词的由来。(grid based fluids)

RealFlow 湍流参数

RealFlow的标准粒子提供了湍流参数,但这不是自定义的值,是SPH(译者注:Smoothed Particle Hydrodynamics)流体内部参数。用脚本可以写成矢量格式:

 ω = Vector.new(ωx, ωy, ωz)

脚本

对于此脚本,要使用RealFlow辅助器,因为它是一种特殊功能,可以给粒子施加外部力给网格流体或物体,这是方法很稳定,可放心使用。 脚本辅助器可以这样添加:

Edit > Add > Daemons > Scripted

辅助器结点面板提供了"Edit"功能。请注意脚本窗口模式。这意味着,你必须关闭此窗口再次访问底层的RealFlow面板。这实在是烦人,但不能改变。

RealFlow 翻译教程之——简单的烟(二) - 豆芽兵 - 豆芽兵的天地

为了使一切更方便,你也可能添加一个小型的GUI(图形用户界面)。关于这部分更多说明请参看,RF脚本那本书,GUI部分。如果你要创建GUI,请创建成Batch Script.如果你要加在辅助器”def onSimulationBegin"部分,RealFlow可能会崩溃。

#--------------------------------------------------

# Function: applyForceToEmitter 

# This function is called by the simulation engine 

# when external forces should be applied to the    

# particles in the emitter.                        

#--------------------------------------------------

import math

import random

def applyForceToEmitter( emitter ):

  normalThreshold = 0.85

  emitterRes = emitter.getParameter("Resolution")

  pRad       = 1 / ((1000 * emitterRes) ** (1/3))

  dynVisc    = 1.0 # this is not RF’s Viscosity value!

  particle = emitter.getFirstParticle()

  while (particle):

   pVel    = particle.getVelocity().module()

   pNormal   = particle.getNormal().module()

   rndRange  = random.uniform(-0.02, 0.02)

   if (pNormal >= nornmalThreshold + rndRange):

stokesForce = -6 * math.pi * pVel * pRad * dynVisc

    if (scene.getAxisSetup() = AXIS_SETUP_YXZ):

     vortexVec = Vector.new(0, stokesForce, 0)

    else:

     vortexVec = Vector.new(0, 0, stokesForce)

    particle.setExternalForce(vortexVec)

   particle = particle.getNextParticle()

这个脚本是非常简单的。在第一部分,粒子半径取自发射器的“Resolution".然后脚本遍历所有粒子,读出单个速度矢量。

使用的XYZ单独的值,而不是矢量的大小

这是计算“module()”语句。这个方程是:

  magnitude = sqrt(x2 + y2 + z2)

这个方程(module())结果是标量(仅仅是数字),不是由三个值组成的矢量。这个操作的原因是矢量不能作为检查条件来判断是否满足条件。但用浮点数字就不存在这个问题。

相同的过程(向量 - >模 - >标量)是适用于粒子的正常方向。这个方法必须要找出外面流体,法线模长(normals magnitude)是这脚本最重要和最敏感的值(见参数的调节)。所以脚本仅仅决定粒子在流体外面,力(=阻力)将接受场景设置。为了变得更丰富一点,加一点随机值到法线的模(normals magnitude)

参数调节

正如所提到的,主要思路是,减缓流体外部粒子。内部粒子仍然保持初始速度,和拖缓粒子速度。由于粘度(也称为内部摩擦力),整个流体最终会放慢,粒子的聚集在流体的头部。

RealFlow 翻译教程之——简单的烟(二) - 豆芽兵 - 豆芽兵的天地

4:相互影响的不同力,最终创建上升的烟雾

上面图片说明的方法:StokeFs减缓流体外部粒子。浮力Fb作用在所有粒子上,产生了一个吸引力,使粒子向下。在这个边界可以看到涡流

想得到这个效果,必须标志出流体粒子的外面,这是为了检查法线。越接近流体粒子外部法线就越大。问题是这个值,发射器resolution值越高,它就减小。用“Resolution”值为1.0"normalThreshold“变量可以是1.5或更大。用非常高的设置,是0.5或更小。不幸的是不能为每个resolution设置一个固定的值,因为粒子数和法线长度关系不是线性的。意思是你要测试和试不同的值

羽流的质量取决于法线阈值(normal threshold)

RealFlow 翻译教程之——简单的烟(二) - 豆芽兵 - 豆芽兵的天地

5.一个上升烟的模拟

这已经调整的“normalThreshold0.85circle发射器 缩放是(0.50.50.5),Resolution值是4.0Speed2.0

另一个重要的值是发射器的“Viscosity”参数。如果它太小,那么效果不能完全体现出来。

能达到最好的效果设置值在4.06.0之间。如果有逃逸的粒子,可以加一个"k Volume"场,或放一个盒子在发射器附近。另一个可能是增加“min substeps(这值对逃逸粒子有很大影响)

最后注意

请记住,这个方法产生的烟雾效果方向,只是在发射器指向上,因为没有支持的力,没有浮力或其它效果。这结果可被看做一个假的涡流,有些可以在层流里看到。

模拟速度非常快,几乎和直接执行一样,如果没有别的辅助器。还要记住,不要加上“Gravity”,因为它会抵消流体向上趋势还会导致模拟不稳定。

一句话总结:

层流和湍流,我要理解好

Fs”还有“R”,都有公式来对付

它们啊,加入RF,那就是脚本,

小烟诶,阈值调调就出来


版权注意事项

所有在这文章中图片,文字,和素材都属于RF_toolfactory.你可以复制和分享这PDF,但不允许直接提供PDF下载在论坛,文件共享,种子站或其它地方。你能直接链接“simple Vortex”,用来设置交流的目的,是没有限制的。

所有已经给出的材料都经过最大的努力检查,但错误不能完全排除。RF_toolfactory不为计算机或软件崩溃和/或数据丢失负责。需要您自己承担使用材料脚本,和文件在你硬盘上风险。

不允许转卖PDF和素材。不允许删除版权信息。如果你用这PDF图片或文字到有其它目的,要标明出处。

Simple Vortex” by RF_toolfactory (http://www.rf-toolfactory.com)

谢谢。

  评论这张
 
阅读(5456)| 评论(3)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017