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());
希望这是足够的信息.我一直在努力解决这个错误,因为一个很长的时间,现在这个非常大的项目,我已经工作了近两年,这取决于解决这个问题!即使你没有看到我的代码有什么问题,但是有一个替代的策略来寻找冲动 – 我很乐意听到它,因为我恐怕我没有任何想法.
解决方法
例:
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
时间:
我建议计算碰撞发生的时间戳.计算所有物理时间点(预碰撞).那将是你的鬼魂阵地.计算碰撞,包括球的新速度.然后在剩余的时间段(碰撞后)计算所有物理.
方向:
你所描述的实际上对我来说是有意义的(物理学上明智的).如果球向上移动(如果你看着你的图),那么动量的转移会更加向上,你必须对方向做一个小的补偿.正确的方法是写出二维速度在碰撞和位置方向上的公式,并以这种方式工作.