Unity 2D 脚本化摩擦方程

Posted

技术标签:

【中文标题】Unity 2D 脚本化摩擦方程【英文标题】:Unity 2D scripted friction equation 【发布时间】:2017-12-16 01:07:51 【问题描述】:

我正在研究一个方形物体在被玩家推动后的摩擦力。块的运动完全通过脚本使用 transform.Translate(velocity) 每帧和一个 boxcollider2D 来控制。我推测因为我手动控制每个帧的块运动是我似乎无法让 boxcolliders2D 的物理材料 2D 摩擦工作的原因。

基本上,我试图通过使用 transform.translate 重新创建类似于刚体的内置物理,或者如果可能的话使用内置物理。到目前为止,我已经找到了类似的东西

newVelocity.x -= ( 1 / (newVelocity.x * newVelocity.x)); 试图降低每帧的velocity.x,直到它达到0并短路。显然,当velocity.x 变为十进制数时,这将分崩离析。我很困惑我应该做些什么来实现类似于刚体的摩擦,刚开始它会减慢一点,然后在停止时快得多。任何和所有帮助表示赞赏,在此先感谢!

【问题讨论】:

既然您手动使用速度,为什么不使用Rigidbody2D 并修改它的速度?这会给你带来摩擦力、重力等等。 【参考方案1】:

您可以比较计算速度变化前后的速度符号,并在符号变化时将速度设置为零,如下所示:

newVelocity.x -= ( 1 / (newVelocity.x * newVelocity.x));
if(Mathf.Sign(previousVelocity.x) != Mathf.Sign(newVelocity.x)) 
    newVelocity.x = 0f;

不过,有一点是法向摩擦力不是使用上述公式计算的,而是按如下方式计算的:

newVelocity.x -= frictionCoefficient*Time.fixedDeltaTime;

有了这个,您不需要将速度与之前的速度进行比较,因为您可以说如果速度低,则为零。如果你愿意,你仍然可以比较以前的速度标志,但这可能更有效

if(newVelocity.x < 0.01f) 
    newVelocty.x = 0f;

【讨论】:

以上是关于Unity 2D 脚本化摩擦方程的主要内容,如果未能解决你的问题,请参考以下文章

我的随机化脚本的 Unity 2D 问题

[从0开始机器学习]4.线性回归 正规方程

Unity初学1——角色移动控制(2d)

连续时变系统状态方程的离散化

Unity2D:在订单中禁用实例化的预制件

增广矩阵有未知数如何化简