2015-08-28 91 views
0

我需要在通用2D平面(使用SlimDX.Plane和3 Vector3定義)中投影Slim​​DX.Vector3(X,Y和Z組件)。請注意,飛機是通用的,它不是屏幕平面(否則,可以使用Vector3.Project)。 我需要確定從3D空間到2D平面的轉換矩陣(或四元數),但我不知道如何。 飛機的起源可以是任何東西,例如第一個用於定義飛機的點。將點座標從3D空間轉換爲SlimDX中的通用2D平面

任何人都可以幫忙嗎?

+0

而* *如何你想項目?從3D空間到2D平面有無數次的變換。 –

+0

爲了更清楚,我需要本地平面中的節點座標,即2D座標。我需要在這個表面上建立一個網格,然後再次獲得三維座標(取反相變)。 – johnnyontheweb

+0

現在還不清楚。 2D座標系是如何表徵的? –

回答

0

我想你想要的是一個與

float h = Plane.DotNormal(plane, point); 

給出然後從點減去沿平面法線這一數額的點到平面的分離(沿着正常)

Vector3 proj = point - h*plane.Normal; 

由此產生的觀點應該在飛機上。

+0

我已經知道這一點在於那架飛機。無論如何,執行你所建議的操作,我得到的座標和以前一樣(我嘗試了一個由3D空間中的3個節點定義的平面)。 – johnnyontheweb

+0

那麼你還沒有很好地解釋你正在嘗試做什麼。我以爲你想在飛機上投射一個3D點(這就是我所回答的)。 – ja72

0

你的問題仍然很不清楚。不過,我正在黑暗中嘗試一下。

我們首先計算平面的模型變換(它將位於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/
+0

請說明什麼是M和T ......我可以使用Vector3.Transform嗎? – johnnyontheweb

+0

他們是矩陣。你應該使用'M^-1'(將它打包在一個矩陣中並轉換矢量)。 –