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

Другие вопросы по тегам