c – 解决台球射击冲击轨迹
我正在使用子弹制作游泳池模拟器,需要准确地模拟人为可能的镜头.要找到应用于提示球的冲动,我使用对象球,口袋中心和提示球的位置.
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 时间: 我建议计算碰撞发生的时间戳.计算所有物理时间点(预碰撞).那将是你的鬼魂阵地.计算碰撞,包括球的新速度.然后在剩余的时间段(碰撞后)计算所有物理. 方向: 你所描述的实际上对我来说是有意义的(物理学上明智的).如果球向上移动(如果你看着你的图),那么动量的转移会更加向上,你必须对方向做一个小的补偿.正确的方法是写出二维速度在碰撞和位置方向上的公式,并以这种方式工作. 更新:简单的方法:将碰撞球周围的鬼球沿着错误的相反方向旋转,其旋转度相对于故障/距离的程度. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |