0xAA55 发表于 2016-9-8 21:14:45

【几何】射线与简单几何体交点的运算方法

我写这个是为了总结最近做物理引擎时发现的一些诀窍而写。内容并不细致入微。为了锻炼读者的脑力,我只是大致点拨了一下。详细的请自己脑补。

1、射线与平面的交点的运算

上图是射线与直线交点的计算。
图中向量PD为单位向量,指向射线方向。图中绿色线段PR的长度为射线端点到黑色直线的距离。
PN长度为(PD·PR)÷|PR|,即向量PD与PR的点积除以PR长度。
三角形PDN与三角形PIR互为相似三角形,则PI的长度等于|PR|÷|PN|×|PD|
那么交点I的坐标大家可以自己算出。
上述是2D世界计算射线与直线交点的运算。对于3D世界的射线与平面交点的运算也是同理。大家自己脑补。

2、射线与球体的第一个交点的运算。

P:射线端点
S:球心
如果PS的长度小于球体直径则射线端点在球体内,那么严格说,此时的交点在P点上。
直线PA为射线方向。
取PA方向的单位向量,与PS向量计算点积,即可获得PA的长度。
通过上述方法计算出的PA长度如果小于0,那么射线的方向不指向球体。
已知三角形PAS为直角三角形,则SA的长度可以通过勾股定理计算出来(|PS|的平方-|PA|的平方,得到|SA|的平方)
然后图中翔色线段SI的长度是球体的半径。SA的长度不能超过球体半径,否则射线与球体不相交。
已知三角形SAI为直角三角形,则AI可通过勾股定理计算出来。
PA的长度知道了,AI的长度知道了,那么PI的长度也能轻易算出。由此就可以计算出相交点与射线端点的距离就是PI。
至于如何计算I的坐标我就不说了。大家自己脑补。
实现这个功能的代码大家自己写。

3、射线与长方体交点的运算。

我已经说过计算射线与平面的交点到射线端点的距离的方法。这个方法可以用在这里。图中是射线与长方形交点的运算。大家可以看成射线与长方体交点的运算。
取得长方体面向射线端点P的三个面和背朝射线端点P的三个面,延伸为6个平面。如上图所示,在2D世界,长方形的边被延长为直线,可以理解为3D世界长方体的面被延伸为平面。可以把图中绿线理解为面向射线端点P的“面”延伸为“平面”,蓝线为背朝射线端点P的“面”延伸为“平面”。
然后计算出射线射中各个平面的交点到射线端点P的距离。
其中面向射线端点P的三个平面,每个面都有一个点在射线上,也就有三个点。计算出这三个点中,距离射线端点最远的点,如图中所示I2。同理,在背朝射线端点P的三个平面上也共有三个点在射线上。计算出距离射线端点P最近的点,如图中所示I3。
如果P到I2的距离不大于P到I3的距离,则这条射线与这个长方体有交点,交点在I2上。否则,没有交点。

watermelon 发表于 2019-8-25 23:53:48

屌,小弟我刚刚发现求交点这个问题这么难搞,到论坛里搜索一下,发现果然之前就有讨论过这个了!
页: [1]
查看完整版本: 【几何】射线与简单几何体交点的运算方法