确定3D空间中三角形与三角形相交的位置

时间:2015-09-22 16:40:54

标签: c# vb.net opengl math opentk

问题

所以基本上我有一堆由3个点定义的三角形:

X0, Y0, Z0
X1, Y1, Z1
X2, Y2, Z2

我有两点形成一条线:

Xl0, Yl0, Zl0
Xl1, Yl1, Zl1

我在空间(P)中有一个点定义为:

Xp0, Yp0, Zp0

enter image description here

我想首先知道,我如何确定与原始线平行的线的方程,但是通过我的新点P?

其次,使用这条新线,我如何确定它与三角形相交的位置和位置?

我想尝试创建一个函数,它接受我提供的输入并输出一个点,如果它相交,则输出三角形和布尔值的交点。

现在我想通过c#或VB .NET来实现这个目标,但实际的解决方案实际上只是基于数学的,因此表达为数学而不是代码的答案肯定也会有所帮助。

我尝试了什么

我认为计算新线只是新点,第二点是

Xnew = Xl0 + (Xp0 - Xl1)
Ynew = Yl0 + (Yp0 - Yp1)
Znew = Zl0 + (Zp0 - Zp1)

然后将新线(Xnew,Ynew,Znew)绘制到(Xp0,Yp0,Zp0)应该是我的第一条线的平行线,但是这样做它们不是平行的,这意味着我的计算是错误的。

任何帮助都会非常赞赏!

更新

在尝试下面建议的内容后,绘制的线条似乎不正确:

enter image description here

相机到原点的位置是创建第一行的原因。 我们确定的第二行是从光标位置到新计算点的线,该点应该与从原点到相机的线平行,正如您所看到的那样。我在思考过程中是错误的还是我没有正确编码?

我的代码执行如下建议的计算:

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()

enter image description here

试验1

enter image description here

试验2

2 个答案:

答案 0 :(得分:1)

  

我想首先知道,我怎样才能确定线的方程   与原始线平行,但是经过我的新点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;

现在XSVector3,它基本上代表你的线的斜率,你可以用另一条线做同样的事情,你可以通过比较这个斜率进行测试,然后反斜率到这个一个也是。

现在,如果您要创建一个具有此斜率的新行,并从点NP中找到一个点length,我们会这样做:

XPN = XPP + XS * length;
YPN = YPP + YS * length;
ZPN = ZPP + ZS * length;

答案 1 :(得分:-1)

我绘制线条,它们确实是平行的。我认为正在发生的事情是,因为我将视线视为透视图,所以它似乎向内收敛。这意味着我创建平行线的数学运算是正确的,这在技术上是我的问题。然而,平行线不是我需要做的光线投射。