物理引擎(刚体常用方法)(3)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/lfanyize/article/details/102662273

1.给刚体施加力(AddForce):
签名 Public void AddForce(Vector3 force,ForceMode mode)。
这个方法被调用的时候将会向刚体施加一个沿着force方向的力,力的类型为mode,其中mode包含了四种类型,有计算重力的连续力,忽略重力的连续力,计算重力的瞬时力,忽略重力的瞬时力。
此方法的重载有多个
一个参数:
public void AddForce(Vector3 force);
两个参数:
public void AddForce(Vector3 force, [DefaultValue(“ForceMode.Force”)] ForceMode mode);
三个参数:
public void AddForce(float x, float y, float z);
四个参数:
public void AddForce(float x, float y, float z, [DefaultValue(“ForceMode.Force”)] ForceMode mode);

在使用的时候,由于ForceMode’的对象有多个所以需要开发人员进行选择,其中mode包含了四种类型,有计算重力的连续力、忽略重力的连续力、计算重力的瞬时力、忽略重力的瞬时力。

忽略重力的瞬时力(Acceleration):此模式与Force类似,唯一不同的就是Acceleration不会考虑物体的质量,即不管物体的质量相差多少,只要为其添加相同的力,他们的移动速度将会完全一样,其数值的计算方法为-——》距离/时间的平方

计算重力的连续力(Force):此模式能给物体施加向某一方向的的连续力,真实的模拟了现实世界中的物体的运动规律。当把相同的利分别施加给质量为1和2的物体上是,质量为1的物体的移动速度会大于质量为2 的物体的速度,其数值的计算方法为-——》质量*距离/时间的平方。

计算重力的瞬时力(Impulse):在此模式下只会为物体施加瞬时力,而不会持续的为物体添加力,其数值的计算方法为-——》质量*距离/时间。

忽略重力的连续力(VelocityChange):此模式与Impulse类似,唯一不同的是此种作用方式下将忽略刚体的实际质量,采用默认质量为1.0,其数值的计算方法为1.0(质量)*距离/时间。

2.移动刚体(MovePosition):
方法签名:Public void MovePosition(Vector3 position),此方法在调用的时候,系统会根据开发人员制定的位置将刚体的位置移动,其效果为刚体所在的游戏物体也会随之变动,此方法一般会在FixedUpdate方法中使用
物体均匀平移

private void Update()
    {
        GetComponent<Rigidbody>().MovePosition(transform.position + Vector3.right * Time.deltaTime);
    }

3.旋转刚体(MoveRotation)
此方法的签名为 Public void MoveRotation(Quaternion rot),此效果是系统根据开发人员制定的旋转的值在旋转刚体的同时旋转游戏物体

private void Start()
    {
        GetComponent<Rigidbody>().MoveRotation(transform.rotation * Quaternion.Euler(new Vector3(0, 100, 0) * Time.deltaTime));
    }

其中的Quaternion是一个四维向量它作用于Vector3的右乘返回一个向量用作旋转后的向量,因此Quaternion.Euler(0,90,0)*vector3(0,0,-10)返回的就是vector3(-10,0,0)。
4.添加一个爆炸力(AddExplosionForce):
签名:Public void AddExplosionForce(float explosionForce, Vector3 explosionPosition,float explosionRadius,float upwardsModifier,ForceMode mode)其中参数的意思分别为爆炸力的大小、爆炸力位置、爆炸力半径、在下方向上的位置向上施加,力的类型

private void Start()
    {
        GetComponent<Rigidbody>().AddExplosionForce(19.0f, transform.position, 10, 1.5f, ForceMode.Force);
    }

需要注意的是:爆炸力如果只添加在一个物体上的时候,并不会出现我们想象中的那种物体炸开的效果,如果想要出现那种效果,需要为多个物体添加这种力,来仿照爆炸效果。如果将爆炸力的大小设置为负数,则这个方法可以模拟出引力的效果,使在半径内的物体因爆炸力的作用想中心靠拢。

5.在指定点施加力(AddForceAtPosition):
签名:Public void AddForceAtPosition(Vector3 force,Vector3 position,ForceMode mode),在添加这个力的时候应是力的位置在物体之内否则会很难进行控制,force是一个方向向量其方向为添加力的方向,其模为添加力的大小。

private void Start()
    {
        GetComponent<Rigidbody>().AddForceAtPosition(Vector3.up, transform.position);
    }

需要注意的是当力添加到物体上的时候,如果物体忽略重力,则当场景运行之后,被添加力的物体将会不断地向上持续移动,如果物体不忽略重力,则当场景运行之后,物体会向上抖动一下,然后下落,但是下落的速度与不添加这个力的物体相比,不添加力的速度要更快。

6.施加相对力(AddRelativeForce):
签名:Public void AddRelativeForce(Vector3 force,ForceMode mode)
这个方法区别于AddForce的地方时,这里面的force是基于物体的模型坐标,而AddForce则是基于世界坐标
这里解释一下物体的模型坐标与世界坐标的区别:
局部坐标是指以父物体为参考,进行旋转、移动等。
而世界坐标系以“坐标陀螺”来进行旋转、移动等。
7.施加力矩(AddTorque):
签名:Public void AddTorque(Vector3 torque,ForceMode mode)
调用方法的时候,刚体将会收到一个沿着torque方向的力矩,

void Start()
    {
        GetComponent<Rigidbody>().AddTorque(Vector3.up, ForceMode.Force);
    }

力使物体转动的效果,不仅跟力的大小有关,还跟力和转动轴的距离有关。力越大,力跟转动轴的距离越大,力使物体转动的作用就越大。从转动轴到力的作用线的距离,叫做力臂。力和力臂的乘积叫做力对转动轴的力矩。
并且力与力矩符合右手定则
给两个物体分别添加力与力矩效果如下
在这里插入图片描述
添加力的物体向上移动,添加力矩的物体在原处旋转。在这里插入图片描述
图中向上的是力矩M,F是力,L是力臂。
8.施加相对力矩(AddRelativeTorque)
签名:Public void AddRelativeTorque(Vector3 toeque,ForceMode mode)
添加函数之后,物体会受到一个沿着torque的力矩

void Start()
    {
        GetComponent<Rigidbody>().AddRelativeTorque(Vector3.up, ForceMode.Force);
    }

相对力矩与力矩相似这里面的f相对力矩是基于物体的模型坐标,而力矩则是基于世界坐标

9.获取基于点坐标系的速度(GetPointVeiocity)
签名:Public void GetPointVeiocity(Vector3 point)
在世界中有一个游戏物体在运动,但是相对于世界中不同的点,这个游戏物体的速度是不同的,所以在不同的视角观看同一个物体,其运动状态也是不一样的,所以获取游戏物体相对于不同的点的速度是很有必要的,而调用此方法可以计算出刚体在一worldPoint为原点的坐标系中的速度

void Start()
    {
        Debug.Log(GetComponent<Rigidbody>().GetPointVelocity(Vector3.zero));
    }

10.获取基于相对点坐标系的速度(GetRelativePointVelocity)
签名:Public Vector3 GetRelativePointVelocity(Vector3 relativePoint)
给定一个基于刚体模型坐标系的点relativePoint
与GetPointVeiocity不同的是GetPointVeiocity给的是世界坐标中的点。

void Start()
    {
        Debug.Log(GetComponent<Rigidbody>().GetRelativePointVelocity(Vector3.zero));
    }

11.确定是否处于休眠(IsSleeping)
签名:Public bool IsSleeping() 调用此方法的时候返回一个bool值,判断对象是否处于休眠状态

12.设置密度(SetDensity)
签名:Public void SetDensity(float density) 调用此方法的时候,是给刚体设置一个密度,注意设置密度中的体积是碰撞器的体积

13.强制休眠(Sleep)
签名:PublicvoidSleep(),调用此方法可以将对应的刚体进行休眠,不参加物理模拟计算,通过将物体休眠的方法,可以将不重要的物体进行强制休眠的操作,用来提高程序的运行效率。

14.唤醒(WakeUp)
签名:Public void WakeUp()
与休眠想对应,当被休眠或者休眠的游戏物体需要参加物理模拟计算的时候,可通过此方法将休眠状态的游戏物体唤醒,执行其相应的功能。

15.扫描所有(Sweep TestAll)
签名:PublicRaycastHit[] Sweep TestAll(Vector3 direction,float maxDistance),调用该方法的时候回产生一条沿着direction方向上的射线,长度为MaxDistance,并返回一个RaycastHit类型的数组,其中储存了在direction方向上的所有刚体信息,注意刚数组长度不超过128,并且此方法只能扫描到简单类型的碰撞器,如球体、胶囊体等,网格碰撞器不适合使用这个方法。

猜你喜欢

转载自blog.csdn.net/lfanyize/article/details/102662273