C# 确定直线在三维空间中与三角形相交的位置/位置

C# 确定直线在三维空间中与三角形相交的位置/位置,c#,vb.net,opengl,math,opentk,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 首先,我想知道,如何确定一条平行于原始直线,但经过新点p的直线方程 第二,使用这条新线,我如何确定它在三角形上是否相交以及在哪里相交 我想尝试创建一个函数,该函数接受我提供的输入,并输出一个点,该点是三角形的交点,如果它相交,则输出一个布尔值

问题

基本上我有一组三角形,由3个点定义:

X0, Y0, Z0
X1, Y1, Z1
X2, Y2, Z2
我有两个点组成一条线:

Xl0, Yl0, Zl0
Xl1, Yl1, Zl1
我有一个空间点(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

首先,我想知道,怎样才能确定一个直线方程 与原始直线平行,但通过我的新点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
长度中找到一个点
N
,我们会:

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

我画了线,它们确实是平行的。我认为现在发生的是,因为我把这条线看作是一个透视图,它似乎向内收敛。这意味着我创建平行线的数学是正确的,这在技术上是我的问题。然而,平行线不是我需要做光线投射的东西

Yp1和Zp1的定义在哪里?如果你需要数学方面的帮助,也许你应该从方程开始,找到第二个点是正确的。您的编码方式或打印结果的方式一定有错误。@Darryl我已更新了我的问题以显示我的代码。有些事情似乎仍然不对劲。有什么建议吗?看一看通过此代码的特定过程的一组具体值。两条结果线在数学上是平行的吗?现在先别管图形了,只需从数学上检查一下就可以了。这就回答了第一个问题。对第二个问题有什么建议吗?不幸的是,没有,这也是我想弄清楚的,这个问题的数学变得非常复杂。我试过你说的,什么对我来说也有意义,但结果不是平行线。请看我对我的问题的更新。你从中得到了什么?不,如果它不是一条平行线,我想知道它是什么?是随机的吗?不是平行而是一致的?