胶囊-射线(线段)交点,二维

时间:2018-09-22 19:49:28

标签: algorithm math collision-detection

我正在为我的游戏编写C ++碰撞检测程序,并试图提出一种算法: 我有一个胶囊,其中定义了两个中心点(C1,C2),长度和半径。然后我有一条定义有两个点(R1,R2)的射线。我已经知道他们是相交的。我只需要找到胶囊(H1-H2)中包含的射线的内部。预先感谢您提供的所有帮助。

image

2 个答案:

答案 0 :(得分:1)

首先让我们看一下图表以供参考:

enter image description here

计算H1H2的过程如下:

  1. 计算射线R与线之间的交点(如果有) 段P1P2。我们只对说谎的十字路口感兴趣 在P1P2内部。对于P3P4同样。从圆心P1P4以及一些矢量数学可以轻松计算出点C1C2。例如。 P1 = C1 + r*nC,其中nC是从C1C2的单位矢量的法线(CCW)。这个 SO上的answer提供了必要的数学运算来确定是否 两个线段之间存在交点,如果存在,则计算参数h,例如 H=R1+h(R2-R1),其中H是交点。此步骤可以产生0、1或2个有效的h值,这取决于射线是与P1P2P3P4都不相交还是相交。
  2. 计算射线与2个射线之间的交点(如果有) 界。同样,SO answer为 射线到圆的交点。每个圆可以产生0、1或2 相交,再次以参数表示。
  3. 如果步骤1和步骤2没有生成有效的h值,则射线不会与胶囊相交。否则,计算hMinhMax,即所有有效参数的最小值和最大值 在步骤1和2中确定的相交处。请注意,在射线与其中一个圆相切且不与hMin==hMaxP1P2相交的情况下,P3P4很有可能。现在可以将所需的交点计算为H1=R1+hMin(R2-R1)H2=R1+hMax(R2-R1)

恐怕我选择的语言是Java而不是C ++,但是希望您能找到我所提供的代码(IDEOne)作为参考。请注意,在计算过程中,double值的舍入导致的健壮性问题没有花力气。

答案 1 :(得分:0)

分析: 在全局坐标系中,定义射线的线性方程式以及胶囊的各个部分,然后进行等式求解。从胶囊的线段开始,因为它们更容易解决。您可以将每个线段类型和相交定位器定义为类,这应该很简单。

数字: 如果可以将胶囊分成三角形,则可以使用Muller-Trumbore方法计算相交点。