【发布时间】: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