【译】FarseerUnity教程-第二部分
前言:Farseer是Box2D的C#实现,而FarseerUnity是Farseer的Unity版本插件,适用于4.X版本,在资源商店可以免费下载。
翻译出处:http://www.catsinthesky.com/blog/article/2012/03/7/farseer-physics-box2d-and-unity-part-2
现在我们已经了解了Farseer物理引擎端口的基本情况,让我们来了解更高端的东西。上一部分我涵盖了世界、身体和基本形状组件……那么接下来讲解凹面形状和链接怎么样?
在开始这次教程之前,下载这个文件然后创建一个新的工程。
凹面形状
在现在市面上99.9%的物理引擎中,你不可能拥有一个真正的凹面形状。如果一个物理引擎默认支持凹面形状,它可能是把这个形状分解成几个小的凸面形状。手工去做这件工作会非常令人沮丧和浪费时间,但是幸运的是,Farseer包含了几个将凹面转为凸面的分解器。
创建一个包含一个摄像机(尺寸27)和如下图所示的FSWorldComponent的场景。

现在,在我们继续之前,我们可以增加一个简单的测试组件到有FSWorldComponent的物体上,你能以“FSMouseTest”的名字找到它(在工程标签)或者如下图所示。

现在创建一个基本的方块,把它设置成地面。在你设置好你想要的尺寸(和材质、名字等等)后,给它添加FSBodyComponent。

按规矩在FSBodyComponent的同级添加FSShapeComponent。因为我们只想使用一个形状而且想借用Unity的碰撞器去定义形状,我们没必要往一个子物体上增加形状组件。在设置形状之后,我复制了地面物体去制造墙(下图)。

因为我们现在要设置一个凹面形状,添加一个新物体。实际上它是一个很容易从轮廓线转换成凹面多边形的组件。我把它命名为complexBody(如下图)。

增加一个片面(来当做我们复杂凹面形状的显示)。把它设置成“complexBody”物体的子物体。把它的X轴旋转-90度。给他添加complexShape1材质(下图)。

创建一个新物体再把它设置成“complexBody”的子物体。它会成为包含形状转换组件的容器(下图)。

现在我们增加FSConvexShapeComponent而不是常用的FSShapeComponent(下图)。

增加一个物体,把它作为“complexBody”的子物体。我把我的命名为“p00”。设置它的坐标(下图)。

现在开始克隆这些点和按逆时针顺序设置它们(下两图)。


现在重命名这些物体然后把它们加到“TransformPoints”数组(下图)。如果设置正确,你应该会看到洋红色的点和带数字的线。

点击“产生凸面形状”按钮以后会生成真实形状。如果你稍后需要改动什么,你可以再次点击这个按钮去更新形状(老的会被重写)(下图)。


下图展示了这个组件生成了什么。轮廓线变成了6个多边形(下图)。
这个复杂图形已经完成啦!如果你还没给“complexBody”添加FSBodyComponent,现在添加。然后点击运行测试它的碰撞器。因为我们在之前已经添加了鼠标测试组件,你可以用鼠标去移动这个物体。
距离链接
来自于Box2D手册:“最简单的一个链接就是一个说明两个身体上两个点的距离必须是常量的距离链接”。它们也是最早配置上的。
开始先做一个球,给它增加FSBodyComponent和FSShapeComponent。设置形状为圆形然后取消“使用unity碰撞器”选项(下图)。

克隆这些球直到你有8个。重命名它们,这样你在设置距离链接的时候就不会混乱了(下图)。

增加一个FSDistanceJointComponent。因为它无论是不是圆的子物体,链接身体的功能都不会受影响,所以你把它加到哪都无所谓。我给每一个圆形都增加了一个组件(除了最后一个)(下图)。

给每一个链接组件连接身体A和身体B。我连接他们的模式是把有链接组建的物体当做身体A然后下一个物体当做身体B(下图)。

一旦你连接完所有,你可以点击运行测试下你的创造物(下图)。

测试完以后,我克隆了连接的物体然后把其中一个的身体设为静态去测试这种链接针对静态身体的情况(下图)。


旋转链接
“一个旋转链接使两个身体分享一个共用锚点,一般叫做枢纽点。旋转链接只有一个自由度量:两个身体的旋转角度。它被叫做链接角度。”
增加两个方块,设置它们的身体和基本形状组件。把一个调整的比另一个小然后设置形状类型为静态(下图)。

为基本物体增加FSRevoluteJointComponent(小的静态方块)(下图)。

FSRevoluteJointComponent拥有一些选项,不像距离链接。两个身体会共享定义在身体B(本地锚点B)。现在,它设置为【0,0】,意味着两个身体会共享在身体B中心的点。限制选项可以把连接物体的共享旋转角度限制在一个精确的角度范围内(一般被用在制作布娃娃)。发动机选项能在这个共享的点上产生一个角动力(一般被用在制作轮子)。

把小的身体(基础的那个)放到身体A字段,然后把另一个方块放到身体B(下图)。

如果你点击运行,你会看到如果一个物体掉到它上面,这个平台会旋转。
现在让我们测试一下发动机选项。选中“发动机可用”选项然后设置一个不为0的速度(下图)。

现在测试一下角度限制参数,克隆两个物体然后把它们移到源物体的旁边,然后把平台移动成下图所示的样子。

设置本地锚点让共享点在身体B的左边界(下图)。


现在选中“限制可用”参数。白线是身体B现在的角度。这个旋转被限制在红线和绿线之间(下图)。


克隆大平台,缩放它,然后把它放到源平台的右边界(下图)。给它增加一个FSRevoluteJointComponent。身体A会是大平台而身体B会是这个新物体(下下图)。


棱柱链接
“一个棱柱链接允许两个身体在一个特定轴向上相对平移。一个棱柱链接阻止相对旋转。因此,一个棱柱链接只有一个自由度量。”
来测试一个棱柱链接:再次克隆这个方块,改变它的颜色/材质,从它身上去掉旋转链接然后如下图般移动它。

给它增加一个FSPrismaticJointComponent。

身体A是大平台,我把这个方块重命名为“滑块”。这是身体B(下图)。

现在再次测试。如果一切正常,你应该看到如下内容:
