Практическое руководство проектирует плоский полигон на плоскости в 3-м пространстве

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

Данный

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

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

или

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

ОБНОВЛЕНИЕ

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

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

7
задан sum1stolemyname 19 July 2010 в 09:30
поделиться

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:

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

14
ответ дан 6 December 2019 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: