Bullet Physics中的HelloWorld示例的结果与自由落体法不一致?

时间:2017-05-10 04:15:43

标签: c++ bulletphysics

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

为了检查Bullet Physics的结果是否与物理定律一致,在HelloWorld.cpp中,我从“startTransform.setOrigin(btVector3(2,10,0))”改变了球体的初始位置;“ to“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是否可靠?或者我弄错了什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

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

物理引擎本质上是数值积分器。它们不能对运动方程产生精确的解析解,而是在数值上总结每个时间步的速度以生成位置。 (并用数字总结加速度/力来产生速度等)。

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

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

子弹物理学不是不可靠或错误的,它只是使用一种不是特别准确的近似值;大概是为了能够在复杂场景中计算实时结果。

答案 1 :(得分:0)

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

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