解决台球射击冲动轨迹

时间:2013-10-16 17:27:55

标签: c++ math physics bulletphysics billiards

我正在使用子弹制作游泳池模拟器,需要准确模拟人类可能的镜头。为了找到应用于母球的冲动,我使用了对象球,口袋中心和母球的位置。

Common shot scenario http://www.poolplayers.com/wp-content/uploads/2013/03/372-TangentLine-2.jpg

在母球的运动路径类似于物体球(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());

希望这是足够的信息。我一直在努力解决这个错误的时间,现在这个我已经工作了近两年的大项目取决于解决这个问题!即使你没有看到我的代码有什么问题,但有另一种策略来寻找冲动 - 我很乐意听到它,因为我害怕我没有任何想法。

2 个答案:

答案 0 :(得分:1)

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

示例:

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的“球体到球体碰撞”。在Google中快速搜索,您会发现很多如何实现它的示例。

示例:

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

Ball to Ball Collision - Detection and Handling

时间:

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

方向:

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

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

答案 1 :(得分:0)

从视觉上看,你看起来并没有考虑进入母球的能量,并且随后会保留在球杆上。

要检查的事项:

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

    • 如果您在输入中添加随机小值,会发生什么?
    • 如果您通过各种角度绘制点图,趋势线是什么样的?
    • 如果你做了各种距离的点图,那么趋势是什么?
  2. 有效数字

    • Google告诉我btVector3可以使用浮点数或双打。浮点数具有~24个二进制数字的精度,看到它们丢失有效数字的速度是多么可怕。 (可能在里面正常化?)你尝试过使用双打吗?
    • 您使用的是不同规模的数字吗?当你到达极端角度时,你可能会看到x坐标或x偏移接近零并且做缩放它们可能会在浮点运算中丢失。如果你减去几乎完全相同的两个数字也会发生。
  3. 祝你好运。