• Unity中的ForceMode


    来源:https://blog.csdn.net/u010133610/article/details/58601920

    关于作用力方式ForceMode的功能注解

    ForceMode为枚举类型,用来控制力的作用方式,有4个枚举成员,在以下举例中均设刚体质量为m=2.0f,力向量为f=(10.0f,0.0f,0.0f)。

    (1)ForceMode.Force:默认方式,使用刚体的质量计算,以每帧间隔时间为单位计算动量。设FixedUpdate()的执行频率采用系统默认值(即0.02s),,则由动量定理

    f•t=m•v

    可得:10*0.02=2*v1,从而可得v1=0.1,即每帧刚体在X轴上值增加0.1米,从而可计算得刚体的每秒移动速度为v2=(1/0.02)*v1=5m/s。

    (博主注:正确的速度是0.1m/s)

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

    f•t=1.0•v

    即可得v1= f•t=10*0.02=0.2,即刚体每帧增加0.2米,从而可得刚体的每秒移动速度为v2=(1/0.02)*v1=10m/s。

    (博主注:正确的速度是0.2m/s)

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

    f•1.0=m•v

    即可得v1=f/m=10.0/2.0=5.0,即刚体每帧增加5.0米,从而可得刚体每秒的速度为v2=(1/0.02)*5.0=250m/s。

    (博主注:正确的速度是5m/s)

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

    f•1.0=1.0•v

    即可得v1=f=10.0,即刚体每帧沿X轴移动距离为10米,从而可得刚体每秒的速度为v2=(1/0.02)*v1=500m/s。

    (博主注:正确的速度是10m/s)

    ================================================================================

    上面的内容的黑字部分是从网上找的,并不是我自己手打,我手头没有这本书,但是为了验证以上内容的真实性,我还是从亚马逊买了一本Kindle版的(我个人更喜欢实体书,但是这本书已经买不到了),仔细对照过,内容是没有问题的。

    在从网上查找FoceMode的四种方式的不同时,找到的这个内容。看完前面的公式,基本上就明白了官方注释中的continuous和instant的区别。但是自己按照书中的设置写了个例子,却发现结果出入很大。本身我是个文科生,动量定理根本没学过,所以就懵圈了!

    经过一系列的学习研究发现,作者在计算的时候把单位概念搞错了!

    拿ForceMode.Force来说,

    ft=mv

    f=10,m=2

    t是多少呢?这里就来解释一下对于官方注释中的continuous的理解方式,ForceMode.Force模式,是在一秒钟的时间内持续施加的力的和为f,所以在FixedUpdate默认设置中执行时,t为0.02。即10*0.02=2*v,得v=0.1,这里v的单位是什么?作者搞错了,不是m/帧,是m/s。所以后面又进行了v*(1/0.02)的计算,不知道是作者的失误还是对单位概念的混淆。

    书中自带的例子:


    using UnityEngine;
    using System.Collections;

    public class ForceMode_ts : MonoBehaviour
    {
    public Rigidbody A, B, C, D;
    //作用力向量
    Vector3 forces = new Vector3(10.0f, 0.0f, 0.0f);

    void Start()
    {
    //初始化4个刚体的质量,使其相同
    A.mass = 2.0f;
    B.mass = 2.0f;
    C.mass = 2.0f;
    D.mass = 2.0f;
    //对A、B、C、D采用不同的作用力方式
    //注意此处只是对物体增加了1帧的作用力
    //如果要对刚体产生持续作用力请把以下代码放在FixedUpdate()方法中
    A.AddForce(forces, ForceMode.Force);
    B.AddForce(forces, ForceMode.Acceleration);
    C.AddForce(forces, ForceMode.Impulse);
    D.AddForce(forces, ForceMode.VelocityChange);
    }

    void FixedUpdate()
    {
    Debug.Log("ForceMode.Force作用方式下A每帧增加的速度:" + A.velocity);
    Debug.Log("ForceMode.Acceleration作用方式下B每帧增加的速度:" + B.velocity);
    Debug.Log("ForceMode.Impulse作用方式下C每帧增加的速度:" + C.velocity);
    Debug.Log("ForceMode.VelocityChange作用方式下D每帧增加的速度:" + D.velocity);
    }
    }


    这个是原书中给出的运行结果,这个结果是没有问题的,不知道到底是什么原因导致了这种错误。难道说作者把Rigidbody.velocity的意思也搞错了???!!!

    与其怀疑作者的能力,我更相信是作者和出版社对出版物的不负责。
    ————————————————
    版权声明:本文为CSDN博主「HelloMingo」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u010133610/article/details/58601920

  • 相关阅读:
    vue打包之后动态修改请求接口方法
    vue基于Blob.js和 Export2Excel.js做前端导出
    uniapp中scroll-view自定义滚动条
    vue项目报错如下:(Emitted value instead of an instance of Error)
    uniapp h5中解决跨域问题
    测试方法
    synchronized的锁问题
    Java的三种代理模式简述
    Spring Boot REST API 自动化测试
    Elasticsearch学习
  • 原文地址:https://www.cnblogs.com/LiTZen/p/12200412.html
Copyright © 2020-2023  润新知