Unity中可以使用物理关节组件使物体连接起来,如图1.1是给游戏对象添加关节组件的步骤:
也可以在物体的Inspector视图中通过Add来添加。
下面就介绍一下Unity中的各种关节组件。
1、Hinge Joint-铰链关节
铰链关节由两个游戏对象的刚体组成,该关节会对刚体进行约束,使它们就好像被连接在一个铰链上那样运动。它非常适用于对门的模拟,也适用在模型链以及钟摆等物体上。铰链关节组件的属性面板如图1.2:
- Connected Body:连接的刚体。该项用于为关节指定要连接的刚体,直接把需要连接的物体(必须有刚体)从Hierarchy视图中拖过来就行,若不指定则默认该关节与世界相连。
- Anchor:锚点。刚体可围绕锚点进行摆动,这里可以设置锚点的位置,该值应用于局部坐标系中(也就是物体自己的坐标系)。
- Axis:轴。定义了刚体摆动的方向,该值同样应用于局部坐标系。
- Auto Configure Connected Anchor:自动设置连接锚点。选中该项,连接锚点会自动设置,该项默认是开启状态。
- Connected Anchor:连接锚点。当Auto Configure Connected Anchor选项开启时,该项会自动设置(无法手动更改);当Auto Configure Connected Anchor未开启时,可以手动设置连接锚点。如图1.3
其中有两个锚点,Anchor设置了图1.3中位于上方的那个锚点的位置,Connected Anchor则设置了位于下方的那个锚点的位置;而Axis则决定了两个锚点的指向方向,也就是定义了刚体摆动的方向。
- Use Spring:使用弹簧。选中该项,则弹簧会使刚体与其相连的物体形成一个特定的角度。
- Spring:弹簧。当Use Spring开启时此属性才有效。
Spring:弹簧力。该项用于设置推动对象使其移动到相应位置的作用力。
Damper:阻尼。用于设置对象的阻尼值,数值越大则对象移动得越慢。
Target Position:目标角度。用于设置弹簧的目标角度,弹簧会拉向此角度,以度为测量单位。就是以连接锚点-Connected Anchor为轴,两个物体分别和连接锚点的连线形成的角度需要达到该值。 - Use Motor:使用发动机。选中该项后发动机会使对象发生旋转。
- Motor:发动机。当Use Motor开启时有效。
Target Velocity:目标速度。用于设置对象预期达到的速度值。
Force:作用力。用于设置为了达到目标速度而施加在对象上的作用力大小。
Free Spin:自由转动。选中该项,则发动机永远不会停止,对象旋转只会越来越快。 - Use Limits:使用限制。选中该项,则铰链的角度将被限定在最大值和最小值之间。
- Limits:限制。当Use Limits开启时有效。
Min:最小值。用于设置铰链能达到的最小角度。
Max:最大值。用于设置铰链能达到的最大角度。
Min Bounce:最小反弹。用于设置当对象触到最小限制时的反弹值。
Max Bounce:最大反弹。用于设置当对象触到最大限制时的反弹值。
Contact Distance:接触距离,用于控制关节的抖动。 - Break Force:断开力。用于设置铰链关节断开的作用力大小,Infinity代表无限大。
- Break Torque:断开扭矩。用于设置断开铰链关节所需要的扭矩大小。
- Enable Collision:激活碰撞。若选中此项,则关节之间也会检测碰撞。
- Enable Preprocessing:启用预处理实现关节的稳定。默认开启。
铰链关节的一些理解
单独的铰链关节需要应用到一个游戏对象上,可以不用给关节的Connected Body添加对象(此时相当于和世界相连),当希望关节的Transform属性依赖于连接对象的Transform属性时可以为关节的Connected Body属性添加对象。多个铰链关节也可以串联起来形成一条链条,可以给链条的每一个环添加关节,并向Connected Body那样依次添加下一环上。
2、Fixed Joint-固定关节
固定关节组件用于约束一个游戏对象对另一个游戏对象的运动。类似于对象的父子关系,但是它是通过物理系统来实现而不是像父子关系那样是通过Transform属性来进行约束。固定关节适用于以下的情形:当希望将对象较容易与另一个对象分开时,或者连接两个没有父子关系的物体使其一起运动时,使用固定关节的对象自身需要有刚体组件。固定关节组件的属性面板如图1.4
它的属性在铰链关节中都有讲到(意义都是一样的),这里不再重复。
当需要某些物体暂时或永久性的粘在一起时,就非常适用固定关节组件。该组件不需要通过脚本来更改层级结构就可以实现想要的效果,只需要为那些要使用固定关节的物体添加刚体组件即可。
可以通过Break Force和Break Torque属性来设置关节的强度极限,如果这些参数不是无穷大而是一个数值的话,当施加到对象身上的力或转矩大于此极限值时,固定关节将被销毁,其对象的约束也就随即失效。
3、Spring Joint-弹簧关节
弹簧关节组件可以将两个刚体连接在一起,使其像连接着弹簧那样运动,其属性面板如图1.5:
和铰链关节组件中重复的属性就不再重复。
- Min Distance:最小距离。用于设置弹簧启用的最小距离值。如果两个物体之间的当前距离与初始距离的差大于该值,则不会开启弹簧。
- Max Distance:最大距离。用于设置弹簧启用的最大距离值。如果两个物体之间的当前距离与初始距离的差小于该值,则不会开启弹簧。
- Tolerance:容忍。用于设置弹簧能容忍的最大力,一旦超过这个值弹簧就会被破坏,不再具有弹性。
弹簧关节允许一个带刚体的对象被拉向一个指定的目标位置,这个目标可以是另一个刚体对象或者世界。当游戏对象离目标位置越来越远时,弹簧关节会对其施加一个作用力使其回到初起时的位置,和现实中的弹簧一个道理。
当弹簧关节被创建后,其目标位置是由从锚点到连接的刚体对象的相对位置所决定的,这使得在编辑器中将弹簧关节设置给角色或其他游戏对象非常容易,但是如果通过脚本来生成一个实时的推拉弹簧的操作就相对比较麻烦。如果想通过弹簧关节来控制游戏对象的位置,通常是建立一个有刚体组件的空物体,然后将该空物体设置到Connected Rigidbody属性上,这样就可以通过脚本来控制空对象的移动,进而弹簧也会随着空对象的移动而移动。
4、Character Joint-角色关节
角色关节主要用于表现布娃娃效果,它是扩展的球关节,可以用于限制关节在不同旋转轴下的旋转角度。角色关节组件的属性面板如图1.6和1.7:
介绍一下上面没有讲到的属性。
- Swing Axis:摆动轴。用于设置角色关节的摆动轴,以绿色的圆锥gizmo表示。其中橙色的圆锥gizmo表示了扭动轴-Axis,如图1.8:
- Twist Limit Spring:弹簧的扭曲限制。
Spring:用于设置角色关节扭曲的弹簧强度。
Damper:用于设置角色关节扭曲的阻尼值。 - Low Twist Limit:扭曲下限。用于设置角色关节扭曲的下限。
Limit:用于设置角色关节扭曲的下限值。
Bounciness:用于设置角色关节扭曲下限的反弹值。
Contact Distance:用于避免抖动而限制的接触距离。 - High Twist Limit:扭曲上限。用于设置角色关节扭曲的上限,对比扭曲下限,不再重复。
- Swing Limit Spring:弹簧的摆动限制
Spring:弹簧强度。用于限制弹簧的强度限制。
Damper:阻尼。用于设置弹簧的限制阻尼。 - Swing 1 Limit:摆动设置1。参考上述Low Twist Limit。
- Swing 2 Limit:摆动设置2。参考上述Low Twist Limit。
- Enable Projection:启用投影。用于激活投影。
- Projection Distance:投影距离。用于设置当对象与其连接刚体的距离超过投影距离时,该对象会回到适当的位置。
- Projection Angle:投影角度。用于设置当对象与其连接刚体的角度超过投影角度时,该对象会回到适当的位置。
角色关节组件提供了很多可能性用于约束通用关节的运动。
扭矩(以橙色的gizmo表示)为关节的运动提供了限制,扭矩允许用户以角度的形式设置关节旋转的下限和上限(角度是相对初始位置来衡量的)。如-20度的扭矩下限和70度的扭矩上限限制了绕扭动轴(橙色gizmo)的旋转角度在-20度到70度之间。
Swing 1 Limit限制了绕摆动轴的旋转(绿色gizmo)。对摆动轴旋转角度的限制是对称的,如设置Swing 1 Limit的限制角度为30度,则表示Swing 1 Limit的旋转角度被限制在-30度和30度之间。
Swing 2 Limit没有gizmo辅以表示,此轴垂直于扭动轴和Swing 1 Limit。与Swing 1 Limit相同,对它的限制也是对称的。
5、Configurable Joint-可配置关节
可配置关节组件支持用户自定义关节,它开放了PhyX引擎中所有与关节相关的属性,因此可以像其他类型的关节那样来创造各种行为。可配置关节中有两类主要的功能:移动/旋转限制和移动/旋转加速度。可配置关节组件的属性面板如图1.9和2.0: