在圆形台球桌上,台球以速度 v1 与台球边界碰撞。该碰撞检测如下:
double s = sqrt( (p.x-a)*(p.x-a) + (p.y-b)*(p.y-b) );
if (s<r) // point lies inside circle
// do nothing
else if (s==r) // point lies on circle
// calculate new velocity
else if (s>r) // point lies outside circle
// move point back onto circle (I already have that part)
// calculate new velocity
现在怎样才能碰撞后的新速度 v2进行计算,使得入射角=反射角(弹性碰撞)?
PS:台球由点 p(x,y) 和速度向量 v(x,y) 表示。模拟是无摩擦.
假设您正在制作一些简单的(类似游戏的)台球模拟,您可以使用以下内容:
v_new = coeff*(v_old - 2*dot(v_old, boundary_normal)*boundary_normal);
Here v_old
是你当前的速度矢量boundary_normal
是圆形台球桌在撞击点的向内指向法线。如果你知道中心c
你的圆桌和你有影响点p
那么正常的就是normalize(c-p)
。也就是说,减去时得到的归一化向量p
from c
.
现在我已经采取了coeff
是介于 0(撞击后不再有速度)和 1(撞击后速度相同)之间的模糊因子。您可以通过确定正确的恢复系数来使这一点在物理上更加合理。
最后,上面的所有公式都很简单反射例如,正如您可能在基本光线追踪器中看到的那样。如前所述,这是对精确物理模拟的相当粗略的抽象,但很可能可以完成这项工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)