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

豆芽兵的生存探索

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

 
 
 

日志

 
 

第七节:与流体交互  

2013-04-10 18:31:57|  分类: RealFlow探索 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

7.1无限可能

RealFlow最重要的一个功能是不同解算器之间能互相影响。流体可以影响刚体,刚体可以创建波浪,柔体可以影响粒子流。所有这些中,最让人赞叹的是流体和刚体之间的交互。想像一下一个水箱被打破,水槽破裂,堤坝决口,汽车被洪水冲走,或只是简单一杯有冰块的水。(译者注:现在看来,刚体与流体之间交互是很容易的,但在RealFlow3之前,这是非常难实现的效果。)

RealFlow需要做很复杂的计算来处理这些交互。我们也得考虑很多方面,来设置场景。水是能推动刚体的。在现实生活中,强力的水流还能击碎水中的物体。做这些交互时,得要重视模型的作用,水可以从缝隙流出来。要让复杂的刚体模拟变得稳定,不是很容易,可还是有办法来减少那些不稳定因素。

RealFlow有无限的创造性。得要时间和耐心才能做出完美的场景。物体越多,细节越丰富,最终模拟花的时间就会越久。

7.2 介绍粒子交互

前面几篇文章,我们一直在处理纯刚体问题。所有调节的设置,只在Rigid Body面板或Simulation Options菜单就能完成。下面处理流体和刚体的交互,将要用到一个新的属性面板,称为Particle Interaction。只要执行下面的简单几步,就能看到这个面板:

 

1.创建一个新场景(scene)

2.添加默认的Vase(花瓶)物体

3.放一些小球(sphere)到Vase中

4.添加Circle发射器

5.添加一个Gravity 辅助器到场景中

最终设置如下图。确保发射出的流体进入容器中。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

图32.使用RealFlow默认物体创建的基本场景

随便选中一个物体,小球或Vase,都会看到Node Params面板,有一个新的面板(Particle Interaction)出现。不管Rigid Body Dynamics有没有激活:

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

图33:Particle Interaction菜单

新面板中的。Collision distance(碰撞距离) 和Distance tolerance(距离阈值)肯定是流体-刚体交互最重要的数值。

7.211 Collision distance(碰撞距离)

取值范围大于0。它表示粒子与物体的间距,小于等于这个值时,就看做有碰撞。如果你想让流体与物体更贴近一点,这个参数就是最重要的。值越大,表示流体与物体之前间隙越大。值越小就需要越多的解算时间,因为RealFlow得要进行更精确的计算。Collision distance值设定极大取决于场景和物体缩放。通常缩放大的物体可以设置大一点,小物体就需要更精细。只要看着合适就可以。不要把值为设0,这是非常难以计算的,会导致碰撞失败。

  1. 2 Distance tolerance(碰撞距离容差值)
    第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

取值范围0~0.9。你曾在物体上看到过有一层粒子吗? Distance tolerance值非常低时会产生这个问题。Distance tolerance值,给上面的Collision distance一点随机性。打破统一感,视觉效果更好。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索
 

  1. Collision tolerance(碰撞穿透比率)

取值范围:0~1。这是Rigid Body Dynamics另一个重要的参数。值为0时理论上产生的是完美的碰撞,没有任何粒子穿透物体表面。使用高的值,能产生水渗透的效果。值为1时,就完全没有碰撞了,粒子会直接穿过物体。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

  1. Collision normal(碰撞法线)

Both(双面)是默认值。可以调节为Inside(外面)或Outside(外面),会节约模拟时间,因为RealFlow只需要检查一个面的碰撞。也适用一些特别效果,例如使用发射器在外面填充球。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

7.215 Particle Friction(摩擦力)

值范围:大于等于0。摩擦力会让粒子减速。体现为物体表面光滑程度。反弹力值为1时,粒子就会按原速度反弹。

7.216 Bounce(反弹力)

取值 0~1。如字面意思。值为1时,粒子碰撞后会按照原来速度反弹。为0时。粒子不反弹。可以与Elasticity(弹性)值类比。

7.217 Sticky(粘性)

这真是一个很有趣的参数。粘性像粘着力,能使粒子粘着在物体表面上。对物体来讲就是吸附力。粘性能抵消反弹力、增加摩擦力,使粒子被物体粘住。可以做流体在物体表面缓慢液动效果。通常配合摩擦力使用。最好玩的是,这个值设置非常大时如1000,可以让流体在物体表面转动,很像魔法球。可以让粒子非常均匀的铺在物体表面。

7.218 Roughness(粗糙度)

取值范围0~1。使用Roughness可以调节表面细节。是光滑平坦的像玻璃或金属(铬,等等)一样,还是粗糙的像木头、编织物或地面。设置这个粗糙值,可以让流体碰撞运动方向和速度有一定随机性,显得更蓬松或散乱,看着更自然。也会像摩擦力一样会阻碍流体运动。

7.219 Temperature 和Conductivity(温度和导热性)

这两个参数更多用于气态粒子(gas),因为它们能影响气体中热量效果。在本专题,我们只讲Dumb或liquid粒子。当气体靠近物体时,会受到物体温度影响,被加热或冷却,从而改变压强。由于温度是逐步传导扩散的,所以气体中就会形成温度梯度和压力梯度。不要在在意思,影响不大。Conductivity导热性。值越大,物体温度对气体影响越大。如果为为0,物体与气体间就没有热量交换。

7.220 Thin face test (薄壁探测)

通常这个设置是设置成No。当两个粒子分别处于一个物体表面内外两侧时,但又十分靠近,粒子之间的相互作用并不知道它们之间有这个"墙壁",就可能导致计算出错。因为如果是被分隔开,就不需要计算粒子间的相互作用。这个参数功能就是,检查粒子之间有没有这个"墙壁"的。但要注意,启用这个参数会增加计算时间。

7.221 Particle fore(粒子力)

这也是很重要的设置。Particle force决定,流体影响物体到底能产生多大推动力。但要激活刚体属性才有效。值越大,粒子对这个物体产生越大的推动力。但最好使用@mass达到同样的效果。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

7.222 Impulse(反冲)

激活Impulse,就能移动物体了。可以与火箭引擎喷出的火焰类比。流体可以推进物体前进。注意,要把发射器Parent to到物体上,才会一直推着前进。

回到我们最初的场景。模拟一下,会看到粒子和刚体有交互效果,但物体没有运动,因为我们还没有激活刚体。增加动力学设置,我们现在得要注意流体参数。粒子通过刚体可能会产生新问题。因此使用k_Volume辅助器是一个好主意,删除不想要的粒子。飞开的粒子会很增加解算时间。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

图34.比较一下粒子与刚体的交互

永远不可能有确定的参数值。完全取决于场景和物体参数。随着你经验增长,对调节参数会越来越有感觉,达到你想要的效果。

7.3 轮胎案例

第一个示例是轮胎滚过小水坑留下图案的效果。这个场景有这几点优势:

1.模拟的元素少

2.所有粒子交互相关的参数都会用到

3.易于控制的模拟时间

4.好看的效果

首先得要做一个轮胎模型,特别是它的花纹。在RealFlow模拟时,使用低模。你可以在最终渲染时使用高模。在这个案例中,我使用的模型如下图。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

花纹图案尽量浅一点,能陷入到粒子中留下花纹就可以。(你可以自己做一个,也可以找下载类似的模型来试验)

7.4 设置准备

把轮胎模型导入RealFlow后,缩放到适合的大小。与网格Grid比较一下。模型不能太小,否则效果会不明显。如有必要在三维软件中缩放合适再导入进来,或直接在RealFlow中缩放,使用SD<->Curve或Scale options里参数都可以。

 

这个场景,我们需要一个用来装流体的水槽(可以直接在三维软件中制作)。创建一个矩形容器。再添加一个Square 发射器。这个容器的Collision distance值是0.01,Distance tolerance是0.2。然后添加一个Gravity辅助器,Strength值为20。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

Square Emitter粗略的填充满容器内部。这时,我们不要激活轮胎动力学属性。因为第一个任务,是处理水。在这个场景,我使用了140,000个粒子来填充基本的水层。具体设置如下图:

我决定使用Speed,而不是Volume。三帧后,我停止模拟并设置Speed为0.当然这个过程可以使用key帧来实现。高重力,低Ext Pressure设置,很快就能让流体放松稳定下来。在粒子稳定后,创建初始状态(Initial State):

Node Params > Initial State > Make Initial State

Node Params > Initial State > Use Initial State > Yes

Reset > Triangle Submenu > Reset to Initial State

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

图.35:Square Emitter设置

把场景Reset一下。放入轮胎模型进行第一次测试。选择轮胎模型,激活Rigid Body Dynamics。初始Primitive类型是Mesh。@mass值为300,@Object friction和@Elasticity值在0.2~0.4之间。为了让轮胎能滚动所以要设置稍微大一点的摩擦力。

要使轮胎滚动,我们还需要使用@Velocity初始值。在本场景,轮胎是从左滚到右,所以我们要输入x值。测试一下,找出适当的@Velocity值。使用比较快的速度会产生长长的拖尾,能在水面上制造更多的轮胎图案。

最后,我们得注意Particle Interaction设置。把Collision distance,设置成0.01,Distance tolerance 设成0.25。这些值需要根据模拟效果作进一步调整。现在,我们要把轮胎放置到容器底面面,再移动到最左边。最后一个参数了我们要小心,在Simulation Setting面板:Substeps。上面所有模拟都是使用固定的substpes值,但现在有交互的流体,情况就不一样了。为了流体和刚体顺利交互,建议使用自适应步长(adaptive steps)。为了测试快一点,我这里使用的值在75到125。

要让轮胎运动更自由,我决定只允许轮胎与容器底面有碰撞。使用单独链接功能,很容易做到。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

第一次测试有一点失望,结果不是想像中的样子。留下的轮胎图案很不明显,并且很快就消失了。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

这个场景的主要问题是,图案仅仅与很薄的流体层交互,Veloctiy也不够高。要平衡流体效果,需要添加第二个面到轮胎上。使用平面,很容易控制轮胎到底浸入流体有多深。另一个优点是我们还定义不同@Friction。让流体与轮胎分开处理。(新加的平面,只与轮胎相关联。用这个平面来控制作为轮胎滚动的地面,而不是使用水槽底面作为轮胎滚动的地面)

与这个新的平面一起,我还添加了两个盒子作为界限,来保持轮胎痕迹。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

效果差不多可以了。要让图案更漂亮,肯定要调节速度(velocity)。另一个问题是粒子会卡在轮胎里慢慢流下来,破坏了图案。这个问题原因是摩擦力和粘度(viscosity)。当然还可以换一种思路来解决:就是可以提高Sticky值,让粒子粘到轮胎上。滚过一圈后,就会得到一个很明显的轮胎图案效果。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

要去除上图中的粒子,我只是简单的添加了一个K_volume辅助器来删除不想要的粒子。轮胎自身没有产生非常特别的水花,因为水层太薄了。整个效果是很小的平衡,产生最终巨大的变化。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

图36:流体图案的扩散。

7.5 水的力量

破碎一定是,主要方面刚体与流体交互的主要方面。RealFlow流体粒子有独特的能推动刚体能力。使用不同的设置,我们能控制水的破坏力。另外RealFlow提供很多功能用来制作你想要的模拟效果。其中一个功能是支持Python脚本。接下来场景使用所有这些方法和技术包括了辅助物使用。

7.51 破坏栈桥

我们接下来的场景是一个栈桥。栈桥通常是水边的一个木桥,可以让人走到湖中。一天,一个快速移动的波浪袭来,悲剧发生了。波浪掀翻了这个小桥,把它撕成一片一片的。在水的巨大撞击力下,木头被破坏成碎块。一些木片和柱子还保持在原位。另一部分被水掀翻冲走了。当然在波浪冲过来前,木桥是很坚固的,不会抖动。

7.52 设置场景

场景需要在三维软件中做一些准备。用前面提到过的Illustrator的剪切技术,先做好2D的图。如果没有Illustrator或类似软件,也可以手动在3D软件创建碎片。剪切技术是很快速并很精确的,但不一定必须要这样。(译者注:完全可以使用破碎工具快速生成你需要的碎片。这里原作者使用最原始方法来制作,可参考学习一下)

我创建30了个矩形,通过轻微的缩放和旋转等操作,达到更多的随机效果。然后,我使用Knife工具生成碎片。

使用相同的方法,我又创建了两个长条,支持上面厚木板。这些路径,会在3D软件做进一步处理。利于这些路径,可以很容易创建出模型: 第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

另外,一个非常重要的问题是给你的这些碎块命名。当我们使用RealFlow时,要注意避免重名。我分成三个组:厚木板,长木条和支架。现在我们要给效果中固定不动的部分一个统一的前缀名(很重要)。如下图红色部分,就是效果中固定不动的部分。


第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索
 

图37:完成好的栈桥模型

7.53 重要的重命名

在这个场景,命名特别重要,因为我们要使用Python脚本处理。最容易方法是给不动的物体引入前缀。在这个案例,我使用"S_":

Static object(静态物体) Moving object(运动物体)

S_Fragment_008        Fragment_013

S_Fragment_045        Fragment_038

S_Fragment_101        Fragment_121

S_Pile_001                 Pile_004

S_Pile_005                 Pile_009

S_Mounting_003        Mounting_011

当然,也可以使用别的名字。如果熟悉RealFlow脚本的话。但不要在名称中添加"点"字符,因为这会导致内部错误。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

最后一个任务创建基本水池和物体,我称为Wavegenerator(波浪生成器)。你可选择任何一个你想要的名字。Wavegenerator将产生很好的波浪,容易控制和调节成你需要形状。Wavegenerator它自身形状像波浪或缩放的S形字符。也可以使用不同的形状,可能会产生完全不同的效果

准备好没?现在导出模型。

7.54 RealFlow内部

第一步是排序,打组激活物体。我分成三个组:Fragments,Supply Objects,和Static Objects(片、支撑物和静态物体)。除了Wavegenerator,别的都需要激活Rigid Body Dynamics。激活组的动力学属性就可以,不需要一个个的设置。最后,我们需要一个Gravity Daemon。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

现在进行第一次测试。打开非静态物体组的Rigid Body Dynamic,会看到下面的结果:

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

模拟一开始,这些部分就开始往下落。现在问题是,我们如何设置,让RealFlow知道碎片会一点点落下,就像真正的波浪撞击一样?下一下问题是,我们如何做,才能避免所有木板同时模拟?第三个问题是关于抖动:我们怎样避免这样的不好效果?这些问题解决方案是使用Python脚本。我们要使用脚本来决定,这些元素在特定时间下落,模拟。

7.6开发RealFlow脚本

在本文最后,我们有完整的脚本说明。在写脚本之前,得要为选定的对像,指定一个开始运动时间点。这个时间点取决于Wavemaker(波浪标志)的位置。在这一时刻,Wavemaker(波浪标志)对像到达桥,桥板与横木得要落下。所以,我们必须要为Wavemaker对像设置一个动画范围,生成翻滚的波浪。这很容易使用手动key帧方式来制作:

1.选择Wavemaker对像

2.到Node Params>Node>Position选择合适的轴。在示例文件,轴设置是xzy(Y决定向上轴)波浪在x轴移动。

3.右击在x值选择Add key

4.移动时间滑块到合适的帧,例如125。再右击在这个结点的position值,再一次添加关键帧

 

我们现在能移动时间滑块,直到Wavemaker几乎撞击到第一块桥木板时。在桥和波浪之间留一点间隙,记下这一帧数字,例如46。在46帧时第一个物体激活模拟。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

图38.在Wavemaker中心的右边物体激活

 随着浪推进,越来越多的木板被激活落下。这个过程被波浪冲毁有应该是平滑的效果。当这些部分一激活,流体就会开始推动刚体控制他们的运动。

我们要怎样把这些信息转换到脚本中?

我们需要当前Wavemaker对像的位置(position)和桥的位置(position)。这些参数可以使用Events Script来读取。要从Node面板收集所有可用对像,需要一个循环。问题我们效果每个对像,甚至水和Wavemaker项。有方法来排除它们。

Tip如果你不熟悉脚本,我建议你看一下RealFlow用户帮助手册。你可以得到脚本基本概要。本博客,另一个系列(RealFlow脚本)一步步向你介绍了脚本,特别适合没有任何Python知识的新手学习:

你可以使用脚本不需要之前的知识,打开里面的场景文件:

1./FootBridge/FootBridge.flw

2. Layout > Events Script or F11

3.复制整个到这个窗口

4。创建一个新的场景,打开Events Script窗口

删除所有粘贴剪切板上东西

5.点击激活复选框

在后面,你会学习到所有的,整个关于脚本的注释说明。所有值改变,使用者打印橘色

脚本第一部分功能是遍历所有对像,定义不变的移动"运动区域"。为此,我们使用Wavemaker作为参考。

脚本放在Events Script窗口的onSimulationFrame()

在模拟开始时,所有Dyn运动标志必须要设置成No。脚本完全控制元素的状态,只是一部分,右边Wavemaker项崩溃。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

最后一个任务是定义固定不动的物体。还记得吗?我们介绍过前缀,称为"S_"来与运动的元素进行区别。前缀用来检测不运动的碎块。Python有几个函数可以从文本提取出字符串。因为只有静态的节点前缀是"S_",我们可以找出这个字符:

prefix = objName[:2]

这个语句只包括文本的前两个字符,例如:

objName = S_Fragment_085

objName_prefix = objName[:2]

Result(返回值): S_

一个简单的if语句允许我们提取出静态部分。pass语句告诉Python什么也不用做:

if (substring == "S_"):

pass

完整的检测程序如下:

objName = object.getName()

objName_prefix = objName[:2]

# Exclude the helper objects...

if (objName == "Ground" or objName == "Wavemaker"):

pass

# ... and the static objects (elif: read as "else if")

elif (objName_prefix == "S_"):

pass

# activate the footbridge items


else:

if (objPos_x >= refPos_x):

object.setParameter("Dyn motion", True)

使用这个脚本,结果如下图如示。白色柱子只显示静态,但Dyn已经激活。如果不满意这个结果,你可以定义别的物体作为静态或运动的,只要添加/删除前缀。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

7.7 添加水

我们完成了所有控制刚体动画的事,所以可以添加发射器了。为这个场景我决定使用Square Emitter来填充它。Fill_Obbject发射器也是适合的。使用Wavemaker对像来推动水到人行桥。当流体到达第一个物体时,效果触发帧(这里是:46帧)。

困难在于找出波浪运动的速度。慢速的浪,甚至在碰到桥之前就会破裂,失去形态。在这个例子中,整个效果只是简单的淹没,很难看到木块和支架的运动。太快速的浪,会把刚体冲的太远。另一个问题是大量的水,Wavemaker物体。如果只是一个非常薄的膜,我们不能产生足够的水花。水面也会分离,在后面留下不好看的痕迹。这些都要考虑到,并进行测试。

测试不同的效果时,必不可少的需要改变触发帧值。你可以根据波浪速度,在脚本中加大或减小触发帧值。

一个很好的主意是时间缩放。如果找到合适的波浪设置,但仍然太快,明智的做法是改变帧速率,甚至在Wavemaker运动时。你可以选择帧速率是35或40,例如播放栏是25或30帧。看一下源文件场景,看看到运行的是35 FPS.

Mass是这个模拟的重要因素。举足轻重(关键)的对像对动态有很大影响:这部分极度加速,结果是夸张的运动路径或贫乏的水花。如果物体太重,可能效果不够。使用Python batch脚本,能很容易改变大量物体属性,添加随机值。

在一些例子,波浪看起来没有足够粒子:我们会看到间隙和小洞。而如果有粒子太多,波浪会破碎。要避免这个,一开始改变Wavemaker物体的高度。可以逐步吸引切开水,携带大量的粒子,你想要的。这是最好的方法,比改变速度或Wavemaker的模型

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

我使用很低的Int Pressure(0.2)值,快速放松。如果想要更多扰乱流体,可以给"水箱"类型key帧,产生扰乱。这更适合于下雨或暴风天气场景。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索

图39:最终模拟的图片序列

7.8 最终注意点和优化

如果模拟的需要合成,可以添加一些细节到本效果中:

1.更多脚本效果,例如foam和spray碰撞

2.模型,放置在桥上,例如集装箱和酒桶。

3.更多发射器来做很赞的水效果

4.高Resolution发射器和更大的场景缩放

5.风场辅助器产生Spray和Foam

6.Speed或Pressure贴图纹理效果

7.环境物体,像树干或石头

8.更多碎块和独特的元素。

9.角色,被浪冲走使用新的脚色-环境脚本。从Next Limit(最后一章)

10.物体,在水面漂浮

通常,我们要考虑脚本对刚体和流体-刚体交互。甚至很短的脚本可以节省时间,添加更多真实性。当前示例强调脚本的重要性。所有困难和疑问,之前有一个列表,使用一个单个脚本解决了。当然,这些方法都可以手动完成,例如使用"暂停模拟(Stop-motion)"技术,但他们不如脚本精确。

Scale是第另一个问题。示例的目的,在这里宁愿使用小的缩放,实际上Cinema 4D缩放默认的是0.01.如果mesh看起来不好有空洞,大部分原因就是scale和粒子Resolution

7.9 脚本说明

下面内容是完整版本的脚本说明,更易于讨论。如果你没有写脚本经验,最好比较一下这个脚本与源文件中结点。然后,你会发现其实很容易,怎样改变橙色打印值和名称。根据参考物体在X轴方向(桥塌的方向),逐步激活物体刚体属性,如果一开始全部激活,会影响速度。

第七节:与流体交互 - 豆芽兵 - 豆芽兵的生存探索vents Script: ControlRBD.rfs

def onSimulationBegin():#程序重置我初始化场景,为了便于测试。重置只在0帧执行。
frame = scene.getCurrentFrame()
if (frame == 0): #从Node面板获取所有对像的结点
nodes = scene.getObjects()
for object in nodes: #遍历结点
objName = object.getName()
if (objName == "Ground" or objName == "Wavemaker"):#分离环境对像
pass
else:
object.setParameter("Dyn motion", False)#使用项目保持不激活(inactive)
def onSimulationFrame():
frame = scene.getCurrentFrame()
if (frame >= 46): #定义开始帧
nodes= scene.getObjects()
refObject = scene.getObject("Wavemaker")
refPos_global = reference.getParameter("Position")
refPos_x = ref_cur_pos_g.getX() #获得Wavemaker对像位置作为参考和提取出x值
for object in nodes: #遍历结点
objPos_global = object.getParameter("Position")
objPos_x = objPos_global.getX() #获得所有结点位置提取x值
objName = object.getName()
objName_prefix = objName[:2] #检测静态对像前缀

if (objName == "Ground" or objName == "Wavemaker"):#提取环境对像
pass
elif (objName_prefix == "S_"):#提取静态对像
pass
else:
if (objPos_x >= refPos_x):
object.setParameter("Dyn motion", True) #使其余对像激活(active)

  评论这张
 
阅读(2785)| 评论(9)
推荐

历史上的今天

评论

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

页脚

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