10

我正在使用子弹制作一个游泳池模拟器,并且需要准确模拟人类可能的镜头。为了找到施加到母球的冲动,我使用了目标球、口袋中心和母球的位置。

常见拍摄场景
(来源:poolplayers.com

在主球的运动路径与目标球相似的情况下(击球角度接近 180 度),一切正常,目标球沉入袋中。但似乎射击路径的角度越大,我产生的脉冲的误差幅度就越大。我已经尝试了很多方法来解决这个问题:调整球的碰撞余量、扩大世界规模、关闭摩擦力和恢复力以及许多其他方法,但似乎没有什么能改变这种行为。

以下是我的代码的相关位:

//assume p = pocket center, b = object ball center, c = cue ball center

//first find the position of the ghost ball, ie the target point of collision for the cue ball
btVector3 ghostPos = b+(b-p).normalize()*(2.0f*BALL_RADIUS);

//then use the normal between the ghostball and cue ball as the impulse, scaled by the shots total distance
btVector3 cueImpulse = (ghostPos-c).normalize()*((p.distance(b)+ghostPos.distance(c))*HIT_RATIO);

//finally apply the impulse to the cueball's center of mass (using general form of applyImpulse to later use rel_pos for english
cueBallBody->applyImpulse(cueImpulse,btVector3());

希望这是足够的信息。我已经为这个错误苦苦挣扎了很长时间,现在这个我已经工作了近两年的非常大的项目取决于解决这个问题!即使您没有看到我的代码有什么问题,但有另一种寻找冲动的策略——我很想听听它,因为我担心我已经没有想法了。

4

2 回答 2

1

如果你想做包括球旋转的复杂物理,那么我推荐台球类型的物理:

例子:

http://www.real-world-physics-problems.com/physics-of-billiards.html

http://archive.ncsa.illinois.edu/Classes/MATH198/townsend/math.html

如果您想要更简单的物理,我建议使用 2D 的“Ball to Ball Collision”或 3D 的“Sphere to Sphere collision”。在谷歌快速搜索,你会发现很多如何实现它的例子。

例子:

http://www.hoomanr.com/Demos/Elastic2/

球对球碰撞 - 检测和处理

时间:

我建议计算发生碰撞的时间戳。计算到那个时间点(碰撞前)的所有物理。那将是你的鬼球位置。计算碰撞,包括球的新速度。然后计算剩余时间段(碰撞后)的所有物理。

方向:

你所描述的对我来说实际上是有意义的(物理方面)。如果球向上移动(如果你看你的图表),那么动量的传递会更向上,你必须在方向上做一个小的补偿。正确的方法是写出碰撞时的 2D 速度和方向位置的公式,然后这样算出来。

更新:简单的方法:在错误的相反方向上围绕碰撞球旋转幽灵球,旋转它的度数是相对于故障/距离的度数。

于 2013-10-24T14:45:58.897 回答
0

从视觉上看,您似乎没有考虑进入母球并随后与母球保持一致的能量。

检查事项:

  1. 错误是什么样的:是随机的还是答案是错误的?

    • 如果向输入添加随机的小值,会发生什么?
    • 如果你通过不同的角度做点图,趋势线是什么样子的?
    • 如果你做一个点图思考不同的距离,趋势是什么?
  2. 有效数字

    • 谷歌告诉我btVector3可以使用浮点数或双精度数。浮点数的精度约为 24 位二进制数字,看到它们丢失有效数字的速度有多快是很可怕的。(可能在 normalize 内部?)您是否尝试过使用双打?
    • 您是否使用不同比例的数字?当您到达极端角度时,您可能会看到 x 坐标或 x 偏移量接近零,并且在进行缩放时,它们可能会在浮点运算中丢失。如果您减去两个几乎完全相同的数字,也会发生这种情况。

祝你好运。

于 2013-10-25T16:37:06.973 回答