Geometry 射线正方形交点3D

Geometry 射线正方形交点3D,geometry,raycasting,Geometry,Raycasting,我知道如何计算光线平面交点,但如何测试交点是否在该平面上的正方形内?我正在测试点是否在距离正方形中心的距离内,但我不确定这是否正确。答案取决于正方形的定义 如果正方形与轴对齐,则足以检查 (P.X >= Square.Left) and (P.X <= Square.Right) and (P.Y >= Square.Top) and (P.Y <= Square.Bottom) (P.X>=Square.Left)和(P.X=Square.Top)以及(P.Y这里有

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

答案取决于正方形的定义

如果正方形与轴对齐,则足以检查

(P.X >= Square.Left) and (P.X <= Square.Right) and 
(P.Y >= Square.Top) and (P.Y <= Square.Bottom)

(P.X>=Square.Left)和(P.X=Square.Top)以及(P.Y

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

让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中的任意平面上,不再有“左转”和“右转”这样的东西,但是我们可以引入法向量n,并测试(q-p1,q-p2,n)是正向还是负向的3D基(这是
orient()
计算的)

正方形的特殊情况

计算

X = (q-p1).(p2-p1) / ||(p2-p1)||
Y = (q-p1).(p3-p1) / ||(p3-p1)||

如果
X>=0&&X=0&&Y如果你测试的是一个点到中心的距离,那不是一个半径,即测试一个圆吗?你能为这个测试编辑你的代码吗?非常感谢。正方形的顶点是顺时针还是逆时针的顺序?顺序重要吗?不,顺序对公式来说不重要我已经放弃了。