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

豆芽兵的生存探索

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

 
 
 

日志

 
 

最不该遗忘的功能——RealFlow Expression  

2012-06-28 17:32:04|  分类: RealFlow探索 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

说在前面:这是之前翻译的Realfow帮助文档。动画曲线那一节,前面对软件的介绍没有放上来,因为那只是简单的操作,大家看一下就会了。Expression真的非常值得学习,甚至比前面的Python脚本还要值得推荐。

翻译的也是我平常的作风,加了上自己添加的东西,比如对基础知识的回顾。(其实是我不会RealFlow Expression 最不该遗忘的功能 - 豆芽兵 - 豆芽兵的生存探索)。

19.04 Expressions(表达式)

表达式是最方便的,用来自动制作路径运动或做循环动画的方法。你曾尝试过塑造一个,完美的正弦波形曲线吗?如果你的答案是“Yes,但还留存一些难点。那么你肯定会喜欢上表达式。有了它们,你不用考虑关键帧,因为你只需输入相应的函数或公式,就可以立即看到结果。从理论上讲,表达式曲线可以一直持续下去,因为它会自动计算某一帧的属性值。你也可以让表达式基于事件(event-base)。意思就是,你能定义一个特定的条件,触发后能自动切换功能,例如刚体与非刚体切换。条件可以是一个选定的帧或一个Null对像的位置,甚至用对像的名称。

RealFlow Expression 最不该遗忘的功能 - 豆芽兵 - 豆芽兵的生存探索
 
RealFlow Expression 最不该遗忘的功能 - 豆芽兵 - 豆芽兵的生存探索
  图片:表达式控制球体垂直方向运动。

ReaalFlow提供所有通用的函数,如Sine(正弦),Cosine(余弦),Square root(平方根),log(对数),tan(正切)等等。此外它也可以用操作符进行比较运算和简单的计算,例如<, >, (括号)+,(加号) *,(乘号)等。很容易结合不同的运算符,创建复杂的公式。表达式是非常灵活多变的。

RealFlow提供了另一种新功能让表达式曲线与基于帧的曲线相结合。尽管两种方法完全不同,但可以混合它们和创建一个融合的曲线。两者结合后的动画,很多时候非常有用,例如:当你想添加一些扰动(Noise)到动画上,或创建第二套运动,用更高(high-ranking)的运动。如果你认为混合这些曲线很复杂,那你就错了!只需简单的点一下“+”键。结果完全是一个新的曲线,具有动画和表达式的属性——混合的曲线。为了让你加深印象,下图显示出了原始的基于关键帧动画曲线——灰色那条。

RealFlow Expression 最不该遗忘的功能 - 豆芽兵 - 豆芽兵的生存探索
 表达式是一个非常快速和可靠的方法来模仿各种不同的自然行为。在自然界中,我们很少看到完美的运动与永不消失的力,速度或运动。因为有各种阻力,随着时间推移肯定会慢慢失去能量。这种行为可以完美的用表达式模拟出来。

 举个例子:当你在三维软件中打灯光时,经常会用到衰减。这可以防止光线太强烈,照射到远处的物体,那样看起来就不真实了。因此,大多数光源下,你通常是能够在预定义的模式中选择限制光强度,常见衰减模式有:倒数(inverse),反向平方(inverse-square),或反向三次幂法则(inverse cubic)。【译者注:这几种衰减方法,很值得深入研究一下。】

RealFlow Expression 最不该遗忘的功能 - 豆芽兵 - 豆芽兵的生存探索
  图:几种有代表性的衰减函数。
另一种方法是用指数函数来做衰减。模拟的力随着时间的推移而减小。同样用其它值也可以达到,像摩擦力(friction)或温度(temperature)。用这些简单的函数是没有问题的。让确定的属性,在恒定的时间间隔衰减,或基于公式创建完整的运动。另一个重要的应用领域是随机性(randomness)。你往往需要一定量的随机性,使模拟变得更加可信。例如在模拟风时。首先,确定一个基本的风向,再加些轻微的变化。看下面:
RealFlow Expression 最不该遗忘的功能 - 豆芽兵 - 豆芽兵的生存探索
 表达式还有别的的优点:

1.  运行更快。Expressions可以使用所有CPU和核

2.  不需要脚本。如果你不熟悉Python,表达式是更好的选择

3.  创建更快。你不需要debug或写很多行代码,因为表达式只由一行组成。

4.  使用标准的数学函数。基本代数符号,像括号,小三角,所有你需要的。

5.  完美的运动。由于表达式基于数学函数,它们是正确的物理表现生成绝对完美的结果。

6.  如果你熟悉脚本或编程,表达式应该非常容易了解。

 a. 第一步你不需要为创建表达式特别做什么。首先,你要找一个需要写表达式的参数在节点参数窗口选择一个需要设置的值右击,选择“Open curve.然后你会看到结点相关的值,但当前没有曲线,因为没有任何关键帧。在曲线面板下你会看到“+”按钮,一个输入框,和一个插入(Insert)按钮.用“+”你可以很轻松的合并表达式与现有的曲线。输入框包含表达式,你可以键入所有可用的函数和变量。一个很重要的问题是时间(time)。在RealFlow中,时间尺度是用帧或标准时间代码格式。

 hh : mm : ss (hours : minutes : seconds)

默认时间栏在GUI(图形界面)和曲线编辑器中是用的是帧(frame)。如果你想用时间(time),你要用它的变量形式。变量——是一个待“填充”的占位符。帧的变量是“f,时间是“t.在表达式中,“f”或“t”代替当前frame/time在时间栏上。这是自动产生的,所有不需要你去考虑它。你也能创建表达式基于frametime. (译者注:在表达式中把ft,当成一个内置功能函数)如:

sin(t*10)*f/ 20

RealFlow Expression 最不该遗忘的功能 - 豆芽兵 - 豆芽兵的生存探索
  图:表达式sin(t*10)*f/20的结果
使用基于帧(frame)的曲线有一个很大的特点:看起来距齿状很重,因为在RealFlow内部,帧(frame)只有整数值。使用基于时间(time)的,曲线就会变得很平滑。幸运的是,去除距齿不是很麻烦,只要在表达式上乘上time就可以了。
RealFlow Expression 最不该遗忘的功能 - 豆芽兵 - 豆芽兵的生存探索
  图:红——基于frame创建的锯齿状曲线;黄——基于time创建的平滑曲线
表达式不仅限于frametime。你也可以使用数字,甚至其它结点的动画属性或参数,例如:

sin(5)
cos(Cube01.rotation_X)

另一个例子

如你想创建重复上下运动的物体,比如发射器。你首先要考虑的是有没有与这个任务需求类似的函数。通过比较各种数学函数,你会看到,正弦或余弦函数是最优的,因为他们已经表明这种波浪状的行为。正弦曲线更好点,因为它从0.0开始。像正弦,双曲余弦,平方根等只需要一个参数就能起作用的函数。称为一元函数。(译者注:一元函数是指函数方程式中只包含一个未知量

 接下来你需要的是发射器的垂直位置的曲线。请注意,这可以是YZ轴,根据自己的喜好。在这里,我们假设Y代表垂直轴。转到发射器节点的params(参数)面板:
Node Params > Node > Position > Y
右键单击该值,并选择“Open curve”。现在的曲线编辑器中没有曲线或图形,然后在表达式框输入

 sin(t)

 回车确认,出现一个条曲线 。表达式sinT)的工作方式:每一帧的RealFlow计算适当的正弦值,并将其应用于发射器的Y位置。然而,结果可能不是你预期的。你可能需要更多的波峰波谷?可以看到的是,只是在当前时间的函数依赖的基本正弦。简单的操作,你能够创造出密度较高或更广泛的曲线,更高的山峰,正或负的偏移。

 --------------------知识回顾----------------------------

下面进入一段基础知识的学习,放松一下,没有兴趣的读者可以跳过。

简谐运动Simple harmonic motion (SHM)﹝原名直译简单和谐运动﹞是最基本也最简单的机械振动。实际上简谐振动就是正弦振动。如下图:

 

RealFlow Expression 最不该遗忘的功能 - 豆芽兵 - 豆芽兵的生存探索
 

之前写的sin(t)就是一个简谐运动。现在我在下面写出它的正弦型函数解析式:y=Asin(ωx+φ)+h 

这个解析式非常重要。在写表达式时,依据就是这个方程。下面给出各个参数的意义

 各常数值对函数图像的影响:

φ(初相位):决定波形与X轴位置关系或横向移动距离(左加右减)

ω:决定周期(最小正周期T=2π/|ω|

A:决定峰值(即纵向拉伸压缩的倍数)

h:表示波形在Y轴的位置关系或纵向移动距离(上加下减)

 为了形像一点,给出一张图..

RealFlow Expression 最不该遗忘的功能 - 豆芽兵 - 豆芽兵的生存探索
 

-------------------------回顾结束 -------------------------

这里有几个例子,修改的正弦曲线和结果:

? sin(t*5) ,压缩波形在X轴,也就是增大频率(f

? sin(t/5) ,拉伸波形在X轴,也就是减小频率(f)

? sin(t+5) ,波形整体往右偏移,也就是相位改变(φ,水平方向)

? sin(t-5) ,波形整体往左偏移,也就是相位改变(φ,水平方向)

? sin(t)+5 ,波形整体往上偏移,(h,垂直)

? sin(t)-5 ,波形整体往下偏移,(h,垂直)

? sin(t)*5 , 拉伸波形在Y轴,也就是振幅变大(A

? sin(t)/5 ,压扁波形在Y轴,也就是振幅变小(A

 译者注:经过上面的例子,你肯定会发现,哇,这些不都是上面知识回顾中讲到的吗。这些是中学就学过的,但那时根本不知道有什么用。现在知道了,原来跟我做电影特效有这么大的关系。

 它也可以综合起来使用。任何由单个函数组成的表达式都要遵循数学规则:

(sin(t) + cos(t)) / (cos(t) – sin(t))

也就是除数不能是0或根为负数的值。除和乘优先级比加减高,如果不想这样,就要加括号。需要两个参数的函数被称作为二元函数,如:value1+value2 value1< value2

译者注:二元函数(binary function)是一种带有两个参数的函数。这是编程中的定义。数学上二元函数是这样定义的:设平面点集D包含于R^2,若按照某对应法则f,D中每一点P(x,y)都有唯一的实数z与之对应,则称f为在D上的二元函数.

造成歧义的原因是数学与计算机中函数用的同一个词:Function

数学中函数含义function):表示每个输入值对应唯一输出值的一种对应关系。

 计算机中函数定义:函数过程中的这些语句用于完成某些有意义的工作——通常是处理文本,控制输入或计算数值。通过在程序代码中引入函数名称和所需的参数,可在该程序中执行(或称调用)该函数。简单说就是某种带参数的可输入输出的功能块。】

 现在你已经输入过表达式了!关闭或最小化曲线编辑器,从时间轴控制,看到发射器做完美的循环运动。当然,它也可以创造传统的运动曲线,但很困难。不要害怕表达式:只要实验一下,你就会发现它们很灵活,功能强大易于使用。

 

RealFlow Expression 最不该遗忘的功能 - 豆芽兵 - 豆芽兵的生存探索
  图:sin(t)*cos(t*2)在垂直方向的运动路径

 

b. 反函数和负值(Inverse Functions and Negative Values)

另一个重要的功能是用倒函数和负值。你只要简单的应用它们就可以了。

1/x

“X”是变量,或是你想用的功能

反函数往往用来做衰减。任何有效的功能块或项都可倒,有可能在函数的定义有些差距,因为除数是0.例如,正弦或余弦的逆函数。正弦90度和270度是0,除数是0,没有意义。

RealFlow Expression 最不该遗忘的功能 - 豆芽兵 - 豆芽兵的生存探索
  图:是1/cos(t),图中垂直的尖峰表示某些值未定义

值在90度和270度时快速收敛变得无穷大,变得非常高。这通常会导致完全不正常的动作或设置。在使用反函数之前最好先输出看一下。可以直接在编辑器图形窗口或外部的函数绘图仪。你会看到值在表达式在导致的问题。

 负值是另一个典型的转换函数和表达式。负值,可以改变一个函数的方向。看下列项。

 5 * exp(t)

 这是一个不错的函数(其实就是指数函数)。函数值集中在50.它实际上是一个理想的辅助器的表达式,慢慢失去强度或力。但有一个问题:这个函数绘出来的图显示了所有值在下面图中。意味着你有“负”的时间值。用一个简单的转换,你可以改变方向,使时间值再次变成正值:

5 * exp(-t)

这是一个表达式,你可以到达需要的目的。你可以改变初始因子(此处为5)。一个因子像-t*x会使曲线变得陡(if x>1)或平滑(if 0<x<1.

RealFlow Expression 最不该遗忘的功能 - 豆芽兵 - 豆芽兵的生存探索
  图:左边显示的函数是 5*exp(t),右边曲线代表5*exp(-t).

c.  Random Values(随机值)随机数在模型自然效果时有重要的作用。没什么是完全的可预见的,真实的效果还有一些轻微的变化。为此,我们可以用RealFlow内置的随机数发生器。这个工具实际上和曲线编辑器上其它曲线一样。你可以创建随机值,基于FT。例如:

rnd(f) or rnd(t)

RealFlow Expression 最不该遗忘的功能 - 豆芽兵 - 豆芽兵的生存探索
  正如你从图看到的,值变得越来越大。这是随机数的运作模式。在这种情况下rnd(f)-RealFlow表达式创建随机值在0f之间,所以随着f增长,结果值就变得越来越大。如果你简单的输入数字 N,范围就在0N之间,如这个:
RealFlow Expression 最不该遗忘的功能 - 豆芽兵 - 豆芽兵的生存探索
表达式像前面的例子一样

Rnd(3.0)

值在03之间。添加随机值给数字创建抖动或振荡效果,例如风或发射器速度值。这里用Y轴风辅助器表达式:

Wind01.position_Y = 42.5 + rnd(5)

风场辅助器随机振荡在42.547.5度之间。这是一个45度的平均水平。因此,我们可以很容易地定义,包括风主方向的细微变化。

 一个非常有趣的场应用领域是除了标准的功能和随机值。然后我们能定义一种基本运动与加上一些随机扰动。

 Sin(f*5)+rnd(0.5)

 再说一次:用“+”按钮能添加任何随机功能函数与现有的动画曲线混合。随机数是一个非常灵活的方法用来创建更加逼真的动态。随机性可以使模拟有好看的细微变化。一个真正有效的方法是,与关键帧动画相结合用,“+”按钮。

d. 条件(conditions

另一个有趣的功能是使用“if”条件语句。用这种方法你能够触发,停止或切换值,设置属性。“if”功能需要三个参数,在括号里:

if(value1, value2, value3)

第一个值是比较特定条件,例如 特定的帧或时间点:

if(f<49, value1, value2)

这意味着,从时间轴达到50帧的时刻,值将切换到value2的。现在你也可以执行检查用赋值号=

if(t=5.0, value1, value2)

相反,你可以使用从其他对象进行比较的节点值,像这样的:

if(Null01.rotation_X < 180, value1, value2)

举个例子:

你想创建一个正弦函数运动用随机数,但75帧属性值变成0.表达式用if语句是没有问题的。

if(f<75,cos(t*5)+rnd(1),0)

换句话说:当达到75帧切换函数 sin(t*5)+rnd(1)0.0.下面有张图描述了这种条件:

RealFlow Expression 最不该遗忘的功能 - 豆芽兵 - 豆芽兵的生存探索
  图:条件(f<75,cos(t*5+rnd(1),0)告诉Realflow设置值为075帧。
另一个有趣的功能是切换刚体动力学。选择节点的Dynamic参数,打开曲线输入:

if(f<99,0,1)

 Dynamics面板,对应参数编号:

0 = No
1 = Rigid body
2 = Soft body

如果你想到A)打开Soft body dynamics 100帧,或B)切换rigid,表达式像这样:

 A) if(f<99,0,2)

B) if(f<99,1,2)

条件是很简单的,但这很强大可以创建各种切换或触发条件。最好的办法是一点点试验这个功能,并探讨其可行性。可以依赖从其他节点的属性,创建复杂的驱动式动画。

e. Complex Functions(复杂函数)

表达式还可以包含复杂的公式,由不同的函数组成。看一下下面的公式:

sin(3*t+exp(t/2))*0.2+sin(3*t-exp(t/1.2))*0.2*exp(t/4)

这个函数是创建一个曲线基本正弦振荡,随时间变得越来越密集。指数部分创建一个重叠的振动频率和幅度增长。

RealFlow Expression 最不该遗忘的功能 - 豆芽兵 - 豆芽兵的生存探索
  图:这个函数的图形

要得到理想的效果,值的范围必须想办法控制。每一个部分都有特殊的图形。Sine,cosine,Exponential函数曲线是一样的。因子能缩放或更平一点,或更徒一点。组合不同的函数生成复杂曲线,不容易发现需要的适合值。试验找出参数因子极限值,避免异常值。

 幸运的是,曲线编辑器的工作原理就像示波仪,使得它更容易优化和调整因子。最好的工作流程是从开始的基本函数开始,一步步添加组合。

 

  1. sin(t+exp(t))
  2. sin(t+exp(t))+sin(t-exp(t))
  3. sin(t+exp(t))+sin(t-exp(t))*exp(t)
  4. sin(3*t+exp(t/2))*0.2+sin(3*t-exp(t/1.2))*0.2*exp(t/4)

这种方法可以帮助你找出其中部分函数的极值。你可以限制它:乘或除适当的值。你唯一需要的注意的是括号,因为它要优先计算。这当然需要一点时间测试得到适当的值,但几个测试过后,你能得到具有不同功能的范围值。还有一个好方法执行下列函数。

 Insert>Unary functions

 正如你看到的表达式是不难使用的。他们快速自动生成一些动画。在许多情况下表达式能代替脚本。表达式是多线程和多核生理的。最简单的脚本RealFlow都不会使用一个以上的处理器,因为Python是单线程的编程语言。请记住,这一个限制是Python语言特定的,与RealFlow本身没有关系。

 译者心得:

Realflow表达式,是差点被我遗忘的功能。至从一次接触后就再也离不了它了。就像Maya的表达式一样。

我最常用的是:

1.条件判断:if(f>12,0,1),在大于12帧后,将失去作用。用在Simulation属性上。就是说大于12帧后,由Active切换成Inactive

Inactive (0),active(1),cache(2).这个属性对应关系是自己试验的。

这个功能用的非常频繁,用来控制多个物体,或根据镜头长度做特效时,需要在某一帧让其失活,之前都是手动关闭.

 2.Rnd x)随机数用的也很多,通常是与关键帧动画结合的,就是那个神奇的“+”号。可以让我模拟的结果更真实。

 

3. if(Null01.rotation_X < 180, value1, value2)属性驱动,其实属于条件判断中的。 单独提出来原因,就是它能像maya一样把不同的属性可以关联起来。这是非常非常有用的。

 更多的表达式技巧,还需要大家多多亲自实践

 如果有错的希望指出来,谢谢。

  评论这张
 
阅读(4867)| 评论(11)
推荐

历史上的今天

评论

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

页脚

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