[英]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
我有一個空間點(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
和length
找到點N
,我們可以這樣做:
XPN = XPP + XS * length;
YPN = YPP + YS * length;
ZPN = ZPP + ZS * length;
我畫了線,它們確實是平行的。 我認為正在發生的事情是,由於我以直線視圖查看該線,因此它似乎向內收斂。 這意味着我創建平行線的數學是正確的,從技術上講這是我的問題。 但是,平行線不是我需要進行射線投射的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.