Как спроецировать плоский многоугольник на плоскость в 3D-пространстве
-
21-09-2019 - |
Вопрос
Я хочу спроецировать свой многоугольник по вектору на плоскость в трехмерном пространстве.Я бы предпочел использовать для этого одну матрицу преобразования, но я не знаю, как построить матрицу такого типа.
Данный
- параметры плоскости (ax+by+cz+d),
- мировые координаты моего Полигона.Как сказано в заголовке, все вершины моего многоугольника лежат в другой плоскости.
- вектор направления, вдоль которого нужно проецировать мой многоугольник (в настоящее время это вектор нормали плоскости многоугольника)
цель-матрица преобразования 4x4, которая выполняет необходимое проецирование,
или
- некоторое представление о том, как построить его самому
ОБНОВЛЯТЬ
Спасибо за ответ, все работает как задумано.
Предупреждение тем, кто это нашел:Если нормаль плоскости проекции параллельна вектору проекции, знаменатель D станет (почти) равным 0, поэтому, чтобы избежать странных вещей, необходима какая-то обработка для этого особого случая.Я решил эту проблему, проверив, что D < 1e-5, и если да, просто переместите мой многоугольник вдоль вектора выдавливания.
Решение
Предположим, что одна из вершин многоугольника (x0, y0, z0)
, а вектор направления равен (dx,dy,dz)
.
Точка на линии проекции: (x,y,z) = (x0 + t*dx, y0 + t*dy, z0 + t*dz)
.
Вы хотите найти пересечение этой линии с плоскостью, поэтому подставьте ее в уравнение плоскости. ax+by+cz+d = 0
и решим относительно t:
t = (-a*x0 - b*y0 - c*z0 - d) / (a*dx + b*dy + c*dz)
И тогда у вас есть целевая вершина: x = x0+dx*t
, и т. д.
Поскольку это аффинное преобразование, его можно выполнить с помощью матрицы 4x4.Вы должны уметь определять элементы матрицы, написав три уравнения для x,y,z как функции x0,y0,z0 и взяв коэффициенты.
Например, для х:
x = x0 - (a*dx*x0 + b*dx*y0 + c*dx*z0 + d*dx) / D
x = (1 - a*dx/D)*x0 - (b*dx/D)*y0 - (c*dx/D)*z0 - d*dx/D
Где D = a*dx + b*dy + c*dz
является знаменателем сверху.y и z работают аналогично.
Матрица результатов:
1-a*dx/D -b*dx/D -c*dx/D -d*dx/D
-a*dy/D 1-b*dy/D -c*dy/D -d*dy/D
-a*dz/D -b*dz/D 1-c*dz/D -d*dz/D
0 0 0 1
(Примечание:В Direct3D эту матрицу следует транспонировать, поскольку вместо векторов-столбцов используются векторы-строки).