问题标签 [physics]

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 投票
1 回答
4870 浏览

c# - Verlet 集成正在炸毁我的物理引擎

我正在构建一个物理引擎,并且我有某种“伪verlet”的东西,我想将它升级为“真正的”verlet。所以我找到了一篇文章并开始工作。在我添加了我认为很好的近似值之后,引擎不再工作了。有人可以帮我理解我做错了什么吗?

我的主要物理体类的更新、应用力和应用脉冲系统:

编辑: 我已经修复了它,它就像一个魅力,但我对以下代码有两个问题:

  • 脉冲应用程序代码是否正确,如果不正确,应该是什么?
  • 如何更改位置属性以使其设置保留身体的当前速度?

这是代码:

0 投票
1 回答
509 浏览

c# - 物理引擎的计算顺序和迭代

我正在编写一个使用 Verlet 集成的物理引擎,但我无法让一些约束正常工作。一些(如粘合/焊接约束)更加“潮湿”并且不够坚硬,而另一些(如区域约束)则具有额外的弹性并让原子飞扬。我的物理模拟器中更新方法的代码是这样的:

我已经尝试了所有不同的更新命令组合,但没有任何帮助。我对使用迭代有一个模糊的想法,但不知道还有什么帮助。有什么建议么?

0 投票
1 回答
1201 浏览

implementation - 如何将恢复系数实现到一个简单的物理引擎中?

我正在编写一个支持圆-圆碰撞的简单 2d 物理引擎,但我不知道如何改进我的碰撞解决方法以增加恢复原状。物理引擎中如何实现恢复系数属性?

0 投票
3 回答
273 浏览

c# - 如果身体撞击得太快,区域约束会炸毁我的物理模拟

我有一个物理模拟,它允许你放置区域约束,这样里面的物体就不会离开那个区域。但是,如果一个原子越过区域约束的“墙”之一,它就会破坏物理模拟。为什么这样做?更新方法:

0 投票
1 回答
714 浏览

c# - 如何制作具有迭代约束的软弹簧?

我正在尝试将弹簧添加到我的物理引擎中,虽然算法本身可以工作,但它们非常僵硬(必须输入 <= 大约 0.1 的值才能从中获得任何可见的运动,并且它必须设置得非常小为了正常工作)。有什么提示可以改进以下代码,使其在 0.1 到 1 范围内的值不那么僵硬?

0 投票
10 回答
23985 浏览

algorithm - 宽相碰撞检测方法?

我正在构建一个 2D 物理引擎,我想添加宽相碰撞检测,尽管我只知道 2 或 3 种类型:

  • 检查一切与其他一切(O(n ^ 2)复杂度)
  • Sweep and Prune(排序和扫描)
  • 关于二进制空间分区的一些事情(不知道如何做到这一点)

但肯定有更多的选择,对吧?这些是什么?是否可以提供每个的基本描述或描述的链接?

我已经看到了这一点,但我要求提供可用算法的列表,而不是最适合我需要的算法。

在这种情况下,“宽相碰撞检测”是物理引擎用来确定其模拟中哪些物体足够接近以保证进一步调查和可能的碰撞解决的方法。

0 投票
3 回答
22906 浏览

math - 用于游戏物理的 Runge-Kutta (RK4) 集成

Gaffer on Games 有一篇很棒的文章,介绍了使用RK4 集成来获得更好的游戏物理效果。实现很简单,但它背后的数学让我感到困惑。我在概念层面上了解导数和积分,但很长时间没有操纵方程了。

这是 Gaffer 实现的主要内容:

谁能简单地解释一下 RK4 是如何工作的?具体来说,为什么我们要对0.0f, 0.5f,处的导数进行平均0.5f,以及1.0f?对 4 阶导数进行平均与用更小时间步进行简单的欧拉积分有何不同?


在阅读了下面公认的答案以及其他几篇文章后,我对 RK4 的工作原理有了一定的了解。回答我自己的问题:

谁能简单地解释一下 RK4 是如何工作的?

RK4 利用了这样一个事实,即如果我们使用函数的高阶导数而不仅仅是一阶或二阶导数,我们可以获得更好的函数逼近。这就是泰勒级数 比欧拉近似收敛得快得多的原因。(看看那个页面右侧的动画)

具体来说,为什么我们要对 、 、 和 处的导0.0f0.5f进行0.5f平均1.0f

Runge-Kutta 方法是一个函数的近似值,它在一个时间步长内对多个点的导数进行采样,而泰勒级数仅对单个点的导数进行采样。在对这些导数进行采样后,我们需要知道如何对每个样本进行称重以获得最接近的近似值。一个简单的方法是选择与泰勒级数一致的常数,这是确定龙格-库塔方程常数的方法。

这篇文章让我更清楚了。注意(15)泰勒级数展开是怎样的,而(17)龙格-库塔推导是怎样的。

对高达 4 阶的导数求平均与用更小时间步进行简单的欧拉积分有何不同?

从数学上讲,它的收敛速度比许多欧拉近似要快得多。当然,通过足够的欧拉近似值,我们可以获得与 RK4 相同的精度,但所需的计算能力并不能证明使用欧拉是合理的。

0 投票
2 回答
9153 浏览

c++ - Bullet Physics - 在身体的局部空间中应用扭矩脉冲

我目前正在为我正在使用 C++ 和Ogre3D编写的 3D 太空游戏评估Bullet 物理库。通过从 btMotionState 派生并插入我的 SceneNodes,我已经很好地集成了 Ogre3D 和 Bullet,但是现在我在计算应该传递给 btRigidBody::applyCentralImpulse 和 btRigidBody::applyTorqueImpulse 方法以实现的值时遇到了很多麻烦我正在寻找的结果。

当我按下键盘上的 LEFT 或 RIGHT 键时,我希望飞船在本地 Z 轴上滚动。当我按下 UP 或 DOWN 时,我希望它在本地 X 轴上倾斜。当我按下 A 或 Z 时,我希望它在局部 Z 轴的方向上加速/减速。我可以使用一些四元数数学在 Ogre 中完美地实现这一点,并直接在 SceneNode 上应用平移/旋转,但我真的想使用力/扭矩方法在子弹引擎中应用这些值,以便它继续移动/俯仰/滚动即使在用户停止按键之后,摩擦力也会作用在对象上,使其在必要时减慢速度。

那么,我如何计算提供给这两种脉冲方法的必要值,以确保脉冲根据身体当前的方向而不是使用世界轴进行作用?

谢谢,马克

更新:

我能够计算出向前和向后运动所需的脉冲,但我仍在努力调整偏航/俯仰/滚动值的方向,以便将它们与扭矩脉冲法一起使用。这是我进行向前/向后运动的方式:

0 投票
2 回答
1950 浏览

c# - 在碰撞解决方法中应用恢复系数

我的物理引擎中有一个碰撞解决方法,如下所示:

现在,我无法弄清楚在我的引擎中应用什么来获得适当的恢复系数。(???部分)。有人可以帮忙吗?

0 投票
2 回答
1198 浏览

algorithm - 求给定 X、Y 和 Z 向量相对于球体的球体自旋

我在 Lua 中使用 Electro 进行一些 3D 模拟,并且遇到了数学/算法/物理障碍。

我试图弄清楚如何找到在某个轴上旋转的球体的“旋转”。“旋转”是指沿着球体旋转的轴的矢量,其大小相对于它的旋转速度。我需要这些信息的原因是能够通过对球体施加反向扭矩来减慢球体的旋转,直到它停止旋转。

我可以访问的唯一信息是相对于球体的 X、Y 和 Z 单位向量。也就是说,每一帧,我可以调用三个不同的函数,每个函数返回一个单位向量,分别指向球体模型的局部 X、Y 和 Z 轴方向。我可以通过基本上保持每个向量的“先前”值并将其与每帧的“新”值进行比较来跟踪这些变化是如何变化的。那么,问题是我将如何使用这些信息来确定球体的旋转?我难住了。

任何帮助都会很棒。谢谢!