2015-08-28 5 views
0

Мне нужно проецировать компоненты SlimDX.Vector3 (X, Y и Z) в общую двумерную плоскость (определенную с помощью SlimDX.Plane с 3 Vector3). Обратите внимание, что плоскость является общей, и это не плоскость экрана (иначе можно использовать Vector3.Project). Мне нужно определить матрицу трансформации (или кватернион) из 3D-пространства в 2D-плоскость, но я не знаю, как это сделать. Происхождение плоскости может быть любым, например. первая точка, используемая для определения плоскости.Преобразование координат точки из трехмерного пространства в общую двумерную плоскость в SlimDX

Любой может помочь?

+0

А * как * вы хотите проэктировать? Существует бесконечно много преобразований из трехмерного пространства на двумерную плоскость. –

+0

Чтобы быть более ясным, мне нужны координаты узлов в локальной плоскости, то есть 2D-координаты. Мне нужно построить сетку на этой поверхности, а затем снова получить 3D-координаты (исключая обратную трансформацию). – johnnyontheweb

+0

Это все еще не ясно. Как характеризуется система 2D-координат? –

ответ

0

Я думаю, что вы хотите это разделение точки на плоскости (по нормали), которая дается с

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

Затем вычесть эту сумму вдоль плоскости, перпендикулярной с точки

Vector3 proj = point - h*plane.Normal; 

Результирующая точка должна лежать на плоскости.

+0

Я уже знаю, что точка лежит на этой плоскости. В любом случае, выполняя предложенные вами операции, я получаю те же координаты, что и раньше (я пробовал с плоскостью, определяемой тремя узлами в 3D-пространстве). – 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/

Теперь наступает эта деталь, когда в вашем описании отсутствует информация. Нам нужна локальная ось х на плоскости. Я предполагаю, что эта ось определяется вторым вектором:

Vector3 x = Vector3.Normalize(v2 - v1); 

Затем полученный локальная ось у:

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' (упаковать его в матрицу и преобразовать вектор). –