c – 解决台球射击冲击轨迹

前端之家收集整理的这篇文章主要介绍了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

时间:

我建议计算碰撞发生的时间戳.计算所有物理时间点(预碰撞).那将是你的鬼魂阵地.计算碰撞,包括球的新速度.然后在剩余的时间段(碰撞后)计算所有物理.

方向:

你所描述的实际上对我来说是有意义的(物理学上明智的).如果球向上移动(如果你看着你的图),那么动量的转移会更加向上,你必须对方向做一个小的补偿.正确的方法是写出二维速度在碰撞和位置方向上的公式,并以这种方式工作.

更新:简单的方法:将碰撞球周围的鬼球沿着错误的相反方向旋转,其旋转度相对于故障/距离的程度.

原文链接:https://www.f2er.com/c/112795.html

猜你在找的C&C++相关文章