【问题标题】:Solving Billiard Shot Impulse Trajectory求解台球击球脉冲轨迹
【发布时间】:2013-10-16 17:27:55
【问题描述】:

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


(来源: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());

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

【问题讨论】:

  • 如果球杆在中心的左侧足以弄乱目标球是否总是在洞的左侧(或右侧)?您认为它与错误有关的建议表明它会随机出现在任何一方。但如果它总是向同一边发展,那么就会发生其他事情。
  • 直射角度越大或越小,目标球转向越远。并且所有角度较大的镜头都将转向同一方向,而角度较小的镜头则朝相反的方向转向。
  • 然后尝试将球杆的角度稍微向左或向右移动。与角度(或反比)成比例移动,并根据母球所在的球侧向左或向右移动。看看你能不能找到一个小的调整来解决它。
  • 这是个好主意,值得一试!昨晚读了一些书后,虽然我偷偷怀疑这与本地和世界空间有关。 applyImpulse 将世界空间用于脉冲,但也许我的计算与 2 个球和目标口袋的特定系统有关?尽管如此,我会尝试您的解决方法并让您知道,非常感谢您的帮助,我已经在 5 个不同的论坛上问过这个问题,而您是唯一一个回答我的人!

标签: c++ math physics bulletphysics billiards


【解决方案1】:

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

例子:

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

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

如果您想要更简单的物理,我建议使用 2D 的“球对球碰撞”或 3D 的“球对球碰撞”。在 Google 中快速搜索一下,你会发现很多如何实现它的示例。

例子:

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

Ball to Ball Collision - Detection and Handling

时间:

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

方向:

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

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

【讨论】:

  • 这些是编写我自己的物理实现的好建议,我已经使用“真实世界物理”作为参考,非常权威的文章!但我不能将此标记为解决方案,因为我在问如何解决我的子弹物理问题。对不起!但是感谢您提供的好信息。
  • 我理解,欢迎您。我尽力提供帮助。我的经验是,您需要了解基础物理和数学才能实现逼真的物理模拟。物理学的好处在于,如果你不使用“黑客”来做它,它会自行处理你扔给它的所有东西。祝你好运,尽情享受。
  • 不知道你有没有注意到,但我对解决方案进行了更新。希望对您有所帮助。
【解决方案2】:

从视觉上看,您似乎没有考虑进入母球并随后留在母球上的能量。

检查事项:

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

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

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

祝你好运。

【讨论】:

    猜你喜欢
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    相关资源
    最近更新 更多