LayaAir3-IDE可视化2D物理编辑详解
Author : Charley
一、新手必读
1.1 前言
本篇涉及2D物理IDE可视化编辑的全部内容,也就是说,不需要写一行代码,就可以通过可视化操作完成了物理的配置与效果实现。
如果您是刚接触物理引擎的新手,本篇不可避免的会涉及一些物理学相关的基础概念,文档中会尽可能简要说明,让大家理解作用与效果。
但本篇重点在于介绍引擎物理组件属性的作用与如何使用,为了文档的连贯性,对于过于基础的概念,可能不会太详细的进行描述。
此时,如果涉及到某块基础概念不理解,或者想进一步深入理解,需根据关键字自行搜索补习相关的基础知识。
1.2 物理引擎长度转换需知(必读)
LayaAir3引擎内置支持Box2D物理引擎2.4.1版本。本篇文档全部内容均是基于该版本的物理引擎。
在Box2D物理引擎中,长度的单位是一个抽象的概念,物理引擎只关心相对长度和比例关系,而不关心具体的实际物理单位。
但是,常规情况下,会基于现实中的米、千克、秒(MKS)的单位制。
例如,默认的重力加速度值为 9.8,对应于现实世界中的 9.8米/秒²(m/s²) 。
物理密度的单位是质量除以面积,如果使用 MKS 单位制,那么密度的单位就是 kg/m²。
由于游戏中均是以像素作为长度单位,用米作为长度单位对游戏开发者而言并不直观。
所以,LayaAir3引擎IDE为了直观的表达,除了重力加速度之外,默认将物理引擎中的1长度单位转换为50个渲染像素。
并且,在项目设置中开放了长度转换比率的设置,开发者可根据项目实际需求,自主进行调整,调整位置如图1-1所示:

(图1-1)
该设置与原生的Box2D物理引擎以及LayaAir3.1之前的版本有所不同,使用过旧版引擎的老用户请重点留意。
二、物理组件
2D物理系统中包含以下组件,点击链接查看各组件的详细文档:
2.1 碰撞器组件
| 组件 | 说明 |
|---|---|
| 刚体 RigidBody | 动态或运动学刚体,继承自 ColliderBase,用于受力运动的物体 |
| 静态碰撞器 StaticCollider | 静态物理对象,继承自 ColliderBase,用于地面、墙壁等不可移动物体 |
2.2 关节组件
| 组件 | 说明 |
|---|---|
| 距离关节 DistanceJoint | 约束两个刚体锚点之间保持一定距离 |
| 鼠标关节 MouseJoint | 使刚体跟随鼠标移动的约束 |
| 焊接关节 WeldJoint | 将两个刚体固定在一起,保持相对位置和角度不变 |
| 滑轮关节 PulleyJoint | 模拟滑轮系统,一个刚体上升时另一个下降 |
| 马达关节 MotorJoint | 指定两个刚体间的相对位置和角度,通过施加力和扭矩维持 |
| 旋转关节 RevoluteJoint | 允许刚体围绕锚点旋转,可配置马达和角度限制 |
| 平移关节 PrismaticJoint | 限制刚体沿特定轴线进行直线平移 |
| 齿轮关节 GearJoint | 连接两个关节,模拟齿轮传动效果 |
| 轮子关节 WheelJoint | 模拟车辆轮子挂载及悬挂系统 |
三、碰撞形状 shapes
原有的独立碰撞体组件(BoxCollider、CircleCollider、PolygonCollider、ChainCollider、EdgeCollider)已被移除,统一使用碰撞形状(Shapes)来定义碰撞区域。如图3-1所示。

(图3-1)
3.1 碰撞形状与刚体的关系
碰撞形状用于定义物体在物理世界中进行碰撞检测的区域。
刚体(RigidBody)或静态碰撞器(StaticCollider)是碰撞形状的载体,它们定义了物体的物理性质(如刚体类型、重力、速度等),而碰撞形状则定义了碰撞区域的几何外形和与其他物体交互时的物理特性(如密度、摩擦力等)。
在物理世界中,进行碰撞检测和响应的实际是碰撞形状,没有碰撞形状,只有刚体,则无法产生碰撞效果。
RigidBody 和 StaticCollider 都拥有 shapes 属性(类型为 Physics2DShapeBase[]),用于挂载碰撞形状。碰撞形状的基类为 Physics2DShapeBase,具体的形状类型包括以下几种,如图3-2所示:
| 形状类 | 说明 |
|---|---|
BoxShape2D |
矩形碰撞形状,通过 width 和 height 设置大小 |
PolygonShape2D |
多边形碰撞形状,仅支持凸多边形,顶点数3~8个 |
CircleShape2D |
圆形碰撞形状,通过 radius 设置半径 |
ChainShape2D |
链形碰撞形状,由一系列线段连接构成 |
EdgeShape2D |
边缘碰撞形状,两个端点间的线段 |

(图3-2)
一个 RigidBody 或 StaticCollider 可以拥有多个不同的碰撞形状,但一个渲染节点对象只能有一个 RigidBody 或 StaticCollider 组件。
3.2 碰撞形状基类属性
所有碰撞形状都继承于基类 Physics2DShapeBase,有着共有的基类属性。
所以,我们先介绍一下通用的基类属性,稍后再分别介绍各碰撞形状的特有属性。
3.2.1 偏移量 x y
碰撞形状的偏移量是指该形状相对于所属节点坐标的偏移值,XY的默认值均为0,与节点坐标保持一致,如图3-3所示。

(图3-3)
3.2.2 过滤数据
每一个碰撞形状,都可以通过碰撞组、碰撞类别和碰撞掩码来控制碰撞过滤,决定哪些物体之间可以发生碰撞,哪些不可以。
碰撞组 group
每一个碰撞形状,我们都可以分配一个整数的碰撞组索引值。通过碰撞组的索引比对规则来决定两个碰撞形状是否应该进行碰撞。
碰撞组规则如下:
1、如果两个碰撞形状的碰撞组索引相等,且都大于零,它们将始终会发生碰撞。
2、如果两个碰撞形状的碰撞组索引相等,但都小于零,它们将永远不会发生碰撞。
3、如果两个碰撞形状的碰撞组索引都等于0,或者碰撞组的索引不相等,则碰撞行为的检测不再依靠碰撞组的索引值,而是使用碰撞类别和碰撞掩码来判断是否进行碰撞。
碰撞类别 category
碰撞类别是用来指定一个碰撞形状属于哪个碰撞分类的,这个类别的值通常使用2的N次幂作为属性值,范围为[1, 2^31],最多有32种不同的碰撞类别可用。
| 指数 | 2的N次幂 | 指数 | 2的N次幂 | 指数 | 2的N次幂 | 指数 | 2的N次幂 |
|---|---|---|---|---|---|---|---|
| 0 | 1 | 8 | 256 | 16 | 65536 | 24 | 16777216 |
| 1 | 2 | 9 | 512 | 17 | 131072 | 25 | 33554432 |
| 2 | 4 | 10 | 1024 | 18 | 262144 | 26 | 67108864 |
| 3 | 8 | 11 | 2048 | 19 | 524288 | 27 | 134217728 |
| 4 | 16 | 12 | 4096 | 20 | 1048576 | 28 | 268435456 |
| 5 | 32 | 13 | 8192 | 21 | 2097152 | 29 | 536870912 |
| 6 | 64 | 14 | 16384 | 22 | 4194304 | 30 | 1073741824 |
| 7 | 128 | 15 | 32768 | 23 | 8388608 | 31 | 2147483648 |
为了更方便开发者使用,LayaAirIDE添加了直观的碰撞组定义,每个类别可指定一个直观的组名,IDE会自动转换为2的幂值来传入,如图3-4所示,Default是2的0次幂,实际值是1,而自己添加的test组ID为1,实际值是2,以此类推,组ID为2的碰撞组实际值为4。

(图3-4)
如果我们想通过代码来设置碰撞类别,也比较方便,可以基于位运算进行传值,方式与IDE的设置类似。碰撞形状通过 filterData 属性(类型为 FilterData)来访问和设置过滤数据。示例代码如下:
//用代码指定xxx碰撞形状所属哪个碰撞类别(组)
let filter = xxx.filterData;
filter.category = 1 << 3; // 值为2 的 3 次幂(8),可以简单理解分组ID为3,这样就更容易与IDE中的概念统一
xxx.filterData = filter;
碰撞掩码 mask
碰撞掩码是用来指定当前碰撞形状可能会与哪些碰撞类别的其他碰撞形状发生碰撞的。
LayaAirIDE的设置也非常直观。直接在选项中指定要和哪些定义的碰撞组发生碰撞即可,可以单选,也可以多选,如图3-5所示。

(图3-5)
除了指定自定义的碰撞组,图3-5顶部的Nothing表示不与任何分组发生碰撞,而Everything表示可以与任何分组发生碰撞。
掩码碰撞规则原理说明:
当两个碰撞形状的 碰撞类别 和 碰撞掩码 按位与的计算
- 结果非0,可以碰撞;
- 结果为0,则不可以碰撞。
例如,碰撞类别为2(2进制是10), 碰撞掩码为3(2进制是11),
二进制的按位与运算,如示意图3-6所示:

(图3-6)
通过图3-6,我们可以看到,二进制按位与位运算的结果是10,对应的十进制值是2(非0),所以可以发生碰撞。
开发者也可以在Devtools的控制台中,通过&运算符直接用十进制数字来计算,直观的理解碰撞关系,如图3-7所示:

(图3-7)
掩码默认值-1的意义:
IDE中碰撞掩码的默认值是Everything,在代码中赋值就是-1,
-1(所有二进制位都为1)与任何2的N次幂值进行按位与运算,都是幂值本身,非0,是可以碰撞的。
所以,默认情况下,一切碰撞类别(组)都可以碰撞。
指定碰撞目标的掩码:
如果想指定具体某个碰撞形状作为碰撞目标,那么想碰哪个类别的碰撞形状,就为碰撞掩码直接设置那个碰撞类别值即可。
有的时候,我们需要为多个碰撞类别(不同的碰撞形状),指定一个共同的碰撞掩码。
在IDE里可以非常直观的设置,其实代码里也可以基于位运算直观的设置。
示例代码如下:
let filter = xxx.filterData;
//直接指定xxx碰撞形状 可以与 某个碰撞类别(组) 发生碰撞
filter.mask = 1 << 2; //只与分组ID为2的(值为4)分组发生碰撞
//通过 按位或,指定xxx碰撞形状 可以与 多个碰撞类别(组) 发生碰撞
filter.mask = (1 << 1) | (1 << 2) | (1 << 5); //只与分组ID为1、2、5的进行碰撞
//通过异或运算指定xxx碰撞形状 不可以 与哪些类别(组) 发生碰撞,其它 类别(组) 都可以碰撞
//用-1去异或运算任何2的N次幂值,得到的结果再与该幂值进行按位与运算,一定是为0,也就是不可以碰撞的。
filter.mask = -1 ^ (1 << 3) ^ (1 << 6); //不与分组3、6进行碰撞,除3与6组之外都可以发生碰撞
//设置完成后,将过滤数据赋回碰撞形状
xxx.filterData = filter;
3.2.3 密度 density
密度属性定义了一个物体单位面积所拥有的质量。密度的作用体现在它可以影响游戏中的多个物理特性,例如质量、惯性、浮力等。
在现实中,密度是物体质量与其体积的比值。但在二维世界里,由于缺失了一个维度,所以使用面积代替体积来简化计算。
密度值可以为零或者是正数,如果为零,无论形状的面积是多少,质量都将为零。这将使得物理反应类似于静态刚体,不会受到外部的力或重力等影响。
密度值在通常情况下都是正数,密度值越大,那么同等面积下,它的质量就越大。过小的密度可能会导致物体的行为不稳定,而过大的密度可能会导致物体质量极大,计算的消耗也更大。合理设置密度对于实现逼真的物理模拟至关重要,IDE内的默认值为10。不同密度的对比效果如动图3-8所示:

(动图3-8)
当产生多物体堆叠在一起时,建议使用相似的密度,这样做可以使得堆叠更加稳定。
3.2.4 恢复系数 restitution
恢复系数是描述碰撞过程中物体弹性的属性。我们可以想象一下打乒乓球、篮球等,以恢复的特性使其弹出或弹起。
具体而言,恢复系数表示物体在碰撞时弹射回的速度相对于碰撞前的速度的比例。当两个物体发生碰撞时,它们之间的相对速度会影响碰撞的结果。如果恢复系数为1,表示碰撞是完全弹性的,物体之间会以相同的速度反弹;而如果恢复系数为0,表示碰撞是非弹性的,物体在碰撞后会停止。效果如动图3-9所示:

(动图3-9)
3.2.5 恢复阈值 restitutionThreshold
恢复阈值是碰撞形状 Physics2DShapeBase 上的属性,用于控制恢复系数生效的最低碰撞速度。单位通常为米/秒。
只有当碰撞速度超过该阈值时,恢复系数才会生效(物体才会产生弹性反弹)。低于此速度的碰撞将不会产生反弹效果,这有助于避免物体在低速碰撞时产生不自然的微小弹跳。
3.2.6 摩擦系数 friction
摩擦系数是一个描述两个接触表面之间相对滑动阻力大小的无量纲比值,定义为摩擦力与这两个表面上的垂直力之比。
在游戏开发和物理模拟中,摩擦系数用于确保物体运动的真实性和准确性。常用值在0到1之间, 0表示没有摩擦,1表示强摩擦。
对于非常光滑的表面(如冰面),摩擦系数可能接近0.01;对于日常生活中的接触表面,如橡胶与干燥路面,摩擦系数可能在0.1到1之间;动图3-10演示了不同摩擦系数的效果。

(动图3-10)
3.2.7 是否为传感器 isSensor
当交互逻辑需要判断两个碰撞形状是否碰撞发生,但又不需要有碰撞反应。这时候,可以通过传感器来完成。
勾选该属性,设置为传感器后,可以检测到与其他物体的碰撞事件,但不会对这些物体产生物理的碰撞影响。
例如,可用于监测角色是否到达某个特定区域导致游戏行为发生改变,又或者用于触发特定效果,比如声音和动画。
是否设置为传感器的不同效果区别,如动图3-11所示:

(动图3-11)
3.2.8 编辑碰撞形状
点击编辑碰撞形状,可以使得该碰撞形状在场景面板中进入可视化的编辑状态,对其整体位置偏移或改变宽高的操作,鼠标离开碰撞形状和节点的范围,编辑模式自动退出,再次编辑需要再次点击该按钮。演示效果如动图3-12所示:

(动图3-12)
3.3 矩形碰撞形状 BoxShape2D
公共的属性说明在上文的
碰撞形状基类属性,本节不再重复介绍
3.3.1 宽高 width height
矩形碰撞形状,是封闭的直角平行四边形碰撞框。
宽高是该碰撞形状特有的属性,如图3-13所示,通过设置宽高改变碰撞形状的大小。

(图3-13)
3.3.2 自动适配大小 autoFit
碰撞形状的所属节点宽高改变后,碰撞形状大小不会自动跟随改变。
自动适配大小是指,通过该按钮一键将节点的宽高设置为碰撞形状的宽高。如图3-14所示。

(图3-14)
3.4 圆形碰撞形状 CircleShape2D
公共的属性说明在上文的
碰撞形状基类属性,本节不再重复介绍
3.4.1 半径 radius
圆形碰撞形状用于模拟圆形物体的碰撞区域。它通常由一个中心点和一个半径组成的封闭圆形框。
而半径正是圆形碰撞形状特有的属性,其大小通过半径来控制,半径越大,该碰撞形状的圆形框越大。效果如图3-15所示:

(图3-15)
3.4.2 自动适配大小 autoFit
圆形碰撞形状的自动适配大小与矩形碰撞形状不同,
点击自动适配大小后,不仅会根据节点宽高中最短边的一半作为半径,还会修改节点的锚点值为0.5,
这样的好处是,不再以节点的左上角作为中心点,使得更符合圆形碰撞形状的常用需求。效果如图3-16所示。

(图3-16)
3.5 多边形碰撞形状 PolygonShape2D
公共的属性说明在上文的
碰撞形状基类属性,本节不再重复介绍
3.5.1 多边形点数据集的设置datas
多边形碰撞形状用于表示由多个顶点组成的凸多边形物体。顶点数量不能低于3个且不能超过8个。多边形碰撞形状可以用来模拟各种平面物体,比如箱子、三角形或其他多边形形状的物体。点击点数据集右侧的点数据列表按钮,可以通过弹窗面板设置每个顶点的坐标(XY),如图3-17所示,

(图3-17)
多边形碰撞形状必须构成一个凸形状,如果必须要用凹多边形,可以由多个碰撞形状组合拼接,强行设置凹多边形可能会导致不精确或者不正确的碰撞结果。
3.5.2 可视化设置点数据集
除了在弹窗中准确的设置数据,我们也可以可视化的编辑顶点,或先初步可视化编辑大致的基础形状,再到数据集弹窗中精准矫正。
进入可视化编辑碰撞状态,首先要点击属性顶部的编辑碰撞形状,进入碰撞形状的编辑模式。此时就可以用鼠标左键,持续按住顶点拖拽,来改变顶点的位置。
如果想增加顶点,可以按住 ctrl 鼠标左键单击碰撞形状的边线。
如果想删除顶点,可以按住 Alt 鼠标左键单击碰撞形状的顶点。
效果如动图3-18所示:

(动图3-18)
3.6 链形碰撞形状 ChainShape2D
公共的属性说明在上文的
碰撞形状基类属性,本节不再重复介绍
3.6.1 链形碰撞形状与多边形碰撞形状的主要差异
如果将链形碰撞形状闭合起来,构建出同样外观的多边形,表面上看与多边形碰撞形状并无不同,也是由多个顶点构成。
但是,无论链形碰撞形状是否闭合,该碰撞形状都不具有面积,不具有质量,无法受重力或碰撞力的影响,这与多边形碰撞形状的特性完全不同。
因此,链形碰撞形状通常用于静态碰撞器。用于创建不规则或复杂的地面,例如山脉轮廓或多折线路径。
另外,在Box2D引擎中,双方发生碰撞,至少要有一方是具有面积形状的,而链形碰撞形状显然没有,也就是说,链形碰撞形状与其它有实体形状(矩形、圆形、多边形)的碰撞形状均可以发生碰撞,但与无实体的碰撞形状(链形碰撞形状与边缘碰撞形状)之间不会发生碰撞。
3.6.2 链形点数据集的设置datas
链形碰撞形状通常由一系列顶点连接的线段构成,形成一个开放的或者封闭的链。这种结构不会填充中间的区域,它仅仅定义了物体的边界。
链形碰撞形状的数据集设置与多边形的方式一样,点击点数据集右侧的点数据列表按钮,可以通过弹窗面板设置每个顶点的坐标,这里就不配图了。
重点提醒一下,链形碰撞形状最少由2个点的线段组成,通常是3个或更多。链形碰撞形状的线段不能进行穿插自相交。如图3-19所示。

(图3-19)
自相交会导致物理引擎很难确定碰撞的确切行为,无法明确区分哪一部分应该在另一部分上方或下方。
3.6.3 可视化设置点数据集
与多边形碰撞形状一样,除了在弹窗中准确的设置数据,我们也可以可视化的编辑顶点,或先初步可视化编辑大致的基础形状,再到数据集弹窗中精准矫正。
进入可视化编辑碰撞状态,首先要点击属性顶部的编辑碰撞形状,进入碰撞形状的编辑模式。此时就可以用鼠标左键,持续按住顶点拖拽,来改变顶点的位置。
如果想增加顶点,可以按住 ctrl 鼠标左键单击碰撞形状的边线。
如果想删除顶点,可以按住 Alt 鼠标左键单击碰撞形状的顶点。
需要注意的是,由于链形碰撞形状的实体只是线段本身,哪怕是封闭的链形碰撞形状也没有对内部进行填充,所以在编辑模式下,只能对线段进行拖拽位移和增删顶点。离开节点显示对象的宽高范围后,只要不是点击线段,就会导致离开编辑模式。所以尽可能在节点范围内进行编辑操作。
效果如动图3-20所示:

(动图3-20)
3.6.4 闭合loop
尽管链形碰撞形状通常是用来创建开放的、不闭合的形状,如道路或者河流的边缘。
但也会存在闭合的需求,例如需要所有的碰撞反馈只在一个矩形区内发生,或环形湖泊等需求时,使用引擎的闭合功能来处理一个完整的链形碰撞形状,就无需开发者手动连接起始和终点顶点,这样做不仅提高了工作效率,而且减小了出错的可能性,并且能保持物理模拟的连贯性和准确性。
勾选闭合的不同效果如动图3-21所示:

(动图3-21)
3.6.5 反转数据ReversalData
由于链形碰撞形状采用的是单侧碰撞,即法线朝向的一侧可以产生碰撞。因此,顶点的排列顺序非常重要,它会决定碰撞的方向(法线的方向)。
当链形碰撞形状的顶点逆时针排序时,法线朝向内侧。当顶点顺时针排序时,法线朝向外侧。
如图3-22所示,左侧小球顺着法线的方向,会直接穿透,无法出去。右侧小球与法线方向相对产生运动,则会发生碰撞,无法进入。

(图3-22)
我们再以动图3-23直观的感受,当闭合链形碰撞形状顶点逆时针排序形成一个封闭的区域时,小球产生的碰撞效果。

(动图3-23)
当顶点顺时针排序时,碰撞方向相反,效果如动图3-24所示,

(动图3-24)
有的开发者可能想了解,如果链形碰撞形状不是闭合的,怎么判断?
其实,还是上面的理论,根据顶点逆时针还是顺时针排序来判断,与是否闭合没有关系。上面的示例只是由于闭合时,更形象的解释和理解了逆时针和顺时针的排序特点。例如动图3-25演示了未闭合的碰撞效果。

(动图3-25)
以上示例,无论是闭合还是不闭合,均较为明显的可以识别出顺逆时针的方向,那当链形碰撞形状接近水平直线的时候,又是怎么判断呢?
其实,还是一样的,关键点是,顺时针是从左向右开始环绕,逆时针是从右向左开始环绕的。
当起始的顶点到最终的顶点,方向是从左向右,哪怕是没有形成环绕,是水平的,那也属于顺时针方向,法线向下,从上向下才会发生碰撞。
反之,方向从右向左,是逆时针方向,法线向上,从下向上才会碰撞。效果如动图3-26所示,

(动图3-26)
通过以上的示例,我们其实已经可以完全理解链形碰撞形状的单侧碰撞,是与顶点的排序有着直接的关系。
而反转数据的功能,正是将顶点的数据进行逆向重排,也就是在链的形状不变的前提下,只是顶点的顺序相反。带来的效果,就是直接改变法向方向,改变了可碰撞的方向。
3.7 边缘碰撞形状 EdgeShape2D
公共的属性说明在上文的
碰撞形状基类属性,本节不再重复介绍
边缘碰撞形状是两个端点间一条线段形状的碰撞形状。它主要用于表示地形的边界或其他不需要填充的平面。由于它没有体积,所以不会发生质量相关的计算。
该碰撞形状与链形碰撞形状一样,不具有面积,不具有质量,无法受重力或碰撞力的影响,而产生力的物理反馈,所以通常用于静态碰撞器。
但与链形碰撞形状可以多条线段组合完全不同的是,边缘碰撞形状只能由两个端点构成线段形状,如图3-27所示,

(图3-27)
另外,在碰撞关系方面,
与链形碰撞形状相同的是,都只能与有面积的碰撞形状发生碰撞。
与链形碰撞形状不同的是,哪怕是同为两个点组成的线段形状,边缘碰撞形状两侧均可以发生碰撞,而链形碰撞形状是单侧的。效果如动图3-28所示,

(动图3-28)
四、 关节 Joint
关节用于连接两个或多个刚体,将刚体约束到物理世界或彼此约束。关节定义了物体之间如何运动,用于模拟真实世界中各种机械结构的运动方式,如铰链、弹簧、绳索、钟摆等。通过使用不同类型的关节,开发者能够创建复杂的物理模型,为游戏或仿真提供更富有现实感的动态行为。
4.1 关节的通用功能
关节的属性并不像碰撞形状有大量的基类属性,只要属于碰撞形状基类的属性,那所有的碰撞形状都会拥有该属性。
但是关节里也有一些属性在好几个关节属性中都会出现,为避免重复介绍,把一些经常出现的通用属性和功能,这里统一进行说明。
4.1.1 编辑关节连线
关节的物理辅助编辑功能,主要是编辑连接两个关节连线的锚点位置。点击 编辑关节连线,关节连线的两端会出现两个点,红点表示自身刚体的锚点,绿点表示另一刚体的锚点。如图4-1所示:

(图4-1)
在关节连线的编辑模式时,通过长按拖拽不同颜色锚点,就可以改变对应的刚体锚点位置。
当鼠标双击刚体和节点之外的位置后,关节连续锚点的编辑会自动取消。如需再次编辑,再次点击编辑关节连线按钮即可。
4.1.2 绑定另一刚体otherBody
在关节组件中,绝大多数都需要绑定另一个刚体,形成组合的关节关系与效果。
关节属性中的另一刚体就是指定当前刚体要与哪个刚体绑定,从而形成一对关节组合。
我们可以通过刚体选择弹窗来选择某个带刚体的节点进行绑定,也可以直接从层级面板上拖拽带有刚体组件的节点拖入到另一刚体的属性输入栏,操作如动图4-2所示。

(动图4-2)
4.1.3 设置锚点(自身锚点、另一锚点)
锚点指定了关节连接刚体的确切位置,它告诉物理引擎关节应该作用于刚体的什么位置。
锚点默认值是位于节点的原点位置,例如节点默认是左上角(0,0点)为原点,那锚点的值就是基于这个位置的偏移。如果想将锚点设置为中心点,建议直接修改节点锚点的XY均为0.5,这样关节锚点默认就不用再设置偏移值了,否则需要更改锚点的值到中心位置。
关于锚点的名称上,
有的关节只需要设置自身刚体的锚点,有的关节不仅需要设置自身刚体的锚点,还需要设置与当前关节绑定的另一个刚体的锚点。
当出现自身锚点与另一个刚体的锚点都需要设置时,为了明确区分,分别称为自身锚点selfAnchor和另一锚点otherAnchor,不需要设置另一个刚体锚点时,自身刚体的锚点直接称为锚点anchor。效果如下图所示:

(图4-3)
4.1.4 振动频率frequency
振动频率也是很多关节中都会出现的属性,该属性值越大表示振动频率越高,意味着在更短的时间内完成一个振动周期,所以,振动幅度相对较小,振动速度更快。反之,振动幅度相对较大,振动速度更慢。效果如动图4-4所示:

(动图4-4)
因此,我们可以理解,振动频率定义了关节刚体振动的速率。较高的振动频率通常对应于更快的振动,而较低的频率对应于更慢的振动。在某些应用中,可以通过调整振动频率来模拟不同类型的运动。
需要注意的是,振动频率不能过低,尤其是不能设置为0,设置为0相当于禁用了关节的弹簧效果,这会导致关节失去约束能力。
4.1.5 阻尼 damping
阻尼一般用来描述能量在系统中逐渐丧失的过程,例如由于摩擦力、空气阻力等造成的速度减少等。与上文刚体中涉及的线性阻尼和角阻尼的基本物理性质一样,都用于降低系统中的动能,帮助物体在无外力作用时返回稳定状态。
其区别是,刚体阻尼作用于单一物体,影响其线性或角运动。
而关节阻尼特别针对连接在一起的两个刚体,控制它们之间的相对运动和震动。它帮助控制通过关节运动传递的震动和冲击,防止过度振荡。
例如,在游戏中模拟车辆的悬挂系统,适当的关节阻尼可以让车辆在颠簸的道路上运行得更平稳。
有无阻尼的对比效果如动图4-5所示:

(动图4-5)
4.1.6 碰撞连接刚体collideConnected
通常情况下,关节之间彼此连接的关节之间是不需要产生碰撞的,这也是关节的默认设置。然而也有一些情况,两个相互连接的关节刚体之间也存在碰撞的需求,此时,勾选碰撞连接刚体就可以使得关节彼此连接的刚体之间也可以发生碰撞。效果如动图4-6所示:

(动图4-6)
提示:即便是勾选了碰撞连接刚体,碰撞的前提是关节连接的两个刚体本身,是可以发生碰撞的刚体。
各关节组件的详细属性说明,请查看对应的独立文档:
- 距离关节 DistanceJoint
- 鼠标关节 MouseJoint
- 焊接关节 WeldJoint
- 滑轮关节 PulleyJoint
- 马达关节 MotorJoint
- 旋转关节 RevoluteJoint
- 平移关节 PrismaticJoint
- 齿轮关节 GearJoint
- 轮子关节 WheelJoint
五、总结与关联文档
本篇文档至此,已完成了2D物理组件的介绍,通过2D物理组件,开发者可以在IDE中可视化编辑和预览物理的效果(如碰撞、关节)。
然而实现一个完整的物理游戏或交互产品。仅凭本文所述知识还是不够的,关键还在于交互的逻辑,所以我们还需要掌握脚本编写、以及脚本中的物理碰撞事件,通过对碰撞事件的妥善处理,我们可以在物理碰撞发生的适当时机进行精确的物理反馈或实现特定的逻辑效果。
另外,项目设置中与2D物理相关的设置说明,开发者也需要熟悉,这有助于对物理的深入理解与控制,下面提供的文档链接,希望可以为大家进一步掌握物理带来帮助。