Ваш вопрос по-прежнему остается неясным. Тем не менее, я пытаюсь выстрелить в темноте.
Начнем с вычисления модельного преобразования для плоскости (которая преобразует плоскость, лежащую в плоскости 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/
А * как * вы хотите проэктировать? Существует бесконечно много преобразований из трехмерного пространства на двумерную плоскость. –
Чтобы быть более ясным, мне нужны координаты узлов в локальной плоскости, то есть 2D-координаты. Мне нужно построить сетку на этой поверхности, а затем снова получить 3D-координаты (исключая обратную трансформацию). – johnnyontheweb
Это все еще не ясно. Как характеризуется система 2D-координат? –