Bullet Physics中HelloWorld例子的结果不符合自由落体定律?

The result of the HelloWorld example in Bullet Physics is not consistent with free-fall law?

我认为 Bullet Physics 的 HelloWorld.cpp 给出了一个自由落体的例子。

为了检查Bullet Physics的结果是否符合物理定律,在HelloWorld.cpp中,我将球体的初始位置从"startTransform.setOrigin(btVector3(2, 10, 0));"更改为"startTransform.setOrigin(btVector3(2, 0, 0));",我将模拟步骤从“//dynamicsWorld->stepSimulation(1.f / 60.f, 10);”更改为至 "dynamicsWorld->stepSimulation(0.1f, 0, 0.1f);"

我想,这两个变化之后,输出将是球体在自由落体运动中的位置,间隔为 0.1 秒。我还在每个模拟步骤输出球体的线速度。结果是: vx, vy, yz, px, py, pz

第一行是初始线速度和位置。我们可以发现,速度符合自由落体定律(即v = g * t),但位置(位移)不符合自由落体定律(即s = g * t * t / 2).

所以,我想知道Bullet Physics是否可靠?还是我弄错了什么?

谢谢!

我对 Bullet 了解不多,但也许我可以提供一些关于物理引擎的一般信息。

物理引擎本质上是数值积分器。它们不会对运动方程产生精确的解析解,而是对每个时间步长的速度进行数值求和以生成位置。 (并在数字上总结 accelerations/forces 以产生速度等)。

从您找到的数字来看,Bullet Physics 似乎正在使用 Euler Method 计算积分。这是计算积分最不准确的方法之一,但它也是最简单的方法之一,无论是理解还是计算。

速度准确,因为加速度恒定,但位置不准确,因为速度不恒定。

Bullet Physics 并非不可靠或错误,它只是使用了一个不是特别准确的近似值;大概是为了在复杂场景下有计算实时结果的性能。

大多数物理引擎(包括 Bullet)使用 semi-implicit Euler 仅一阶准确的积分。自由落体方程是二阶的(y = y0 + vy0*t - 0.5*g*t^2,它有一个 t^2 项)因此半隐式欧拉会引起误差。

总的来说,我不希望物理引擎非常准确(有很多假设和近似值)。但是,根据您的需要,它们可以成为可接受的现实模型。