Ray-square intersection 3D

时间:2015-11-13 03:26:17

标签: geometry raycasting

我知道如何计算光线平面交点,但如何测试交点是否在该平面上的正方形内?我正在测试该点是否距离广场中心有一段距离,但我不确定这是否正确。

2 个答案:

答案 0 :(得分:2)

这是一个适用于任何凸多边形的方法: (参见答案末尾的方块简化版)

设p1,p2,p3,p4表示正方形的四个顶点,让q表示射线与支撑平面之间的交点。设n表示 垂直于支撑平面的向量(例如,乘积(p2-p1)x(p3-p1))。

要确定q是否在平方中,请计算以下四个量:

o1=orient(q,p1,p2,n)
o2=orient(q,p2,p3,n)
o3=orient(q,p3,p4,n)
o4=orient(q,p4,p1,n)

其中

orient(a,b,c,n) =  [(b-a) x (c-a)] . n
x: cross product; .: dot product

如果o1,o2,o3和o4具有相同的符号,则q在正方形(p1,p2,p3,p4)

它也适用于任何凸多边形(p1,p2,p3,p4,...,pn)

工作原理:

如果你是2D,你会计算:

o1 = det(p1-q, p2-q)
o2 = det(p2-q, p3-q)
o3 = det(p3-q, p4-q)
o4 = det(p4-q, p1-q)

其中det(v1,v2) = (x1*y2)-(x2*y1)表示两个向量之间的行列式。

在英语中,如果o1,o2,o3,o4具有相同的符号,例如正数,则表示角度(p1,q,p2)为"左转"。如果所有角度(p1,q,p2),(p2,q,p3),(p3,q,p4)和(p4,q,p1)都是左转,则q在多边形内。每当它在外面时,有一个侧面(pi,pj),使得(pi,q,pj)进行"右转"。

现在,如果我们处于3D的任意平面中,就不再有像#34;左转"并且"右转",但是我们可以引入法向量n,并测试(q-p1,q-p2,n)是否是正或负的3D基础(这是{{1}计算)。

广场的特例

计算

orient()

如果X = (q-p1).(p2-p1) / ||(p2-p1)|| Y = (q-p1).(p3-p1) / ||(p3-p1)|| ,那么q就在广场上(参见Mbo的回答)。

答案 1 :(得分:0)

答案取决于您的方块的定义方式。

如果square是轴对齐的,那么检查

就足够了
(P.X >= Square.Left) and (P.X <= Square.Right) and 
(P.Y >= Square.Top) and (P.Y <= Square.Bottom)

如果旋转方形,则将点投影到两个相邻边上并检查它们是否在边缘范围内。