我正在使用子弹制作游泳池模拟器,需要准确模拟人类可能的镜头。为了找到应用于母球的冲动,我使用了对象球,口袋中心和母球的位置。
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());
希望这是足够的信息。我一直在努力解决这个错误的时间,现在这个我已经工作了近两年的大项目取决于解决这个问题!即使你没有看到我的代码有什么问题,但有另一种策略来寻找冲动 - 我很乐意听到它,因为我害怕我没有任何想法。
答案 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)
从视觉上看,你看起来并没有考虑进入母球的能量,并且随后会保留在球杆上。
要检查的事项:
错误是什么样的:是随机的还是答案错了?
有效数字
btVector3
可以使用浮点数或双打。浮点数具有~24个二进制数字的精度,看到它们丢失有效数字的速度是多么可怕。 (可能在里面正常化?)你尝试过使用双打吗?祝你好运。