弹簧物理-如何模拟弹簧和阻尼

Spring Physics

How to simulate springs and dampers

Posted by Glenn Fiedler on Friday,September 3,2004

Introduction

Hi, I’m Glenn Fiedler and welcome to Game Physics.

在前文中,我们讨论了,如何模拟刚体在3D中的运动。现在我们来讨论如何实现弹簧的物理。

弹簧背后的物理原理很简单,但是用途极广。你可以用弹簧把各个点连接在一起做绳索模型,布料模型,甚至是果冻模型。弹簧还可用于实现基本碰撞响应,并创建约束刚体运动的关节。

你做的物理编程越多,弹出的弹簧就越多。许多物理现象归结为施加弹簧力,如水中浮力。到处都是弹簧,让我们来看看如何模拟它们!

Spring and Dampers

虎克定律被用来模拟类似弹簧的行为:

F = -kx

式中,x是弹簧末端相对于平衡位置的矢量位移,k是描述弹簧松紧度的常数。K值越大意味着弹簧越紧,因此每单位力的拉伸量越小,较小的值意味着弹簧越松,拉伸量越大。

牛顿第三定律说,每一个力都有一个相等和相反的力。如果两个物体A和B通过弹簧连接在一起,那么弹簧将施加一个力,将物体A拉向物体B,并施加一个相等和相反的力,将物体B拉向A。但是,如果要将一个物体连接到空间中的一个固定点上,则可以施加物体B的力。朝一个方向喷射。如果你认为这个点有无穷大的质量,这是有道理的。

不过,仅弹簧力并没有多大用处。您需要将它们与阻尼器结合起来进行实际的模拟。阻尼模拟能量损失,并用于物理模拟,以确保弹簧不会永远振荡,而是随着时间的推移而静止。

弹簧-阻尼系统的模型如下:

F = - kx - bv

其中b是阻尼系数,v是弹簧连接两点之间的相对速度。b值越大,阻尼越大,物体就越快静止。

Variations on Springs

弹簧-阻尼系统有许多不同的变化,但我想做的是解释如何简单地考虑力的作用,这样你就可以轻松地设计弹簧和阻尼系统,以达到你想要的任何效果。

第一件事是,弹簧不仅要起到把两个点拉在一起的作用,这样它们就可以互相顶着。例如,您可以设计将两个点拉在一起或推开的弹簧力,以便它们彼此保持所需的分离距离:

F = -k(|x|-d)(x/|x|) - bv

其中|x|是连接到弹簧的两点之间的距离,d是所需的分离距离,x/|x|是两点之间的单位长度方向矢量:ab,向点a施加力时,反之亦然。

上述力方程的总体效果是,如果两个点之间的距离小于d,则力会推动弹簧连接的两个点分离,如果两个点之间的距离大于d,则力会将它们聚集在一起。注意,当两个点在目标距离时,力是如何变成零的?如果您正确地调整k和b参数,您可以有一个性能良好的弹簧,它可以快速地将两个点平稳地结合在一起,并在解点处停止。

但为什么只对位置应用弹簧?如果你想随着时间的推移使物体加速到某个速度,那么你可以计算一个弹簧力,它与当前速度和目标速度之间的差成比例,再加上与当前速度成比例的阻尼,这样随时间推移,就达到了目标速度而不是重复它。在物理模拟中,这通常被称为马达。

我们甚至可以应用同样的概念,通过应用与当前角速度和所需角速度之差成比例的弹簧扭矩,再加上与当前角速度成比例的阻尼力,来驱动物体以一定速度旋转。

另一个常用的弹簧约束是强制物体的垂直方向,例如,可以应用与当前方向和垂直方向之间的差异成比例的弹簧扭矩,再加上与角速度成比例的阻尼器。这种约束被称为“直立约束”,常用于科幻悬停竞速游戏。

如你所见,弹簧的应用是无限的。总的模式是设计弹簧力,它将把物理模拟吸引到所需的状态,并在达到此状态时衰减到零。为了确保您的物理对象不仅围绕解决方案振荡,而且能实际达到解决方案,那么就有必要应用一个和某个物理状态值成比例的阻尼,以随着时间演变将模拟推向最终结果。

Attachment using a Spring

因此,让我们从使用Spring模拟的实际具体实现开始。我们首先要实现的是一个连接关节,它允许用户单击并拖动立方体上的一个点来移动它。我们将通过在目标点和立方体主体上的附着点之间建模一个紧密的弹簧附着来实现这一点。这实际上是实现了一个球形关节,只使用弹簧力,我们用标准公式来实现:

F = -kx -bv

其中x是当前目标点与对象上附着点之间的矢量差,v是对象上附着点处的点速度。重要的是,速度v是点速度,意味着它包含了物体的线性运动加上由于旋转产生的附着点的角速度。如前一篇文章所示,我们可以计算该点速度,如下所示:

vpoint = vlinear + vangular cross(p - x)

其中p是刚体上的点,x是物体的质心。其次,这种弹簧和阻尼力不仅是线性作用,而且作用在物体的附着点上。这意味着弹簧力将同时施加线性力和扭矩分量,如下所示:

Flinear = F

Ftorque = F cross(p - x)

这个关节的整体效果是将目标和附着点结合在一起,同时抑制附着点处物体的运动。这允许对象移动,只要保持在链接附近。换言之,仅允许通过围绕附着点旋转来移动对象。我们简单的球窝接头现在完成了。

Collision Response with Springs

接下来,我们将使用弹簧实现基本碰撞响应。这里的诀窍是对我们不想要的东西施加一个弹簧和阻尼力,例如物体相互移动并穿透其他物体。

所以我们检测到了碰撞,通常的信息会返回到物理系统,准备应用碰撞响应。这些信息通常类似于:

  • 一个单位长度的碰撞法线
  • 法线方向的渗透深度
  • 每个碰撞物体在碰撞时的物理状态

所有这些信息组合在一起称为一个contact。处理碰撞几何图形并返回一系列常规contact是一个好主意,因为它将碰撞响应与碰撞检测的粗糙细节分离开来。

一旦我们掌握了所有的contact信息,就可以通过对碰撞对象施加弹簧力来实现简单的碰撞响应,以使它们保持分离:

F = nkd - bn(n.v)

其中k和b是弹簧阻尼系数,n是接触法向,v是两个物体在碰撞点之间的相对速度。作用上,该方程计算了沿接触法向推出的弹簧力,同时减小了接触点处物体相互之间的相对速度。

使用该方程还可以实现各种不同的碰撞响应类型,例如,将b设置为0会产生完全弹性的碰撞响应,进入碰撞的所有能量都会随着时间的推移而返回。将b设置为较高的值会使碰撞更具非弹性,因为它在碰撞过程中会带走更多的能量。最后,通过增加和减少弹簧常数k与b,你可以制造出一种碰撞的感觉,从蹦床反弹(低k和低b),到着陆和陷入流沙(低k和高b),或以混凝土飞溅着陆(高k,高b)。

The Weakness of Springs

似乎我们只使用弹簧就可以实现各种不同的碰撞效果,而且很容易制作关节和约束。不过,这并不都是好消息,因为弹簧有自己的一系列弱点,我现在就解释一下。

第一个缺点是很难调整弹簧常数来获得您想要的效果。例如,如果您试图对一个对象的真实物理进行建模,则需要进行实验以找到与模拟匹配的弹簧k和b值。这些值通常依赖于模拟的其他值,例如重力常数,这意味着如果调整重力,则需要重新调整弹簧以获得相同的效果。

下一个问题是,你使用的弹簧k越紧,解微分方程就越困难。使用一个RK4积分器确实有助于实现这一点,但是即使使用RK4,在模拟爆炸之前,你也有一个基本的限制,那就是你可以使你的弹簧k有多大。在这一点上,你要么减少你的时间步,要么减少你的弹簧K。

最后,也是主要的弱点是弹簧是反应性的,而不是预测性的。这是一个微妙的问题,但非常重要。使用弹簧实现的关节或约束只能通过在发生错误后更正错误来工作,而使用弹簧的碰撞响应需要在纠正之前允许一定的穿透量,以此类推。现有的更先进的技术可以在不产生误差的情况下解决约束物理模拟所需的力,如LCP求解器或迭代法,但它们超出了本文的范围。

Next:Networked Physics(2004)

原文链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值