Преобразование координат точки из трехмерного пространства в общую двухмерную плоскость в SlimDX
Мне нужно спроектировать SlimDX.Vector3 (компоненты X, Y и Z) в общей 2D-плоскости (определенной с SlimDX.Plane, с 3 Vector3). Обратите внимание, что плоскость является общей и не является плоскостью экрана (в противном случае можно использовать Vector3.Project). Мне нужно определить Матрицу Транформации (или Кватернион) из трехмерного пространства в двухмерную плоскость, но я не знаю как. Начало плоскости может быть любым, например, первая точка, используемая для определения плоскости.
Кто-нибудь может помочь?
2 ответа
Я думаю, что вы хотите, это разделение точки на плоскости (по нормали), которая дается с
float h = Plane.DotNormal(plane, point);
Затем вычтите это количество вдоль плоскости нормали от точки
Vector3 proj = point - h*plane.Normal;
Полученная точка должна лежать на плоскости.
Ваш вопрос все еще очень неясен. Тем не менее, я пытаюсь выстрел в темноте.
Давайте начнем с вычисления модельного преобразования для плоскости (которая преобразует плоскость, лежащую в плоскости 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);
Тогда результирующая локальная ось 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 /