Как спроецировать плоский многоугольник на плоскость в 3d-пространстве - PullRequest
7 голосов
/ 23 марта 2010

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

С учетом

  • параметры самолета (ax + by + cz + d),
  • мировые координаты моего многоугольника. Как указано в заголовке, все вершины моего многоугольника лежат в другой плоскости.
  • вектор направления, по которому проецируется мой многоугольник (в настоящее время - нормальный вектор плоскости многоугольника)

цель - матрица преобразования 4x4, которая выполняет требуемую проекцию,

или

  • некоторое представление о том, как создать его самому

UPDATE

Спасибо за ответ, все работает как задумано.

Слово предостережения людям, нашедшим это: если плоскость нормали проекции параллельна вектору проекции, знаменатель D станет (почти) 0, поэтому, чтобы избежать странных вещей, нужно что-то делать для этот особый случай необходим. Я решил это, проверив, D <1e-5, и если так, просто переведите мой многоугольник вдоль вектора экструзии. </p>

1 Ответ

13 голосов
/ 23 марта 2010

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

...