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

弹簧物理-如何模拟弹簧和阻尼
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 .
小说村子
在前⽂中,我们讨论了,如何模拟刚体在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
p2p流媒体
弹簧-阻尼系统有许多不同的变化,但我想做的是解释如何简单地考虑⼒的作⽤,这样你就可以轻松地设计弹簧和阻尼系统,以达到你想要的任何效果。
第⼀件事是,弹簧不仅要起到把两个点拉在⼀起的作⽤,这样它们就可以互相顶着。例如,您可以设计将两个点拉在⼀起或推开的弹簧⼒,以便它们彼此保持所需的分离距离:
F = -k(|x|-d)(x/|x|) - bv
其中|x|是连接到弹簧的两点之间的距离,d是所需的分离距离,x/|x|是两点之间的单位长度⽅向⽮量:a到b,向点a施加⼒时,反之亦然。
上述⼒⽅程的总体效果是,如果两个点之间的距离⼩于d,则⼒会推动弹簧连接的两个点分离,如果两个点之间的距离⼤于d,则⼒会将它们聚集在⼀起。注意,当两个点在⽬标距离时,⼒是如何变成零的?如果您正确地调整k和b参数,您可以有⼀个性能良好的弹簧,它可以快速地将两个点平稳地结合在⼀起,并在解点处停⽌。
但为什么只对位置应⽤弹簧?如果你想随着时间的推移使物体加速到某个速度,那么你可以计算⼀个弹簧⼒,它与当前速度和⽬标速度之间的差成⽐例,再加上与当前速度成⽐例的阻尼,这样随时间推移,就达到了⽬标速度⽽不是重复它。在物理模拟中,这通常被称为马达。
我们甚⾄可以应⽤同样的概念,通过应⽤与当前⾓速度和所需⾓速度之差成⽐例的弹簧扭矩,再加上与当前⾓速度成⽐例的阻尼⼒,来驱动物体以⼀定速度旋转。
无锡 性息另⼀个常⽤的弹簧约束是强制物体的垂直⽅向,例如,可以应⽤与当前⽅向和垂直⽅向之间的差异成⽐例的弹簧扭矩,再加上与⾓速度成⽐例的阻尼器。这种约束被称为“直⽴约束”,常⽤于科幻悬停竞速游戏。
如你所见,弹簧的应⽤是⽆限的。总的模式是设计弹簧⼒,它将把物理模拟吸引到所需的状态,并在达到此状态时衰减到零。为了确保您的物理对象不仅围绕解决⽅案振荡,⽽且能实际达到解决⽅案,那么就有必要应⽤⼀个和某个物理状态值成⽐例的阻尼,以随着时间演变将模拟推向最终结果。
Attachment using a Spring
因此,让我们从使⽤Spring模拟的实际具体实现开始。我们⾸先要实现的是⼀个连接关节,它允许⽤户单击并拖动⽴⽅体上的⼀个点来移动它。我们将通过在⽬标点和⽴⽅体主体上的附着点之间建模⼀个紧密的弹簧附着来实现这⼀点。这实际上是实现了⼀个球形关节,只使⽤弹簧⼒,我们⽤标准公式来实现:
F = -kx -bv
其中x是当前⽬标点与对象上附着点之间的⽮量差,v是对象上附着点处的点速度。重要的是,速度v是点速度,意味着它包含了物体的线性运动加上由于旋转产⽣的附着点的⾓速度。如前⼀篇⽂章所⽰,我们可以计算该点速度,如下所⽰:
v  = v  + v  cross (p - x)
其中p是刚体上的点,x是物体的质⼼。其次,这种弹簧和阻尼⼒不仅是线性作⽤,⽽且作⽤在物体的附着点上。这意味着弹簧⼒将同时施加线性⼒和扭矩分量,如下所⽰:
F  = F
F  = 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
point linear angular linear torque
似乎我们只使⽤弹簧就可以实现各种不同的碰撞效果,⽽且很容易制作关节和约束。不过,这并不都是好消息,因为弹簧有⾃⼰的⼀系列弱点,我现在就解释⼀下。
第⼀个缺点是很难调整弹簧常数来获得您想要的效果。例如,如果您试图对⼀个对象的真实物理进⾏建模,则需要进⾏实验以到与模拟匹配的弹簧k和b值。这些值通常依赖于模拟的其他值,例如重⼒常数,这意味着如果调整重⼒,则需要重新调整弹簧以获得相同的效果。
下⼀个问题是,你使⽤的弹簧k越紧,解微分⽅程就越困难。使⽤⼀个RK4积分器确实有助于实现这⼀点,但是即使使⽤RK4,在模拟爆炸之前,你也有⼀个基本的限制,那就是你可以使你的弹簧k有多⼤。在这⼀点上,你要么减少你的时间步,要么减少你的弹簧K。中国的江河湖海
钴盐
最后,也是主要的弱点是弹簧是反应性的,⽽不是预测性的。这是⼀个微妙的问题,但⾮常重要。使⽤弹簧实现的关节或约束只能通过在发⽣错误后更正错误来⼯作,⽽使⽤弹簧的碰撞响应需要在纠正之前允许⼀定的穿透量,以此类推。现有的更先进的技术可以在不产⽣误差的情况下解决约束物理模拟所需的⼒,如LCP求解器或迭代法,但它们超出了本⽂的范围。

本文发布于:2024-09-21 13:30:52,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/260025.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:弹簧   碰撞   模拟   物体   物理   实现
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议