Я хочу спроектировать свой Полигон вдоль вектора к плоскости в 3-м Пространстве. Я предпочтительно использовал бы единственную матрицу преобразования, чтобы сделать это, но я не знаю, как создать матрицу этого вида.
Данный
цель-a 4x4 матрица преобразования, которая выполняет необходимую проекцию,
или
ОБНОВЛЕНИЕ
Спасибо за ответ, это работает, как предназначено.
Предостережение людям, которые нашли это: Если Плоскость нормальной проекции будет параллельна вектору проекции, то Знаменатель D станет (почти) 0, таким образом, для предотвращения странных вещей от случая некоторая обработка для этого особого случая будет необходима. Я решил его путем проверки, переводят ли D <1e-5, и если так, просто мой полигон вдоль hte вектора экструзии.
Предположим, что одна из вершин многоугольника равна (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:
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 эту матрицу следует транспонировать, поскольку она использует векторы-строки вместо векторов-столбцов).