Как спроецировать плоский многоугольник на плоскость в 3D-пространстве

StackOverflow https://stackoverflow.com/questions/2500499

Вопрос

Я хочу спроецировать свой многоугольник по вектору на плоскость в трехмерном пространстве.Я бы предпочел использовать для этого одну матрицу преобразования, но я не знаю, как построить матрицу такого типа.

Данный

  • параметры плоскости (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 эту матрицу следует транспонировать, поскольку вместо векторов-столбцов используются векторы-строки).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top