Unity物理引擎研究之关节

来源:互联网 发布:1688传淘宝代销规则 编辑:程序博客网 时间:2024/04/29 18:23

添加关节Joints让刚体的行为更加复杂。比如,你可以制作一扇逼真的门或者是一台有摆动链条的吊机。

1.关节介绍

(1)铰链关节 Hinge Joint 铰链关节由两个刚体组成,约束它们像连在一个铰链上一样运动,适用于门,不过对于典型的链子、钟摆等同样适用。


属性

Connected Body 连接体 为刚体指定的关节连接物,如不设定,则与世界相连。

Anchor 锚点 主体摇摆围绕的锚点坐标,基于本地坐标系

Axis 坐标轴 摇摆方向的坐标,基于本地坐标系

Use Spring 是否使用弹簧 弹簧使刚体相对它连接的主体达到一个特定的角度

Spring 弹力 维持对象移动到一定位置的力

Damper 阻尼 值越大,对象移动越慢

Target Position 目标角度 弹簧的目标角度。弹簧拉向这个角度.(单位:角度)

Use Motor 是否使用马达。 Motor使对象旋转

Target Velocity 目标速率。对象设法达到的速度

Force

Free Spin 自由转动 如果启用,Motor永远不会破坏旋转,只会加速

Use Limits 是否有限制 如果启用,铰链的角度将被限制在最大和最小之间

Limits 限制 用于如启用Use Limits 的边界属性

Min 最小 最小角速度

Max 最大 最大角速度

Min Bounce 最小弹跳  物体碰触最小限制时的弹跳系数

Max Bounce 最大弹跳 物体碰触最大限制时的弹跳系数

Break Force 破坏力 可以使这个关节断开的力

//当一个力大于10时,是这个关节断开    hingeJoint.breakForce = 10;    // Makes the joint unbreakable    //使该关节牢不可破    hingeJoint.breakForce = Mathf.Infinity;

Break Torque 破坏扭矩 可以使这个关节断开的扭矩

Spring Joint 弹簧关节 弹簧关节是两个刚体组。制约它们就像弹簧一样。

      (2)Spring Joint 弹簧关节 弹簧关节是两个刚体组。制约它们就像弹簧一样。


属性

Min Distance 最小距离

Max Distance 最大距离

如果物体的位置在最小和最大距离之间,那么关节不会被应用到物体,位置必须在这些值之外,关节才会激活。

(3)固定关节 Fixed Joint

固定关节基于另一个物体来限制一个物体的运动。效果类似于父子关系,但是不是通过层级变换,而是通过物理实现的。使用它的最佳情境是当你有一些想要轻易分开的物体,或想让两个没有父子关系的物体一起运动。

(4)Character Joint

它可以模拟角色的骨骼关节,就好比人的手腕一样可以大氛围任意角度旋转。


(5)可配置关节 Configurable Joint

可配置关节是极其可定制的。可配置关节将PhysX引擎中所有与关节相关的属性都设置为可配置的,因此可以用此组件创造出与其他关节类型行为相似的关节.

可配置关节有两类主要的功能:移动/旋转限制和移动/旋转加速。这些功能取决于一系列相互依赖的属性。你可能需要进行一些试验来创建出你想要的行为。

功能概述:

Movement/Rotation Restriction 移动/旋转限制

你可以为每个的旋转轴和每个运动类型都指定约束。X轴平移(XMotion),Y轴平移(YMotion)和 Z轴平移(ZMotion)允许你定义沿不同轴的平移。X轴角运动(Angular XMotion)、Y轴角运动(Angular YMotion)和Z轴角运动(Angular ZMotion)允许你定义沿不同轴的旋转。这些属性可以被设置为Free (无限制),Limited (受限于用户定义的约束),Locked (没有运动)。

Limiting Motion 平移限制

如有某轴的平移属性被设置为受限制的,则可以设置物体在对应轴上平移的限制。可以通过改变边界属性的值来达到此目的。

对于平移运动(非角运动),线性限制属性(Linear Limit)定义了物体可以远离原点移动的最大距离。任何沿受限制的轴的运动都会受限于线性限制的属性(Linear Limit->Limit)。可以将此限制属性视为设定物体沿特定轴运动时所需遵从的边界。

反弹力(Bouncyness),弹簧力(Spring)和阻尼(Damper)定义了物体运动到其边界时的行为,这些参数在所有受限的平移轴上都是一样的。如果这三个参数的值都被设置为0,物体在到达边界后会立即停止运动。反弹力使得物体到达边界后反弹远离边界。弹簧力和阻尼利用弹簧的力量将物体拉回边界。这些参数能够软化边界,使得物体能够穿过边界后再被拉回来,而不是到达边界就立即停止。

Limiting Rotation 旋转限制

旋转限制与平移限制几乎完全一样,除了角运动参数与不同的角度限制参数相关而不是与线性限制相关。在3个不同坐标轴上的平移限制由线性限制属性定义,而绕三个轴的旋转限制由不同的角度限制属性定义,每个轴有其不同的角度限制属性。

X轴上下限可以不同,Y和Z轴只能分别设置同样的数。

Movement/Rotation Acceleration 移动/旋转限制

可以用使物体到达特定的位置/朝向,或是到达特定的速度/角速度来指定物体的运动。此系统的工作方式如下:首先定义你期望达到的“目标”(Target),然后通过“驱动”(“Drive)产生加速度来使物体到达此目标。每个”驱动“都有定义物体的当前”目标“的模式(Mode)。

X轴驱动、Y轴驱动和Z轴驱动属性可以使物体沿特定的轴运动。每个驱动的模式指定了物体是朝目标位置运动还是朝目标速度运动或者两者都是。例如,如果设置X轴驱动的模式为位置,物体会朝目标位置->x进行运动。

当驱动的模式为位置时,其位置弹簧数值定义了物体如何向目标位置运动。同样的,当驱动的模式为速度时,其最大强度数值定义了物体如何向目标速度运动。

旋转加速度属性:X轴角驱动、YZ轴角驱动和插值驱动,这些驱动的功能与平移驱动功能基本相同。不同之处在于插值驱动与角驱动的表现出的功能不同。在旋转驱动模式中可以选择使用角驱动或是使用插值驱动,两者无法同时被使用。

部分属性

Axis 主轴 局部旋转轴,定义了物理模拟下物体的自然旋转。

Secondary Axis 副轴 主轴和副轴定义了关节的局部坐标系。第三个轴垂直于主轴和副轴。

Slerp Drive 插值驱动  定义关节如何绕所有局部旋转轴旋转。只有当旋转驱动模式为插值时才有效

Projection Mode 投影模式 当物体离开它受限的位置太远时让它迅速回到它受限的位置

Projection Distance 投影距离  当物体与其相链的肢体的距离差异超过投影距离后,物体才会迅速回到一个可接受的位置

Projection Angle 投影角度 当物体与其相链的肢体的角度差异超过投影角度后,物体才会迅速回到一个可接受的位置。

Congfigure in World Space在世界空间中配置

如果启用了此选项,所有与目标相关的计算都会在世界空间中进行而不是在物体的局部空间中进行

(6)Constant Force 恒力


恒力(Constant Force)是添加恒力到刚体的一个快速工具,对于一个子弹样物体(如火箭),它可以很好的工作,启动时没有很大的速度,而是慢慢加速。

Force 力 被施加的力在世界坐标中的矢量

Relative Force 相对力 被施加在对象上的力在本地坐标中的矢量

Torque 扭矩 施加在世界坐标中的扭矩矢量。对象将绕着该矢量转动。矢量越长,转速越快。

Relative Torque 相对扭矩 施加在本地坐标中的扭矩矢量。对象将绕着该矢量转动。矢量越长,转速越快

示例:

using UnityEngine;using System.Collections;public class JointTemp : MonoBehaviour{    //链接关节游戏对象      GameObject connectedObj = null;    //当前链接的关节组件      Component jointComponent = null;    void Start()    {        //获得链接关节的游戏对象          connectedObj = GameObject.Find("Sphere");    }    void OnGUI()    {        if (GUILayout.Button("添加链条关节"))        {            ResetJoint();            jointComponent = gameObject.AddComponent("HingeJoint");            HingeJoint hjoint = (HingeJoint)jointComponent;            connectedObj.rigidbody.useGravity = true;            hjoint.connectedBody = connectedObj.rigidbody;        }        if (GUILayout.Button("添加固定关节"))        {            ResetJoint();            jointComponent = gameObject.AddComponent("FixedJoint");            FixedJoint fjoint = (FixedJoint)jointComponent;            connectedObj.rigidbody.useGravity = true;            fjoint.connectedBody = connectedObj.rigidbody;        }        if (GUILayout.Button("添加弹簧关节"))        {            ResetJoint();            jointComponent = gameObject.AddComponent("SpringJoint");            SpringJoint sjoint = (SpringJoint)jointComponent;            connectedObj.rigidbody.useGravity = true;            sjoint.connectedBody = connectedObj.rigidbody;        }        if (GUILayout.Button("添加角色关节"))        {            ResetJoint();            jointComponent = gameObject.AddComponent("CharacterJoint");            CharacterJoint cjoint = (CharacterJoint)jointComponent;            connectedObj.rigidbody.useGravity = true;            cjoint.connectedBody = connectedObj.rigidbody;        }        if (GUILayout.Button("添加可配置关节"))        {            ResetJoint();            jointComponent = gameObject.AddComponent("ConfigurableJoint");            ConfigurableJoint cojoint = (ConfigurableJoint)jointComponent;            connectedObj.rigidbody.useGravity = true;            cojoint.connectedBody = connectedObj.rigidbody;        }    }    //重置关节      void ResetJoint()    {        //销毁之前添加的关节组件          Destroy(jointComponent);        //重置对象位置          this.transform.position = new Vector3(821.0f, 72.0f, 660.0f);        connectedObj.gameObject.transform.position = new Vector3(805.0f, 48.0f, 660.0f);        //不敢应重力          connectedObj.rigidbody.useGravity = false;    }}


0 0
原创粉丝点击