C++ 圆碰撞后的新速度
在圆形台球桌上,台球以一定速度v1与该桌的边界碰撞。此碰撞检测如下:C++ 圆碰撞后的新速度,c++,collision,geometry,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 vel
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
double s=sqrt((p.x-a)*(p.x-a)+(p.y-b)*(p.y-b));
if(sr)//点位于圆外
//将点移回到圆上(我已经有了那个部分)
//计算新速度
现在,如何计算碰撞后的新速度v2,即入射角=反射角(弹性碰撞)
PS:台球由点p(x,y)和速度向量v(x,y)表示。模拟没有摩擦。正如评论所说,这是一个力学问题。 请看一下定义。
“弹性碰撞”一节介绍了您特别想要的内容。假设您正在进行一些简单的(类似游戏的)台球模拟,您可以使用以下内容:
v_new = coeff*(v_old - 2*dot(v_old, boundary_normal)*boundary_normal);
这里,v_old
是当前速度向量,boundary_normal
是圆形台球桌在撞击点处向内的法线。如果您知道圆表的中心c
,并且您有影响点p
,那么正常值就是normalize(c-p)
。也就是说,从c
中减去p
时获得的归一化向量
现在我把coeff
作为介于0(撞击后不再有速度)和1(撞击后相同速度)之间的一个模糊因子。通过确定一个正确的恢复系数,你可以使这在物理上更合理
最后,上面所有的公式都很简单,就像你在基本光线跟踪器中看到的那样。如前所述,这是从精确的物理模拟中提取出来的一个相当粗糙的抽象,但很可能会完成这项工作 这个问题似乎不是C++特有的。事实上,它看起来更像一个数学问题而不是一个编程问题。你的初始速度在哪里?你是如何表示它的?类似于
v_new=coeff*(v_old-2*dot(v_old,boundary_normal)*boundary_normal对于一些严重简化的物理?这是一个力学问题,如果你能说明每个符号代表什么会有所帮助。此外,表格边界是否沿X和Y对齐?它们能吸收能量吗?或者它们是完全有弹性的吗?在最简单的情况下,分别翻转Vx或Vy并计算新的幅值。这应该和碰撞前的一样…基本物理-看:我更新了我的问题,显示了我用你的公式得到的结果。这里面好像有个错误?你的正常状态是错误的。我写了normalize(c-p)。所以你的标准长度永远不会是250。你需要让它正常化。谢谢,你说得对,我忘了。所以现在它适用于我在第一个问题更新中陈述的情况。然而,在其他情况下,速度会增加(见第二次更新)。你得到了什么?你的系数是多少?你的正常值仍然是错误的。如何规范化?我在问题中添加了源代码(在底部)。你能看看出了什么问题吗?我使用1作为系数,以获得碰撞后与碰撞前相同的速度。