• 《Unity_API解析》 第十章 Rigidbody类


    Rigidbody类的功能是用来模拟GameObject对象在现实世界中的物理特性,包括重力、阻力、质量、速度等。对Rigidbody对象属性的赋值代码通常放在脚本中的OnFixedUpdate方法中。

    Rigidbody类实例属性

    collisionDetectionMode属性:碰撞检测模式

    public CollisionDetectionMode collisionDetectionMode{get; set;}

    此属性用于设置刚体的碰撞检测模式,刚提的碰撞检测模式有三种,即枚举类型CollisionDetectionMode的3个值。

    Discrete:静态离散检测模式,系统默认设置。此模式下,只有在某一帧中两物体的碰撞器发生重叠时才能被检测到,这样可能会发生穿越现象。

    Continuous:静态连续检测模式,一般用在高速运动刚体的目标碰撞体上,防止被穿越,检测强度比Discrete更高。

    ContinuousDynamic:最强的连续动态监测模式,一般用在两个高速运动的物体上,防止互相穿越,其计算消耗最大,一般情况慎用。

    无论哪种检测模式,都有可能被穿越,为了防止穿透现象的发生,除了设置其碰撞检测模式歪,还要适当增加两物体碰撞器的厚度,一般不小于0.1,同时减量降低两物体碰撞时的相对速度。

    drag属性:刚体阻力

    public float drag{get; set;}

    此属性用于给刚体添加一个阻力,drag值越大刚体速度减慢得越快,当drag>0时,刚体在增加到一定速度后会匀速移动。

    inertiaTensor属性:惯性张量

    此属性用于设置刚体的惯性张量,在距离找那个重心同等的条件下,刚体会向张量值大的一边倾斜。

    mass属性:刚体质量

    public float mass{get; set;}

    此属性用于设置或返回刚体的质量,一般取值在0.1附近模拟最佳,最大不要超过10,否则容易出现模拟不稳定的情况。

    velocity属性:刚体速度

    public Vector3 velocity{get; set;}

    此属性用于设置或返回刚体的速度值。

    在脚本中无论给刚体赋予一个Vector3类型的速度变量v,还是获取当前刚体的速度v,v的方向都是相对世界坐标系而言的。

    velocity的单位是米每秒。米是Unity中默认的长度单位。

    Rigidbody类实例方法

    AddExplosionForce方法,模拟爆炸力

    public void AddExplosionForce(float explosionForce, Vector3 explosionPosition, float explosionRaduce);

    public void AddExplosionForce(float explosionForce, Vector3 explosionPosition, float explosionRaduce, float upwardsModifier);

    public void AddExplosionForce(float explosionForce, Vector3 explosionPosition, float explosionRaduce, float upwardsModifier, ForceMode mode);

    参数explosionForce为爆炸点增加的力的大小,参数explosionPosition为爆炸点坐标(相对世界坐标系),参数explosionRadius为爆炸作用力有效半径,参数upwardsModifier为爆炸力作用点在y轴方向上的偏移,参数mode为爆炸力的作用模式,默认为ForceMode.force。

    AddForceAtPositon方法:增加刚体点作用力

    public void AddForceAtPostion(Vector3 force, Vector3 position);

    public void AddForceAtPosition(Vector3 force, Vector3 position, ForceMode mode);

    参数force为扭矩向量,参数position为作用点坐标值,参数mode为力的作用方式。

    此方法用于为参数position点增加一个力force,其参考坐标系为世界坐标系,作用方式为mode,默认值为ForceMode.Force。

    AddTorque方法:刚体添加扭矩

    public void AddTorque(Vector3 torque);

    public void AddTorque(Vector3 torque, ForceMode mode);

    public void AddTorque(float x, float y, float z);

    public void AddTorque(float x, float y, float z, ForceMode mode);

    参数torque为扭矩向量,参数mode为力的作用方式。

    此方法用于给刚体添加一个扭矩torque,扭矩的作用力方式由mode决定。

    ClosestPointOnBounds方法:爆炸点到刚体最短距离

    public Vector3 ClosestPointOnBounds(Vector3 position);

    GetPointVelocity方法:刚体点速度

    public Vector3 GetPointVelocity(Vector3 worldPoint);

    其中参数worldPoint为世界坐标系的点坐标。

    此方法用于获取世界坐标系中worldPoint点在刚体局部坐标系中的速度,速度的计算会受刚体角速度的影响。

    GetRelativePointVelocity方法:刚体点相对速度

    public Vector3 GetRelativePointVelocity(Vector3 relativePoint);

    参数为刚体自身坐标系中的点坐标。

    此方法用于获取刚体自身坐标系中某一点的速度,速度的计算会受刚体角速度的影响。

    MovePosition方法:刚体位置移动

    public void MovePosition(Vector3 position);

    其中参数为刚体组件要移动到的位置坐标。

    此方法用于对刚体的位置进行移动,通常用在刚体失去动力学模拟的情况下,即isKinematic为true时。

    类似方法有MoveRotation。

    Sleep方法:刚体休眠

    此方法可使刚体进入休眠状态,且休眠至少一帧。

    WakeUp方法:唤醒刚体

    public void WakeUp();

    此方法用于将刚体从休眠状态唤醒。要将刚体从休眠状态唤醒,除了调用WakeUp方法外,还有发生以下4种情况时。

    其他刚体与休眠的刚体发生了碰撞。

    使用关节连接的其他刚体发生了移动。

    刚体的属性发生了改变。

    给休眠中的刚体施加了一个外力。

    SweepTest方法:探测碰撞器。

    public bool SweepTest(Vector3 direction, out RaycastHit hitInfo);

    public bool SweepTest(Vector3 direction, out RaycastHit hitInfo, float distance);

    参数direction为探测方向,参数distance为有效探测距离,默认为无穷大。

    此方法用于检测在刚体的direction方向是否有碰撞器对象,且对象的有效探测距离不大于distance。

    SweepTestAll方法:探测碰撞器

    public RaycastHit[] SweepTestAll(Vector3 dorection);

    public RaycastHit[] SweepTestAll(Vector3 dorection, float distance);

    此方法用于探测刚体的direction方向的distance距离内是否含有碰撞器并返回所有探测到的物体的RaycastHit。

    注解:

    useGravity属性用来确定刚体是否接受重力加速度的感应。

    isKinematic属性用来确定刚体是否接受动力学模拟,此影响不仅包括重力感应,还包括质量、速度、阻力等的物理模拟。

    在Rigidbody类中,mass、density和scale3个API之间关系紧密。

    若在脚本中未使用Rigidbody、SetDensity(density:float)方法设置刚体的密度,则刚体的质量mass值为在Inspector面板中Mass的大小,此时mass与Transform中的scale大小无关。

    若在脚本中使用Rigidbody,SetDensity(density:float)方法设置了刚体的密度,则刚体的质量为mass = density * scale.x * scale.y * scale.z,而与Inspector面板中Mass的设置大小无关。

    若在脚本中既设置了密度Density,又设置了质量mass,则刚体世纪质量值要看脚本中代码执行的前后次序,后者有效。

    当两物体发生碰撞时,遵循动量守恒定力,即m1 * v1 + m2 * v2 = (m1 + m2) * v。

    ForceMode为枚举类型,用来控制力的作用方式,有4个枚举成员。

    ForceMode.Force:默认方式,使用刚体的质量计算,以每帧间隔时间为单位计算动量。

    ForceMode.Acceleration:在此种作用方式下,会忽略刚体的实际质量而采用默认值1.0f,时间间隔以系统帧频间隔计算。

    ForceMode.Impulse:此种方式采用瞬间力作用方式,即把t的值默认为1,不再采用系统的帧频间隔。

    ForceMode.VelocityChange:此种作用方式下将忽略刚体的实际质量,采用默认质量1.0,同时也忽略系统的实际帧频间隔,采用默认间隔1.0。

  • 相关阅读:
    LeetCode数学系列(3)——快速幂算法(50题)
    LeetCode树系列(3)——200题岛屿数量
    Arrays.sort()详解
    图表示学习系列(1)——GCN学习笔记:第一部分,详细讲解GCN
    LeetCode动态规划系列(3)——编辑距离问题求解
    深度学习系列(9)——node2vec算法中的alias采样介绍
    LeetCode数学系列(2)——解决约瑟夫问题
    Java数据结构系列(4)——队列常用方法
    LeetCode树系列(1)——广度搜索应用,图的BFS
    LeetCode树系列(2)——深度搜索运用:LeetCode695题详解
  • 原文地址:https://www.cnblogs.com/colve/p/5954742.html
Copyright © 2020-2023  润新知