我正在编程一个C++碰撞检测在我的游戏,我试图提出一个算法:
我有一个胶囊定义为两个中心点(c1,c2),长度和半径。然后我定义了一条有两点的射线(r1,r2)。我已经知道它们相交了我只需要找到胶囊(H1-H2)中射线的内部提前谢谢你的帮助。
最佳答案
首先让我们看一张图表作为参考:
计算H1
和H2
的步骤如下:
计算光线R
与直线之间的交点(如果有的话)
段P1P2
。我们只对说谎的十字路口感兴趣
在P1P2
内部类似地,对于P3P4
。从圆心,P1
和P4
以及一些向量数学可以很容易地计算出C1
到C2
的点。例如P1 = C1 + r*nC
,其中nC
是从C1
到C2
的单位向量的正常值(CCW)这个
answer打开,提供必要的数学计算,以确定
交叉点存在于两个线段之间,如果是,计算参数h
在这里,H=R1+h(R2-R1)
是一个交点此步骤可以生成0、1或2个有效的H
值,具体取决于光线是否与h
、P1P2
中的任何一个或两者相交。
计算光线和两个光线之间的交点(如果有的话)
圈子。同样,soanswer提供了
射线到圆的交叉点。每个圆可以产生0、1或2
交叉点,再一次用参数表示。
如果步骤1和2没有生成有效的P3P4
值,则光线不会与胶囊相交。否则,计算h
和hMin
,所有有效的最小和最大参数值
步骤1和2中确定的交叉口注意,在光线与其中一个圆相切且不相交的情况下,有可能hMax
。现在可以将所需的交点计算为hMin==hMax
和P1P2
。
恐怕我选择的语言是Java而不是C++,但希望你会发现我把这些代码(IDEOne)放在一起作为参考。请注意,在计算过程中没有努力处理由P3P4
值舍入引起的健壮性问题。
关于algorithm - 胶囊-射线(线段)交点,二维,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52460308/