问题标签 [verlet-integration]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
11633 浏览

physics - 为什么 Verlet 积分优于 Euler 积分?

有人可以向我解释为什么 Verlet 积分比 Euler 积分更好吗?为什么 RK4 比 Verlet 更好?我不明白为什么这是一个更好的方法。

0 投票
1 回答
1995 浏览

game-physics - 非常基本的碰撞解决与 verlet 集成

我正在学习如何为自己的娱乐做一些非常基本的物理东西,但我遇到了一个奇怪的问题。

我正在使用http://www.lonesock.net/article/verlet.html上描述的时间校正的 verlet 集成方法,到目前为止,它工作得很好。动作和东西看起来都不错。

我的问题发生在碰撞解决方面。我可以解决(看起来相当好)地形,因为地形不会移动。我只是将玩家的当前位置设置到一个安全的位置,事情似乎还不错。然而,当我尝试解决另一个精灵(物理演员等)时,事情似乎到处都是。

我的分辨率代码如下所示:

可以看出,有三种情况,取决于碰撞的精灵是否是物理的。

这很可能是第一个有问题的案例;我在这里使用相同的功能来获得穿透深度,就像我在(看似有效的)地形碰撞中一样。

为什么碰撞的精灵会飞得满地都是?我对这个问题感到很困惑。任何帮助都会很棒。

0 投票
2 回答
1883 浏览

time - 时间校正 Verlet 积分和太大的时间步长

我使用在这里找到的时间校正 Verlet 集成:http ://www.gamedev.net/page/resources/_/technical/math-and-physics/a-simple-time-corrected-verlet-integration-method-r2200

但是当我的球在墙上(水平墙,球在上面并且加速度指向下方)一段时间后,我的游戏无法以正确的方式识别碰撞并且球向下。如果我将固定上限设置为 1/60 之类的 deltatime,它似乎可以工作。

我认为问题在于时间步长太大。但是进行时间校正的verlet积分是为了避免太大的时间步长,对吗?如果是,为什么我需要时间上限?

0 投票
2 回答
2612 浏览

physics - Verlet积分器+摩擦

我一直在 Gamedev.net 上关注“基于 Verlet 的 2D 游戏物理方法”,我也写过类似的东西。

我遇到的问题是盒子在地面上滑动太多。我怎样才能添加一个简单的静止状态的东西,盒子会有更多的摩擦并且只会滑动一点点?

0 投票
1 回答
977 浏览

java - 在周期性分子动力学模拟中实施速度 Verlet 算法时的失控速度

我正在尝试为具有周期性或反射边界条件的二维盒子中的伦纳德-琼斯流体编写分子动力学模拟。模拟似乎在反射边界上运行良好,但由于某种原因,周期盒中的粒子在几百个积分步骤后开始获得额外的速度,最终没有粒子留在盒子中。

我知道速度失控可能是由于时间步设置太小而引起的。然而,当我使用相同的速度-verlet 算法运行模拟时,我看不出这可能是速度失控的原因,尤其是反射边界工作得很好。我认为在这两种情况下用于评估粒子上的力或粒子分离的方法可能存在错误,但我自己无法找到它。

我用来评估力的代码如下所示:

这应该赋予作用在每个粒子上的伦纳德-琼斯力。粒子分离取决于边界条件。对于反射,它是:

将粒子保留在盒子中。另一方面,对于定期...

给出粒子分离和

检查边界。两种分离方法都调用

这只是笛卡尔空间中两个粒子的矢量分离。我的编码是否有错误,或者我的模拟因周期性边界条件而崩溃的其他原因?

谢谢

0 投票
4 回答
13169 浏览

python - 编写一个更快的 Python 物理模拟器

我一直在尝试用 Python 编写自己的物理引擎,作为物理和编程的练习。我从遵循此处的教程开始。进展顺利,但后来我发现了 thomas jakobsen 的文章“高级角色物理”,其中介绍了使用 Verlet 集成进行模拟,我觉得这很吸引人。

我一直在尝试使用 verlet 集成编写自己的基本物理模拟器,但结果比我最初预期的要困难一些。我正在浏览要阅读的示例程序,偶然发现了这个用 Python 编写的程序,我还发现了这个使用处理的教程。

Processing 版本让我印象深刻的是它的运行速度。仅布料就有 2400 个不同的模拟点,这还不包括身体。

python 示例只为布料使用了 256 个粒子,它以大约每秒 30 帧的速度运行。我尝试将粒子数增加到 2401(它必须是正方形才能使该程序工作),它以大约 3 fps 的速度运行。


这两种方法都通过将粒子对象的实例存储在列表中,然后遍历列表,调用每个粒子的“更新位置”方法来工作。例如,这是处理草图中计算每个粒子的新位置的代码部分:

编辑:这是我之前链接的python版本的代码:


因为这两个程序的工作方式大致相同,但是 Python 版本要慢得多,这让我想知道:

  • 这种性能差异是 Python 本质的一部分吗?
  • 如果我想从我自己的 Python 程序中获得更好的性能,我应该怎么做?例如,将所有粒子的属性存储在一个数组中,而不是使用单个对象等。

编辑:回答!

@Mr E 在评论中链接了 PyCon 谈话,@A。Rosa 对链接资源的回答极大地帮助了我们更好地理解如何编写好的、快速的 python 代码。我现在将此页面添加为书签以供将来参考:D

0 投票
3 回答
6988 浏览

python - Runge-Kutta RK4 不比 Verlet 好?

我只是在游戏中测试几种轨道动力学的集成方案。我在这里采用了恒定和自适应步骤的 RK4 http://www.physics.buffalo.edu/phy410-505/2011/topic2/app1/index.html

我将它与简单的verlet集成(和欧拉,但它的性能非常差)进行了比较。看起来恒定步长的RK4并不比verlet好。具有自适应步长的 RK4 更好,但不是很多。我想知道我是不是做错了什么?或者说 RK4 比 verlet 优越得多是什么意思?

认为 Force 每 RK4 步骤评估 4 次,但每个 verlet 步骤仅评估 1 次。因此,为了获得相同的性能,我可以将 verlet 的 time_step 设置为小 4 倍。使用 4 倍更小的时间步长,verlet 比具有恒定步长的 RK4 更精确,并且几乎可以与具有附加步长的 RK4 相媲美。

见图片: https ://lh4.googleusercontent.com/-I4wWQYV6o4g/UW5pK93WPVI/AAAAAAAAA7I/PHSsp2nEjx0/s800/kepler.png

10T 表示 10 个轨道周期,后面的数字 48968,7920,48966 是需要的力评估数

python代码(使用pylab)如下:

0 投票
1 回答
918 浏览

c# - 布娃娃关节角度约束

我正在根据 Thomas Jakobsen 的文章http://www.gpgstudy.com/gpgiki/GDC%202001%3A%20Advanced%20Character%20Physics在布娃娃上做一个 C# 项目

我已经将逻辑转换为 2D 并且一切似乎都在工作,只是我在实现角度约束时遇到了问题。

这是我目前正在使用的代码:

粒子 p1 和 p 是关节,getFixPoint() 返回父关节的位置。RotatePoint(point, centerPoint, angleRad) 返回围绕 centerPoint 旋转 angleRad 弧度的点的位置。

这段代码会导致严重的抖动,并且由于我使用 Verlet 集成这一事实 - 我试图通过将转换添加到旧位置来弥补这一点,这似乎解决了我的一些问题,但我仍然遇到严重的抖动和随机力应用让我相信我的数学很糟糕。

我在距离约束之后应用此约束,因为当我围绕父关节旋转时,关节之间的距离应该是恒定的。

这是我的第一个 stackoverflow 问题,所以请告诉我我的表单是否不好。

0 投票
3 回答
382 浏览

haskell - Haskell 中的 Verlet 集成

我是 Haskell 的新手,作为练习,我一直在尝试实现 Joel Franklin 的著作Computational Methods in Physics中的一些代码(用 Mathematica 编写) 。我编写了以下代码以将 lambda 表达式(加速度)作为第一个参数。通常,加速度的形式为 x'' = f(x',x,t),但并不总是所有三个变量的形式。

在 ghci 中,我将使用以下命令运行此代码(加速函数 a = -(2pi) 2 x 来自书中的一个练习):

我的问题是这不是真正的 Verlet 方法 - 这里 x n+1 = x n + dt*v n +1/2*a(x n ,v n ,n),而维基百科中描述的 Verlet 方法x n+1 = 2*x n - x n-1 +a(x n ,v n ,n)。我将如何重新编写此函数以更忠实地表示 Verlet 集成方法?

切线,有没有办法更优雅和简洁地写这个?是否有线性代数库可以使这更容易?我很感激你的建议。

0 投票
2 回答
4904 浏览

c++ - 太阳系模拟项目(velocity verlet help)

对于我的建模和模拟类项目,我想模拟一个太阳系。我从一颗恒星(太阳)和一颗行星(地球)开始,但我已经遇到了一些问题。我现在花了一些时间来回顾和学习不同的公式和方法来模拟行星的轨道将如何受到恒星和周围物体的影响。我想使用velocity verlet并最终研究n体问题。我的速度 verlet 功能有很多问题。有时它的行为就好像它正在正常运行地球轨道,然后它“扭曲驱动”地球进入某个随机位置。我还注意到我从来没有得到“负”加速度,所以我的 x 和 y 坐标。一直在增加,所以我看不到地球应该如何环绕太阳。任何帮助是极大的赞赏。我刚刚拥有的 AGK::Prints 可以看到不同的变量是如何变化的。