圆碰撞后的新速度

时间:2011-12-08 10:13:39

标签: c++ collision geometry

在圆形台球桌上,台球以一定的速度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)。模拟无摩擦

2 个答案:

答案 0 :(得分:3)

假设您正在制作一些简单的(类似游戏)台球模拟,您可以使用以下内容:

v_new = coeff*(v_old - 2*dot(v_old, boundary_normal)*boundary_normal);

此处v_old是您当前的速度矢量,而boundary_normal是您的圆形台球桌在撞击点的向内指向法线。如果您知道圆形表格的中心c,并且您有影响点p,则法线只是normalize(c-p)。也就是说,从p中减去c时获得的归一化向量。

现在我已经将coeff作为一个软弱因子,介于0(冲击后完全没有速度)和1(冲击后相同的速度)之间。通过确定正确的恢复系数,您可以使其在物理上更合理。

最后,上面的所有公式都是简单的reflection,就像您在基本的光线跟踪器中看到的那样。如上所述,这是一个相当粗略的抽象,来自精确的物理模拟,但很可能会完成这项工作。

答案 1 :(得分:0)

正如评论所说,这是一个机械问题。 看看momentum定义。 您特别想要的是弹性碰撞部分。