CarontFX 用户手册翻译01

来源:互联网 发布:淘宝小二介入退款撤销 编辑:程序博客网 时间:2024/05/05 01:44

本文翻译只为学习记录及知识共享
本次测试插件版本为CaronteFX v1.0.13,亲测Unity 5.4.2可用,Unity5.5.0不可用
水平有限若翻译有误请及时通知

安装CaronteFX

CaronteFX简介

CaronteFX for Unity是一款简单易用的刚体&柔体动力学模拟引擎。这个插件可以被无缝的整合进Unity用户界面中。

配置要求&安装

配置要求取决于你要模拟的类型和复杂程度。最低配置建议不要低于Intel i5(或性能差不多)的CPU和4GB的内存。如果要做更为复杂的模拟,建议最好使用i7或是更好的CPU,并且内存要在8GB以上。当前版本的CaronteFX只能应用于Windows平台。

CaronteFX插件包可以存储在任何位置和目录,每当创建一个新的Unity工程时,插件包需要通过如下方式导入:
Assets > Import New Asset… > Custom package

如何找到CaronteFX

当CaronteFX插件包被导入Unity后,将出现在“Project”窗口中。可以通过如下方式打开CaronteFX编辑器:
Window > CaronteFX Editor

  • 将出现一个新的窗口(“CaronteFX Ed”)
  • 这个窗口可以被摆放在任何位置

打开编辑器第一件事就是要创建动力学模拟物体:

  • 点击“Create FX GameObject”
  • 编辑器窗口会发生变化,并且你可以看到一个名为“CaronteFX_0”的物体
  • 所有的元素(Rigid(刚体)、soft bodies(柔体)、joints(关节)、daemons(虚拟的力)等)都将在这里指定添加

更新

关于CaronteFX更新和用户手册的问题,可以访问
http://www.carontefx.com

CaronteFX 基础

CaronteFX 场景的基本元素

Unity的基本元素是GameObject,实际上CaronteFX的每个组成元素也是GameObject。这种命名约定可能会产生误导,因为通常并无法明确一个GameObject是Unity原生的物体还是CaronteFX的节点。因此区分这些概念是很重要的:

  • Unity GameObject:是指Unity的“GameObjects”菜单中可创建的所有原生的物体
  • CaronteFX GameObject:是指存储CaronteFX的特殊节点的一种容器。这个物体的名字通常会有“CaronteFx_”前缀,后面跟着编号,例如:”CaronteFx_0”
  • CaronteFX SimulationObject:是指CaronteFX的“Bodies“、“Joints”、“Daemons”等菜单中可创建的节点,这些元素被组织在“CaronteFX GameObject”物体下

你的第一个CaronteFX 场景

CaronteFX不能创建任何的基本物体,比如sphere、cube或是cylinder。同样也不能建模或是展UV。但是CaronteFX可以利用Unity中存在的物体,并将它们转化为刚体或是柔体,或是把它们拆分成碎片。当然也可以将碎片粘在一起,然后创建真实的特效,比如添加爆破效果,或是用外力来驱动这些碎片。
我们来创建一个简单的场景,看看CaronteFX在Unity中是如何工作的:

  • GameObject > 3D菜单创建一个Cube
  • 缩放这个Cube,让它作为地面
  • 创建一个Cylinder,移动到地面上面,并旋转它

    设置好之后的场景

现在,在CaronteFX的编辑窗口中点击“Creat FX GameObject”按钮

这里写图片描述

这时候新创建的容器包含一个“Gravity_0”重力,这个重力是自动添加的。重力是指我们这个虚拟的场景中的一个中心力量。这个力会给cylinder一个加速度,并让它下落。先前设置的地面将作为静态的障碍物。

点击“Gravity_0“,先前的巨大Logo将会被一个参数面板所替代。在“Acceleration”参数栏,你可以一组默认的数值

这里写图片描述

  • 这个指表示地面的重力加速度为:9.81 m/s2
  • 负数表示所有受影响的物体将会下落(当然是沿着Y轴)

将Unity的GameObjects转换为CaronteFX的SimulationObjects

接下来我们需要确认,cylinder物体是要运动的,而地面将保持静止,但它同时要与cylinder发生交互。

点击CaronteFX编辑器中的“Bodies”标签,然后点击“Rigid”按钮

这里写图片描述

在“CaronteFx_0”下将出现一个新的“RigidBodies_0”,选中它的时候,一个新的参数面板将出现,但目前来说这些设置对我们还不是很重要。
现在我们唯一需要注意的是里面的“Objects”属性

  • 将“Cylinder”物体从Hierarchy面板中拖拽到“Objects”属性栏中
  • 现在Cylinder物体就被转化为一个刚体了,并且下面这些属性参数定义了它的物理属性

这里写图片描述

接下来我们要来设定地面

  • 点击CaronteFX编辑器中的“Irresponsive”按钮,选中新建的“IrresponsiveBodies_0”,并将场景中Cube拖拽到“Objects”属性栏中

这里写图片描述

现在这个场景已经可以用于CaronteFX的动力学模拟了,最后我们设置一些属性,点击“CaronteFx_0”,将会出现一些参数:

  • 默认的“Total simulation time”是10秒,对于当前的场景来说太长了,我们改为2秒
  • “Quality”属性可以控制整个模拟的精确度,像目前这样简单的场景,将值改为20比较合适,同样值越低模拟的速度也会越快

这里写图片描述

最后,点击“Simulate”,这时候会出现一个新的窗口——“CarontFx Player”,这时候你会看到Cylinder物体在下落,一段时间之后Cylinder物体碰撞到地面并停止了。

这里写图片描述

烘培&创建资源

现在模拟的结果只是临时存储起来,当我们关闭CaronteFX Player的时候数据就会丢失。如果你想把模拟的结果永久保存起来,我们就需要进行烘培操作

  • 点击“Bake Simulation”按钮
  • 输入一个新的名字并点击“Bake!”
  • 指定资源存储的路径

这里写图片描述

资源重用

当我们把模拟的结果烘培并且保存好,它会自动添加到场景中。这些物体是与场景中原始物体相同的,并且所有的属性都可以修改。这意味着你可以创建不同的版本,烘培它们,并且保存为资源。

柔体&布料

上面的流程同样适用于柔体和布料的模拟。

更多的工作流程

CaronteFX提多了很多可能性来提升我们的工作流程:
我们可以直接将Unity的Hierarchy中的物体直接拖拽到CaronteFX编辑器中来指定物体是刚体还是柔体,这是一种非常好用的方法,当我们拖拽过去的时候,会出现一个菜单,来提示我们物体将作为什么类型来参与模拟。
除此之外,我们还可以通过点击“Bodies”中的按钮先行创建需要的节点,然后在节点的Objects属性中指定要确定的Unity物体。
任何时候你可以修改Unity中物体的名字,它会自动更新到CaronteFx SimulationObjects中。

创建组和簇

目前,每一个CaronteFx的SimulationObject(“Rigid”和“Irresponsive”)都控制一个Unity物体:一个Cylinder和一个Cube。但也可以用一个SimulationObject来控制多个物体。
新建一个工程或是场景,创建一个CaronteFx物体和一个irresponsive地面,然后在unity中创建几个原生物体并随机摆放他们。
点击Bodies > Rigid(或者 Soft/Cloth)然后将unity中创建好的那些原生物体都拖拽到“Objects”属性中。设置完成后点击“Simulate”按钮。
这样做的好处是这些用于模拟的物体只需要设置一次属性就Ok了,但缺点是他们看起来几乎是一样的。避免这种情况的方法是创建带有相同属性的物体簇,例如相同质量、摩擦力或是相同Restitution设置的。这样就需要多组CaronteFx SimulationObject了。

这里写图片描述

为了更好的管理场景,可以给CaronteFx的SimulationObject重命名。右键点击并选择“Rename”来给它重命名。

这里写图片描述

CaronteFx的SimulationObject可以被打组,通过点击General > Group可以创建一个组,然后将SimulationObject拖拽进这个组里面。

这里写图片描述

更多关于Bake和Collapsing的信息

CaronteFX Player(点击“Simulate”按钮后出现)提供了一个很实用的功能,可以烘培单个帧,并保存为资源可以使用。

这里写图片描述

这是非常方便的,例如可以在一个平面上将一些碎片分开:

  • 将一个物体破裂开
  • 模拟到你喜欢的某一关键帧上,然后将这帧烘培成资源保存起来
  • 保存好的资源中的物体不带有任何的动画信息的,就像一张静帧一样

另一个有趣的选项是“Collapse”。这个单选框属性出现在“Bake simulation”窗口中,但请注意在“Bake current frame”中是不可用的。

这里写图片描述

勾选这个属性的烘培物体被统一当作一个Mesh来处理,但是节点中特有的属性被保留了。如果不勾选,每个物体被当作一个单独的Mesh来处理。这样做的好处是塌陷在一起的物体在游戏运行的时候需要的资源更少,大概会节省30%左右的性能。

改变属性

模拟的属性影响着每一个物体,所以我们建议每当修改一个属性的时候就看一下场景中发生了什么变化。可以先从调整mass(质量)、density(密度),然后是“Restitution”,接下来设置Kinetic friction(动摩擦)然后是External damping(外阻尼)。这是常用的一个调整流程,调节这些属性,直到达到你想要的效果。
但问题是你要想好需要创建什么类型的材质

  • 粗糙的木材或砂石有很高的摩擦力
  • 光滑的金属或玻璃表面只有很少摩擦
  • 橡皮比塑料或金属的反弹力更大(“Restitution”)

一个物体的形状也会影响它的摩擦力和空气阻力。空气阻力就像开车时候你把手从窗户伸出去感受到的一样。在CaronteFX中,空气阻力可以用“External damping”来模拟,他可以让一个移动的物体迅速停止下来。

  • 球状或圆柱状的物体,由于它们的形状圆滑,会认为它们的摩擦力和“External damping”值会比较低
  • 方块状的物体会有很大的接触面,所以一般认为它的摩擦力和“External damping”值会比较大
  • 尖锐的物体可以设置比较高的“External damping”值,因为这种形状的物体在现实世界中经常会造成混乱

理解Mass(质量)

另外一个基本的属性就是mass(质量),并且理解mass(质量)在CaronteFX中如何工作是很重要的。在“Set mass by”下有两个选项:

  • Mass(by single body)
  • Density

最重要的一点:默认情况下质量不是重量,尽管在所有的语言中他们的含义都基本相同。重量是由它所在位置决定的:例如在月球、木星或是火星上。那些星球都有不同的重力加速度,即使在地球上重力加速度也不是固定值,但是9.81 m/s2 是地球重力加速度大概的平均值。所以也是“Gravity”属性中的默认值。在CaronteFX中,重力是这么计算的:
Weight = object’s mass * abs(gravity value)
因此重力是没有负数的,“Gravity”的默认值-9.81 m/s2 会取绝对值后来参与运算。

理解Density(密度)

Density(密度)是通过如下公式计算的:
Density = mass / volume unit(公斤每平方米)
密度就像我们日常生活中所了解的。不同材质的物体有不同的密度,比如木头和水泥。当我们将密度不同的流体混合在一起的时候,密度也会跟着发生变化。当我们把一个金属球扔进水里的时候,它会迅速的下沉,但当我们把一个沙滩排球扔进水里的时候它却会浮在水面上。
像上面我们看到的,Density(密度)也取决于物体的体积。CaronteFX会自动计算每个物体的体积。但这些为什么这么重要呢?想象一下,你有一些不同形状不同大小的物体,然后你把他们的mass(by single body)都指定为50kg。这个值会运用到每个物体上,但不会考虑它的大小,所以一个半径为1m的球会和半径为10cm的球有相同的质量。
这意味着需要去改球的Density来获取一个真实的模拟。根据上面的信息我们可以算出这两个球的Density(密度)
这里写图片描述
通常你不需要做这些运算,因为CaronteFX会自动计算这些。这面的例子只是告诉你这些是如何发生的。

通过Density来改变Mass

给mass(质量)设置一个固定值会造成不理想的效果,比如一个破碎了的物体,每一个碎块都应该有相同的Density(密度),因为它们都是由相同的材质组成的。但是每一个碎块都有不同的质量。所以我们需要把“Set mass by”改为“Density”,运算的方式如下所示:
Mass = Density * volume
不同体积的球的mass(质量)如下:
这里写图片描述

柔体的属性

柔体的属性是比较抽象,因为我们日常生活中对这些属性接触的不多。我们对柔体的质量、摩擦力甚至密度并没有太直观的感受。
开启一个基本的场景:一个圆柱体(轮胎)的柔体停在一个作为irresponsive的地面之上。这个圆柱体(轮胎)有一个固定的重力,这个重力由它的质量和场景中的“Gravity”决定。如果你看了上面的章节,你应该理解一个物体的重力是如下公式计算的:
Weight = mass * abs(gravity value)

Stiffness(刚性)

物体自身的重力会让柔体产生形变,因为它会被自己的重力压垮。这时候就是Stiffness属性发挥作用的时候了。一个柔体的Stiffness值越高,它表现的越像个刚体,值越低越容易发生形变。在现实世界中,一个刚体可以被看作Stiffness值无限高的柔体。
汽车的轮胎是一个很好的例子:
当轮胎里充满足够的空气的时候,轮胎总会保持它的形状,因为空气和轮胎的材质加强了它自身的Stiffness值。当气压降低,轮胎就没有足够的抵抗力来承受汽车自身的重量了,轮胎底部就会变得更加的平。
尝试慢慢降低“Relative length stiffness”的值,例如从1.0–0.1–0.01,随着数值的改变,你会发现值越小,轮胎越容易发生形变,但这也有一个限制。这个限制是由“Relative volume stiffness”数值引起的,当体积发生改变的时候这个参数会起到保护作用。在这个例子中,形变是比较柔和的,因为“Relative volume stiffness”属性会抵消物体塌陷的趋势,当你把这个数值调低的时候,形变的程度会更大。

这里写图片描述

Damping(阻尼)

现在让物体垂直下落到地面上,这时候你可以看到物体变得更加的平坦了,这是由物体的动能造成的。物体的Stiffness(length和volume)值越低,就会塌陷的越平坦。

这里写图片描述

Stiffness值会造成物体这种塌陷的效果,并且会引起物体的抖动。为了减少这种效果,可以增加“Internal damping”值,比如0.7。
尝试不同的数值,来感受一下这个属性是如何产生效果的。

使用Joints创建物体碎裂的场景

CaronteFX有三个强大并且易用的破碎工具。使用这些工具可以破碎任何unity中的物体。这个过程是无损的,并且原先的物体还会被保留。
我们现在需要一个作为irresponsive的地面物体和一个“Gravity”重力,然后添加任意的一个unity的物体。然后选中“Fractures&Tools”菜单,添加一个“Uniform”节点,将Unity中的物体拖拽到它的“Objects”属性上。

打碎物体

“Rough number of pieces”是很重要的一个属性,在这里你可以设定想要把物体打碎成多少个碎块。最终实际打碎的碎块数量往往会和设置的值有差异,但通常会得到相同数量的碎块。最终呈现的碎块数量会在“Stats”中看到。

“Global pattern”只会和多个物体的连结相关,当激活的时候

  • “Objects”中所有的物体会被当作连贯的物体看待
  • 你将看到裂痕是扩散传播的(如下方右图)
  • 碎片的数量与“Rough number of pieces”相符合(如下方左图)

否则每一个物体的破碎都是单独的,碎片的数量为
Rough number of pieces * number of Unity GameObjects

这里写图片描述

设置完属性后点击“Chop”按钮,破碎好的碎块被自动打好组并添加进Hierarchy窗口中。如果你不喜欢这个结果,只需要重新设定参数,然后点击“Chop”按钮,场景中的碎块会自动更新。
拖拽“Push rate”滑条可以看到破碎出来的碎块。

这里写图片描述

这个特性可以让你看到整个破碎物体分开之后的效果

这里写图片描述

连接碎块

现在可以将Hierarchy窗口中的“Fracturer_0_output”拖拽到一个新创建的“Rigid”SimulationObject节点中,根据之前章节讲解的方式来调节刚体属性,这里比较重要的一点是Mass(质量),需要改为“Density”的方式,这样每个碎块根据体积不同就有了不同的质量。
当模拟开始的时候你会看到碎块碰撞到地面的时候破碎开来,这种效果还不是很真实,看起来有点像山上的碎石,不像打碎物体。

这里写图片描述

因此从“Joints”菜单中找到“Rigid Glue”并添加一个。这个场景中,所有的物体应该被重新连接:将“Fracturer_0_output”组拖拽到“ObjectsA”和“ObjectsB”上。

这里写图片描述

开始模拟之后会发现所有的碎块都粘在了一起,并且不会被打碎,这时候勾选“Break if distance exceeded”并且降低“Max force(N)”值,比如降到6000。这个时候我们需要多尝试,很快会对这个参数有感觉。

这里写图片描述

设置这些参数的效果就是当给定的力达到一定程度的时候碎块就开始分解。当碎块之间的距离超过“Break distance(m)”,连结将会被打破,碎块就可以自由的移动了。最终绿色的点表示没有被打破连结的,红色的点表示打破了连结的,紫色代表着中间状态。
通过调整“Max force rand”和“Break distance random”数值可以让模拟的效果更加逼真。

这里写图片描述
这里写图片描述

替换&触发器的基础

在接下来的案例中你将学到如何用一个物体来替换另一个物体。如下,一个刚体Cube在某个时间被一个刚体Sphere代理。这个设置是非常简单的,你需要的只是一个作为irresponsive的地面和一个作为重力的Gravity、一个刚体Cube、一个刚体Sphere。

这里写图片描述

方块和小球的位置应该是相同的,你会很快明白为什么这么做。在这个案例中,两个物体有着相同的Transform:

  • 世界坐标Position (0.0,2.5,2.0)
  • 缩放Scale (1.5,1.5,1.5)

选择“Rigid_Cube_Original”这个SimulationObject,在参数面板中修改“Initial linear velocity”的值为(0,0,-3),这样方块会获得额外的一个推力。然后将小球和方块这两个刚体的Restitution的值都改为0.7。
这时候开始模拟,你会看到两个刚体分开了,各走各的路,小球直接下降,方块由于初始速度向前移动了一些,很好 这就是我们预料到的。

这里写图片描述

现在从“Actions”菜单中添加一个“Substituter”,添加它的属性参数如下图所示:

这里写图片描述

CaronteFx_0 > Total simulation time(sec)中将模拟的时间长度改为3.5秒。
现在开始模拟,我们将会看到:

这里写图片描述

当时间到了1秒的时候,方块物体会隐藏然后被小球所取代,发生这个事件之前,小球已经作为方块的子物体。如果这两个物体的初始位置不同那么你会看到偏移。

触发替换事件

如果当方块碰撞到地面的时候发生替换事件那么效果会更好,但这点很难手动做到。因此,最好把这件事交给“Trigger By Contact”事件来处理,下图为属性设定:

这里写图片描述

把“Substituter”节点中的“Time(s)”属性设置为0。重新开始模拟,这时候替换事件就发生在当方块碰撞到地面的时候了。当然也可以用其他的Trigger节点来实现这个功能。

使用破碎物体来测试

就像你所看到的,基本的工作流程是很好理解的,但是之前的案例场景只是讲解了一下CaronteFX的基本概念,“Substituter”最主要的功能是控制破碎物体。接下来的案例场景基于当前的设置并有一些修改:

  • 删除场景中的Sphere和与它相关的刚体的SimulationObject
  • 在“Fracture&Tools”面板中添加“Uniform”节点
  • 更改Rigid_Cube_Original > Initial linear velocity.Z > 0
  • 将“Cube_Original”物体打碎成25块
  • 在场景中添加一个新的Cube物体并缩放它,把它作为障碍物,重命名为“Obstacle”

这里写图片描述

现在的想法是让“Cube_Original”物体下落到障碍物上,但是保持连接。当Cube接触到地面的时候就会破碎。现在这种情况是不需要用“Substituter”和“Trigger By Contact”节点来做的。
开始之前,我们还需要做一些操作:

  • 把“Obstacle”物体作为irresponsive物体(使用一个单独的“Irresponsive”节点)
  • 把破碎好的方块作为一个单独的“Rigid”

下图是设置好之后的模拟的树状图:

这里写图片描述

现在“Trigger By Contact”节点可以保持不变,“Substituter”节点按照下图更改:

这里写图片描述

现在当我们开始模拟,会看到方块撞击到地面后发生破碎。

这里写图片描述

当然也可以创建非常复杂的设置,包括不同的trigger和时间,不同的破碎物体、爆破、甚至多种不同的substitution。

Probability(可能性)

或许你已经看到了“Probalility”属性,想象一下你场景中有100个sphere物体,当两秒之后你想把其中一些sphere替代为cube。有一个方法是去创建一些组,但这是一个繁重的任务。节省时间的方法是使用“Probality”属性

  • 设置为50%大概会将50%的sphere替换为cube
  • 设置为80%大概会将80%的sphere替换为cube

如果你对替换的结果不满意,可以修改“Probability seed”属性,这样会出现不同的替换结果。

2 0