我需要在通用2D平面(使用SlimDX.Plane和3 Vector3定義)中投影SlimDX.Vector3(X,Y和Z組件)。請注意,飛機是通用的,它不是屏幕平面(否則,可以使用Vector3.Project)。 我需要確定從3D空間到2D平面的轉換矩陣(或四元數),但我不知道如何。 飛機的起源可以是任何東西,例如第一個用於定義飛機的點。將點座標從3D空間轉換爲SlimDX中的通用2D平面
任何人都可以幫忙嗎?
我需要在通用2D平面(使用SlimDX.Plane和3 Vector3定義)中投影SlimDX.Vector3(X,Y和Z組件)。請注意,飛機是通用的,它不是屏幕平面(否則,可以使用Vector3.Project)。 我需要確定從3D空間到2D平面的轉換矩陣(或四元數),但我不知道如何。 飛機的起源可以是任何東西,例如第一個用於定義飛機的點。將點座標從3D空間轉換爲SlimDX中的通用2D平面
任何人都可以幫忙嗎?
我想你想要的是一個與
float h = Plane.DotNormal(plane, point);
給出然後從點減去沿平面法線這一數額的點到平面的分離(沿着正常)
Vector3 proj = point - h*plane.Normal;
由此產生的觀點應該在飛機上。
我已經知道這一點在於那架飛機。無論如何,執行你所建議的操作,我得到的座標和以前一樣(我嘗試了一個由3D空間中的3個節點定義的平面)。 – johnnyontheweb
那麼你還沒有很好地解釋你正在嘗試做什麼。我以爲你想在飛機上投射一個3D點(這就是我所回答的)。 – ja72
你的問題仍然很不清楚。不過,我正在黑暗中嘗試一下。
我們首先計算平面的模型變換(它將位於x/y平面內的平面轉換爲其實際位置)。你正在尋找的變換是這個矩陣的逆。
我們可以通過查找主體的圖像來構造矩陣。起源很簡單。按照您的指定,原點應映射到第一個點(v1
)。 Z軸也很容易。這是飛機的正常情況。因此,矩陣是:
/. . . . \
M = | . . . . |
| p.Normal.X p.Normal.Y p.Normal.Z 0 |
\ v1.X v1.Y v1.Z 1/
現在來說明你的描述缺乏信息的部分。我們需要在飛機上有一個本地x軸。我認爲該軸是由第二矢量定義:
Vector3 x = Vector3.Normalize(v2 - v1);
然後,將所得本地y軸是:
Vector3 y = Vector3.Normalize(Vector3.Cross(p.Normal, x));
和:
/x.X x.Y x.Z 0 \
M = | y.X y.Y y.Z 0 |
| p.Normal.X p.Normal.Y p.Normal.Z 0 |
\ v1.X v1.Y v1.Z 1/
如前所述,需要這個矩陣'倒過來。因此:
/x.X y.X p.Normal.X 0 \
M^-1 = | x.Y y.Y p.Normal.Y 0 |
| x.Z y.Z p.Normal.Z 0 |
\ -v1.X -v1.Y -v1.Z 1/
更緊湊,因爲你並不需要的第三和第四個維度(雖然這可能不是SDX最方便的表達):
/x.X y.X \
T = | x.Y y.Y |
| x.Z y.Z |
\ -v1.X -v1.Y/
請說明什麼是M和T ......我可以使用Vector3.Transform嗎? – johnnyontheweb
他們是矩陣。你應該使用'M^-1'(將它打包在一個矩陣中並轉換矢量)。 –
而* *如何你想項目?從3D空間到2D平面有無數次的變換。 –
爲了更清楚,我需要本地平面中的節點座標,即2D座標。我需要在這個表面上建立一個網格,然後再次獲得三維座標(取反相變)。 – johnnyontheweb
現在還不清楚。 2D座標系是如何表徵的? –