C++ 求解台球铅球脉冲轨迹

C++ 求解台球铅球脉冲轨迹,c++,math,physics,bulletphysics,billiards,C++,Math,Physics,Bulletphysics,Billiards,我正在使用bullet制作一个游泳池模拟器,需要精确地模拟人类可能的射击。为了找到应用于主球的冲动,我使用了目标球、口袋中心和主球的位置 (来源:) 在主球的运动路径类似于目标球(击球角度接近180度)的情况下,一切正常,目标球沉入口袋。但是看起来,射程的角度越大,我产生的脉冲的误差就越大。我尝试了很多方法来解决这个问题:调整球的碰撞边界,扩大世界范围,关闭摩擦和恢复,以及其他很多方法,但似乎没有任何东西能改变这种行为 以下是我代码的相关部分: //assume p = pocket cent

我正在使用bullet制作一个游泳池模拟器,需要精确地模拟人类可能的射击。为了找到应用于主球的冲动,我使用了目标球、口袋中心和主球的位置


(来源:)

在主球的运动路径类似于目标球(击球角度接近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());

希望这是足够的信息。我已经和这个bug斗争了很长一段时间,现在这个我已经工作了将近两年的非常大的项目取决于解决这个问题!即使你看不出我的代码出了什么问题,但我有一个寻找冲动的替代策略——我很想听听,因为我恐怕我已经没有什么想法了。

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

例如:

如果你想要更简单的物理,我建议2D使用“球到球的碰撞”,3D使用“球到球的碰撞”。在谷歌上快速搜索,你会发现很多关于如何实现它的例子

示例:

时间:

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

方向:

你所描述的对我来说是有意义的。如果球向上移动(如果你看图表),那么动量的传递将更向上,你必须在方向上做一个小的补偿。正确的方法是写出碰撞时二维速度的公式,以及与方向的位置,然后用这种方法计算出来

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

从视觉上看,你似乎没有考虑进入主球并随后与主球保持在一起的能量

检查事项:

  • 错误是什么样子的:是随机的还是答案错了

    • 如果将随机小值添加到输入,会发生什么
    • 如果从不同角度绘制点图,趋势线是什么样子的
    • 如果你做一个不同距离的点图,趋势是什么
  • 有效数字

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

  • 祝你好运。

    如果球杆位于球心左侧,足以把球打乱,那么目标球是否总是从洞的左侧(或右侧)移动?你认为它与错误有关的建议表明它将随机地传递给任何一方。但是如果球总是向同一侧移动,则会发生其他情况。与直杆的角度越大或越小,目标球转向的距离就越远。所有角度较大的球都会转向同一方向,角度较小的球转向相反方向。然后试着将球杆的角度向左或向右移动一点。根据角度(或反比)按比例移动,并根据主球所在的球的侧面向左或向右移动。看看你是否能找到一个小的调整来修复它。这是一个好主意,值得一试!在昨晚读了一些书之后,我有一种潜移默化的怀疑,这和当地和世界空间有关。applyImpulse使用世界空间作为冲量,但我的计算可能与2个球和目标袋的特定系统有关?尽管如此,我还是会尝试你的解决方法,让你知道,非常感谢你的帮助,我已经在5个不同的论坛上问过这个问题,你是唯一一个回答我的人!你看了吗?这些都是关于编写我自己的物理实现的好建议,我已经用“真实世界物理”作为参考,非常权威的文章!但我不能把它作为解决方案,因为我在问如何解决我的子弹物理问题。很抱歉但是谢谢你的好消息。我理解,欢迎你。我尽我所能去帮助别人。我的经验是,你需要了解基本的物理和数学知识,才能实现逼真的物理模拟。物理学的好处在于,如果你在没有“黑客”的情况下做它,它会自己处理你扔给它的所有东西。祝你好运,好好享受。我不知道你是否注意到了,但我更新了解决方案。希望能有帮助。