simulation - 运动方程与 Verlet:碰撞被忽略?
问题描述
我最初使用标准运动方程对我的模拟进行了编码,但众所周知,它最终变得非常不稳定,即使它在技术上有效。
如果我们将 x(t) 作为运动方程的位置函数,我通过重新分解 x(t+delta) 来计算模拟中的“下一个”位置,如下所示:
x(t+delta) = x(t) + (1/2)*a*delta^2 + a*t*delta
t = t + delta
最重要的是,a 被计算为 NetForce/Mass。如果我的系统/粒子遇到碰撞,法向力会以这样的方式影响净力,使其在碰撞轴上为 0(即,如果它落在地面上,重力正在向下拉,地板的法向力取消重力)。到目前为止,这在任何类型的碰撞中都表现出色。
但是,我决定切换到 Verlet 集成,因为它更稳定,并且由于某种原因,它完全忽略了碰撞。我使用以下公式:
x(t+delta) = x(t) + v(t) * delta + .5*a(t)*delta^2
v(t+delta) = v(t) + .5 * (a(t) + a(t+delta)) * delta
a(t+delta) = NetForce / Mass
t = t + delta
其中 v(0)=0,a(0)=0。因此,除了旧位置之外,我还存储旧的加速度和速度。但是,我遇到了上述问题:它无法正常工作,因为它忽略了碰撞。即使它应该已经被计入加速度...
我应该如何处理这个?
解决方案
不应该是:
if x(t) is a position of collision:
v(t+delta) = v(t) - 2*( dot(normal_at(x(t)), v(t)) / norm(normal_at(x(t))^2 )*normal_at(x(t))
x(t+delta) = x(t)
else:
x(t+delta) = x(t) + v(t) * delta + .5*a(t)*delta^2
a(t+delta) = NetForce( x(t+delta) ) / Mass
v(t+delta) = v(t) + .5 * (a(t) + a(t+delta)) * delta
t = t + delta
推荐阅读
- python - 谁能解释一下这个代码中successful_frame_read的目的是什么?
- node.js - 使用 icognito 身份池时,在 Lambda 函数中获取 context.identity 中的用户信息
- javascript - 如何在 React 中从多个端点获取和显示数据?
- django - 从 rest-auth social Login 获取用户 ID
- c# - 每当我通过 SSH-ing 执行我的 git 命令时,我在 c# 代码输出中遇到错误
- python - 如何将数据框导出到单元格列表而不是行列表?
- next.js - 如何使用 NextJS 和 TailwindCSS 更改悬停图像?
- powerbi - 显示列是否包含切片器值的计算列
- fortran - 在 Fortran 中,write 函数中的单位是字符。这个怎么理解?
- javascript - 为什么从 request.params.id 表达式返回 jquery-3.5.1.min.js