Как спроецировать плоский многоугольник на плоскость в 3d-пространстве
Я хочу проецировать свой многоугольник вдоль вектора на плоскость в трехмерном пространстве. Я бы предпочел использовать для этого одну матрицу преобразования, но я не знаю, как построить такую матрицу.
Дано
- параметры плоскости (ax+by+cz+d),
- мировые координаты моего полигона. Как указано в заголовке, все вершины моего многоугольника лежат в другой плоскости.
- вектор направления, по которому проецируется мой многоугольник (в настоящее время вектор нормали плоскости многоугольника)
цель- матрица преобразования 4х4, которая выполняет требуемую проекцию,
или же
- некоторое представление о том, как создать его самому
ОБНОВИТЬ
Спасибо за ответ, все работает как задумано.
Слово предостережения для людей, которые нашли это: если плоскость нормали проекции параллельна вектору проекции, знаменатель D станет (почти) 0, поэтому, чтобы избежать странных вещей, какая-то обработка для этого особого случая нужно. Я решил это, проверив, D < 1e-5, и если так, просто переведите мой многоугольник вдоль вектора экструзии.
1 ответ
Предположим, что одна из вершин многоугольника (x0, y0, z0)
и вектор направления (dx,dy,dz)
,
Точка на линии проекции: (x,y,z) = (x0 + t*dx, y0 + t*dy, z0 + t*dz)
,
Вы хотите найти пересечение этой линии с плоскостью, поэтому включите ее в уравнение плоскости ax+by+cz+d = 0
и решить для т:
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 эта матрица должна быть транспонирована, поскольку вместо векторов столбцов используются векторы строк).