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

豆芽兵的生存探索

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

 
 
 

日志

 
 

022_015_Graphs_Conditions(条件判断)  

2013-08-17 23:44:42|  分类: RF2013中文帮助 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

022_015_Graphs_Conditions(条件判断)

 使用条件可以比较不同值,然后做一个判断。这个判断决定了结点图会往哪个"路线"执行。接下来使用一个"if"语句做一个比较。在这个示例中,汽车有三种状态:加速,减速,或保持当前速度。

|-----大于 50 km/h → 加速

If(如果)速度 |----- 等于50 km/h → 速度不变

|----- 小于50 km/h → 减速

当使用条件语句时,早晚要碰到布尔(Boolean)运算符,和布尔型。最常用的运算是:"AND(与)", "OR(或)", "NOT(非)""AND" "OR"一个典型应用是加入条件s:

if ( velocityCarA > 50 AND velocityCarB > 50 )://如果..汽车A速度大于50并且汽车B速度也大于50

velocityCarA = 50

velocityCarB = 50

if ( particleAge >= 5.0 OR particleAge <= 10.0 )://如果粒子年龄大于等于5,或者粒子年龄小于等于10

add particle to emitter B //发射器B生成粒子

if ( parameter( "Dynamics" ) IS NOT "Active rigid body")://如果"动力学"的"刚体"参数未激活

set "Dynamics" parameter to "Active rigid body"//设置"动力学"参数为"刚体"

使用布尔变量是不一样的。它只有两个状态。"TRUE(真)" "FALSE(假)"。这些状态通常用01来表示,称为"bits(二进制数)"

if (object is visible = TRUE)://如果物体显示属性=真

hide object//隐藏物体

if (object is visible = FALSE)://如果物体显示属性=假

show object//显示物体

如果你使用二进制数来表示"True()"和"False()",那么"0"和"1"就不能再看成是整数了。并且你使用的结点还要支持这种数据类型.

理论上,condition(条件判断)是非常容易处理的:当你想做一个判断,要符合一个确定条件或是比较一个阈值时,那么你一定要引入一个条件结点来定义选择路径。有时候在结点图中有点麻烦,而在Python只要一行代码就可以了。你应该知道条件通常有一个以上方法来实现。

这里有几个例子带你入门,我们建议你先试试几个熟悉的条件判断,知识这些结点是如何起作用的。在"示例"小节中,还有更复杂的一些结点图,教你如何比较Vector(矢量)和Array(数组)

A > B

在第一个示例,我们进行一个简单条件判断 A是否大于B。意思就是如果A真的大于B,那么我们就会得到返回值"TRUE"(二进制数:1) ,否则就是"FALSE"(0).

现在你至少需要两个数字元素(这里是:integers整型),比较条件使用"greater than"条件。这里有三个元素,可以看到"ConditionGreaterThan" 结点只接受一个值。因此,如何去连接另一个值呢?另一个问题是AB得连接到这个自由的端口?让我们现解决第二个问题:这个结点你需要连接的是B,因为它可以看作是一个阈值——"目标",B得要执行得到"TRUE"结果。现在你需要什么:一个可以计算条件和进行比较的节点。请添加这个结点:

Tab 菜单 > Condition > ConditionFilterBy

这个节点包含了另一个"值——A"的端口。现在两个"condition(条件)"通道得要连接上。最后一步,使用一个 "MessagePrint" 结点用来检测最后输出结果,当然不要忘记了使用"Evaluator" 结点来结束流程图。最终输出结果取决于你AB值的设定——结果由"result"或"mask"输出:

022_015_Graphs_Conditions(条件判断) - 豆芽兵 - 豆芽兵的生存探索

 

在这里使用的值是:

A ("Integer_01") = 765; B ("Integer_02") = 97; output = result

根据不等式,A值必须要大于B

765 > 97 = TRUE

"Messages" 窗口,你就会看到:

>[10/April/2013 19:08:27] - MessagePrint_01: 765

下一步,AB都保持不变,但使用"mask"通道输出。如果你看到是"1",那就对了,因为这个二进制数就表示"TRUE":

>[10/April/2013 19:10:50] - MessagePrint_01: 1

如果交换AB,结果就会是"0"

( A >= B ) AND ( A <= B )

这里值为了方便起见,这里三个值都还是使用整数。布尔运算符"AND"是用来检查A是不是在一个区间中:A需要在10(=B)和50(=C)之间,如:

( A >= 10 ) AND ( A <= 50 )

加括号只是为了增加可读性。当然是可以给A设定为了一个固定的值,但那就没什么意思了。因此我们将会随机生成0到100之间的数,然后建立一个结点图,检测这个随机数到底满足不满足条件。为了创建随机数,将要用到3个随机数:两个integer结点(0和100)是最大值和最小值,随机数就会在这之间生成,也包括这些极值。随机数生成结点可以在Tab菜单里搜索到:

ArrayNumRandom

这个结点有四个输入端口:

size(大小)

存储值。因为A是单一的值"大小" 就为 1

min/max(最小/最大)

随机数将在这两个值之间生成,并通过"Integer" 结点确定

seed(种子)

默认时随机数生成结点,每一次执行只会产生相同的结果。 使用这个 "seed" 值,就会产生不同的初始条件,也就可以产生不同的随机数了。所以你想生成新的随机数,只要更改这个 "seed" 值就可以了。

生成的随机数表示A。需要使用 "Integer" 结点来作为BC。添加这两个结点之前,花一点时间想一下你想要这个结点图做什么,大概是一个怎样的思路。这是非常重要的。

A = 83

A >= 10 => TRUE (1)

A <= 50 => FALSE (0)

A不在10 50之间. 最终结果是 "FALSE" (0).

A = 27

A >= 10 => TRUE (1)

A <= 50 => TRUE (1)

A10 50之间. 最终结果是 "TRUE" (1).

为了比较值,需要两个"ConditionFilterBy" 结点。因为每个条件需要单独处理。在前面的示例中,条件是使用两个结点处理的,但这只是其中一个方法。RealFlow的"Graph"提供了很多函数,其中就有一个只要使用一个结点就判断的。在这个示例中,将使用下面的:

ConditionFilterByGreaterOrEqual

这个结点有两个输入端口,并且"grater or equal"条件是内置的。现在开始连接结点端口。如果你阅读过前面"Data Types(数据类型)"那一章,你可能会觉得有点矛盾。因为随机数生成器是把结果存储到数组中的,而别外两个变量是整型integers

.因此,条件结点同时接受了两个数据类型,如下图所示。但这是一个特别的结点,因为它可以比较数组中的元素,其结果是另一个包含有符合条件元素的数组(大于,等于,等等)。现在结点图如下所示:

下一步是建立布尔运算符"AND",使用这个结点:

022_015_Graphs_Conditions(条件判断) - 豆芽兵 - 豆芽兵的生存探索

 

BitAnd

这个结点只接受 "1" 或 "0" ,可以使用 "mask"这样的端口输出。这个结果是 "1" 或 "0" 现在你可以成功创建所有整个判断结点图,使用随机数生成器生成的数字会显示到"Messages" 窗口。下面是完整的结点图:

022_015_Graphs_Conditions(条件判断) - 豆芽兵 - 豆芽兵的生存探索

"seed" 值为54,输出结果是:

>[11/April/2013 09:18:19] - MessagePrint_01: 45

>[11/April/2013 09:18:19] - MessagePrint_02: 1

The "ConditionIf" 结点

如果你留意过"Tab" 菜单的Condition" 那一栏,肯定看到有一个"ConditionIf" 结点。为什么这个结点现在还没用到呢?原因是不只有一个方法用来建立条件判断,这是一个灵活的系统,完全根据自己需要选择.

在这个示例,任务是判断某一个物体是不是 "Active rigid body" 状态。反馈结果像这样: T

  • Cross01 is an active rigid body (Cross01是一个刚体已激活)
  • Vase03 is not an active rigid body(Vase没有激活刚体)

意思是你得需要两个字符串:物体名称和 "is/is not an active rigid body"。这个过程也称为"连接字符串" 。使用一个单一的结点会让过程更清晰。如果想拓展这个结点图,想遍历整个场景,可以去参考"Loops"那一章。

在开始建立结点图前,先说一下"Dynamics(动力学)"参数是很重要的,一个物体模型在RealFlow有这样几种状态 "None(无)", "Active rigid body(主动刚体)", "Passive rigid body"(被动刚体) "Soft body(柔体)"。这些显示的状态是字符串,当然是可以直接比较的,但还有一个基于数字的方法。使用数字序号来代表"Dynamics"状态。根据RealFlow规则: "Active rigid body" 可以使用 "1" 来表示。

接下来的障碍是输出到"Messages" 窗口。因为目前示例"MessagePrint" 只显示一个字符。在这种情况,可以把不同字符合并到同一个结点上。 在这个示例中,需要的字符串是"结点名称","is an active rigid body""is not an active rigid body". 请添加下面的结点:

  • 1 x GetObject
  • 1 x GetParameter
  • 1 x GetNodeName
  • 2 x String
  • 2 x StringConcat2

"StringConcat2"结点可以连接字符串:

  • left: "getObject"输出
  • right: "String" 结点输出("is/is not an active rigid body")
  • separator: "空格"字符

目前,结点图看起来像这样:

022_015_Graphs_Conditions(条件判断) - 豆芽兵 - 豆芽兵的生存探索

条件自身要检测物体是不是active rigid body ("TRUE") ("FLASE"). 使用值为1"Integer" "GetParameter" 结点来帮忙。这里的"parameter" 端口得要是"Dynamics".。当前状态可以在"number" 端口找到: 0 3. 如果两个值("integer" and "number")相等,就说明这个物体是一个激活的刚体(active rigid body)。两个端口使用这个结点连接:

ConditionFilterByEqualTo

这个"ConditionFilterByEqualTo" 结点的 "mask" 端口输出到ConditionIf结点的condition端口。

ConditionIf

操作模式是: "mask" 变量是"TRUE" (1)就会输出 "true value" 否则就会输出 "false value".。现在你所要做的就是,把连接好的字符串连接到"true value" "false value" 这两个端口。

最后 "MessagePrint" 结点连接到"value" ,再由"Evaluator" 结点结束:

022_015_Graphs_Conditions(条件判断) - 豆芽兵 - 豆芽兵的生存探索

 要检查这个结果是不是正确。改变物体Dynamics状态就可以:

>[11/April/2013 10:44:38] - MessagePrint_01: Rocket01 is an active rigid body

>[11/April/2013 10:44:59] - MessagePrint_01: Rocket01 is not an rigid body

  评论这张
 
阅读(531)| 评论(0)
推荐

历史上的今天

评论

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

页脚

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