确定线在 3D 中与三角形相交的位置/是否相交 space
Determining where / if line intersects triangle in 3D space
问题
所以基本上我有一堆由 3 个点定义的三角形:
X0, Y0, Z0
X1, Y1, Z1
X2, Y2, Z2
我有两个点连成一条线:
Xl0, Yl0, Zl0
Xl1, Yl1, Zl1
我在space(P)中有一个点定义为:
Xp0, Yp0, Zp0
我首先想知道,如何确定与原直线平行但经过我的新点P的直线的方程?
其次,使用那条新线,我如何确定它是否与我的三角形相交以及在何处相交?
我想尝试创建一个函数,它接受我提供的输入并输出一个点,该点是三角形的交点和一个布尔值(如果确实相交)。
现在我想通过 c# 或 VB .NET 来完成此操作,但实际的解决方案实际上只是基于数学的,因此以数学而不是代码表示的答案肯定也会有所帮助。
我试过的
我认为计算新线只是新点和第二个点
Xnew = Xl0 + (Xp0 - Xl1)
Ynew = Yl0 + (Yp0 - Yp1)
Znew = Zl0 + (Zp0 - Zp1)
然后绘制从 (Xnew, Ynew, Znew) 到 (Xp0, Yp0, Zp0) 的新线应该是与我的第一条线平行的线,但是这样做它们并不平行,这意味着我的计算是错误的.
如有任何帮助,非常感谢!
更新
尝试了下面的建议后,绘制的线条似乎还不正确:
相机到原点的位置是创建第一条线的地方。
我们确定的第二条线是从光标位置到新计算点的线,该线应与从原点到相机的线平行,但如您所见,情况并非如此。我的思维过程有误还是编码不正确?
我的代码按照下面的建议进行计算:
GL.Begin(PrimitiveType.Lines)
GL.Color3(Color.Orange)
Dim XL0, YL0, ZL0 As Single
XL0 = 0
YL0 = 0
ZL0 = 0
'origin is at 0,0,0
Dim XL1, YL1, ZL1 As Single
XL1 = camx
YL1 = camy
ZL1 = camz
Dim XS, YS, ZS As Single
XS = XL1 - XL0
YS = YL1 - YL0
ZS = ZL1 - ZL0
Dim length As Single = Sqrt(XS * XS + YS * YS + ZS * ZS)
XS /= length
YS /= length
ZS /= length
Dim XPN, YPN, ZPN As Single
XPN = returnvec.X - XS * length
YPN = returnvec.Y - YS * length
ZPN = returnvec.Z - ZS * length
GL.Vertex3(XPN, YPN, ZPN)
GL.Vertex3(returnvec.X, returnvec.Y, returnvec.Z)
GL.End()
试验 1
试验 2
I want to know first, how can I determine an equation of the line that
is parallel with the original line, but goes through my new point P?
要获得直线的斜率:
XS = XL1 - XL0;
YS = YL1 - YL0;
ZS = ZL1 - ZL0;
// Find length of new slope
length = Math.Sqrt(XS * XS + YS * YS + ZS * ZS);
// Normalize the new slope
XS /= length;
YS /= length;
ZS /= length;
现在 XS
是一个 Vector3
,它基本上代表了你的线的斜率,你可以对另一条线做同样的事情,你可以通过比较那个斜率和这个斜率来测试,然后反转斜率还有这个。
现在如果你想用这个斜率创建一条新线,并从点 P
和 length
找到点 N
我们这样做:
XPN = XPP + XS * length;
YPN = YPP + YS * length;
ZPN = ZPP + ZS * length;
我画了线,确实是平行的。我认为正在发生的事情是,由于我将这条线视为透视图,它似乎向内收敛。这意味着我创建平行线的数学是正确的,这在技术上是我的问题。然而,平行线不是我需要做的光线投射。
问题
所以基本上我有一堆由 3 个点定义的三角形:
X0, Y0, Z0
X1, Y1, Z1
X2, Y2, Z2
我有两个点连成一条线:
Xl0, Yl0, Zl0
Xl1, Yl1, Zl1
我在space(P)中有一个点定义为:
Xp0, Yp0, Zp0
我首先想知道,如何确定与原直线平行但经过我的新点P的直线的方程?
其次,使用那条新线,我如何确定它是否与我的三角形相交以及在何处相交?
我想尝试创建一个函数,它接受我提供的输入并输出一个点,该点是三角形的交点和一个布尔值(如果确实相交)。
现在我想通过 c# 或 VB .NET 来完成此操作,但实际的解决方案实际上只是基于数学的,因此以数学而不是代码表示的答案肯定也会有所帮助。
我试过的
我认为计算新线只是新点和第二个点
Xnew = Xl0 + (Xp0 - Xl1)
Ynew = Yl0 + (Yp0 - Yp1)
Znew = Zl0 + (Zp0 - Zp1)
然后绘制从 (Xnew, Ynew, Znew) 到 (Xp0, Yp0, Zp0) 的新线应该是与我的第一条线平行的线,但是这样做它们并不平行,这意味着我的计算是错误的.
如有任何帮助,非常感谢!
更新
尝试了下面的建议后,绘制的线条似乎还不正确:
相机到原点的位置是创建第一条线的地方。 我们确定的第二条线是从光标位置到新计算点的线,该线应与从原点到相机的线平行,但如您所见,情况并非如此。我的思维过程有误还是编码不正确?
我的代码按照下面的建议进行计算:
GL.Begin(PrimitiveType.Lines)
GL.Color3(Color.Orange)
Dim XL0, YL0, ZL0 As Single
XL0 = 0
YL0 = 0
ZL0 = 0
'origin is at 0,0,0
Dim XL1, YL1, ZL1 As Single
XL1 = camx
YL1 = camy
ZL1 = camz
Dim XS, YS, ZS As Single
XS = XL1 - XL0
YS = YL1 - YL0
ZS = ZL1 - ZL0
Dim length As Single = Sqrt(XS * XS + YS * YS + ZS * ZS)
XS /= length
YS /= length
ZS /= length
Dim XPN, YPN, ZPN As Single
XPN = returnvec.X - XS * length
YPN = returnvec.Y - YS * length
ZPN = returnvec.Z - ZS * length
GL.Vertex3(XPN, YPN, ZPN)
GL.Vertex3(returnvec.X, returnvec.Y, returnvec.Z)
GL.End()
试验 1
试验 2
I want to know first, how can I determine an equation of the line that is parallel with the original line, but goes through my new point P?
要获得直线的斜率:
XS = XL1 - XL0;
YS = YL1 - YL0;
ZS = ZL1 - ZL0;
// Find length of new slope
length = Math.Sqrt(XS * XS + YS * YS + ZS * ZS);
// Normalize the new slope
XS /= length;
YS /= length;
ZS /= length;
现在 XS
是一个 Vector3
,它基本上代表了你的线的斜率,你可以对另一条线做同样的事情,你可以通过比较那个斜率和这个斜率来测试,然后反转斜率还有这个。
现在如果你想用这个斜率创建一条新线,并从点 P
和 length
找到点 N
我们这样做:
XPN = XPP + XS * length;
YPN = YPP + YS * length;
ZPN = ZPP + ZS * length;
我画了线,确实是平行的。我认为正在发生的事情是,由于我将这条线视为透视图,它似乎向内收敛。这意味着我创建平行线的数学是正确的,这在技术上是我的问题。然而,平行线不是我需要做的光线投射。