我正在为我的游戏编写C ++碰撞检测程序,并试图提出一种算法: 我有一个胶囊,其中定义了两个中心点(C1,C2),长度和半径。然后我有一条定义有两个点(R1,R2)的射线。我已经知道他们是相交的。我只需要找到胶囊(H1-H2)中包含的射线的内部。预先感谢您提供的所有帮助。
答案 0 :(得分:1)
首先让我们看一下图表以供参考:
计算H1
和H2
的过程如下:
R
与线之间的交点(如果有)
段P1P2
。我们只对说谎的十字路口感兴趣
在P1P2
内部。对于P3P4
同样。从圆心P1
和P4
以及一些矢量数学可以轻松计算出点C1
至C2
。例如。 P1 = C1 + r*nC
,其中nC
是从C1
到C2
的单位矢量的法线(CCW)。这个
SO上的answer提供了必要的数学运算来确定是否
两个线段之间存在交点,如果存在,则计算参数h
,例如
H=R1+h(R2-R1)
,其中H
是交点。此步骤可以产生0、1或2个有效的h
值,这取决于射线是与P1P2
,P3P4
都不相交还是相交。h
值,则射线不会与胶囊相交。否则,计算hMin
和hMax
,即所有有效参数的最小值和最大值
在步骤1和2中确定的相交处。请注意,在射线与其中一个圆相切且不与hMin==hMax
或P1P2
相交的情况下,P3P4
很有可能。现在可以将所需的交点计算为H1=R1+hMin(R2-R1)
和H2=R1+hMax(R2-R1)
。恐怕我选择的语言是Java而不是C ++,但是希望您能找到我所提供的代码(IDEOne)作为参考。请注意,在计算过程中,double
值的舍入导致的健壮性问题没有花力气。
答案 1 :(得分:0)
分析: 在全局坐标系中,定义射线的线性方程式以及胶囊的各个部分,然后进行等式求解。从胶囊的线段开始,因为它们更容易解决。您可以将每个线段类型和相交定位器定义为类,这应该很简单。
数字: 如果可以将胶囊分成三角形,则可以使用Muller-Trumbore方法计算相交点。