Преобразование трехмерной плоскости с использованием матрицы 4x4 - PullRequest
16 голосов
/ 07 октября 2011

У меня есть фигура, состоящая из нескольких треугольников, которая расположена где-то в мировом пространстве с масштабированием, вращением, переводом. У меня также есть плоскость, на которую я хотел бы проецировать (ортогональную) форму.

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

Но мне не нужно рисовать проекцию, и вместо этого я хотел бы преобразовать плоскость с помощью матрицы обратного преобразования формы, а затем спроецировать все вершины на плоскость (с обратным преобразованием). Поскольку требуется только один раз преобразовать плоскость, а не каждую вершину.

У моего самолета нормаль (xyz) и расстояние (d). Как мне умножить его на матрицу преобразования 4х4, чтобы получилось нормально?

Можете ли вы создать vec4 как xyzd и умножить его? Или, может быть, создать вектор xyz1 и что тогда делать с d?

Ответы [ 3 ]

25 голосов
/ 10 октября 2011

Вам нужно преобразовать свой самолет в другое представление.Тот, где N - нормаль, а O - любая точка на плоскости.Нормальный ты уже знаешь, это твой (xyz).Точка на плоскости также проста, это ваша обычная N , умноженная на ваше расстояние d .

Преобразование O с помощью матрицы 4x4 внормальным образом, это становится вашим новым O .Вам понадобится Vector4 для умножения на матрицу 4x4, установите для компонента W значение 1 (x, y, z, 1).

Также преобразуйте N с помощью матрицы 4x4, но установитекомпонент W к 0 (x, y, z, 0).Установка компонента W в 0 означает, что ваши нормали не будут переведены.Если ваша матрица состоит из чего-то большего, чем просто перемещение и вращение, тогда этот шаг не так прост.Вместо умножения на вашу матрицу преобразования, вы должны умножить на транспонирование обратной матрицы, т.е. Matrix4.Transpose(Matrix4.Invert(Transform)), есть хорошее объяснение, почему здесь .

Теперь у вас есть новый вектор нормалей N и новый вектор позиций O .Однако, я полагаю, вы хотите это снова в форме xyzd?Нет проблем.Как и раньше, xyz - это ваш обычный N . Осталось только вычислить d.d - расстояние плоскости от начала координат вдоль вектора нормали.Следовательно, это просто скалярное произведение O и N .

Вот оно!Если вы скажете мне, на каком языке вы это делаете, я с радостью наберу его и в коде.

EDIT, в псевдокоде:

Плоскостьvector3 xyz и number d, матрица matrix4x4 M

vector4 O = (xyz * d, 1)
vector4 N = (xyz, 0)
O = M * O
N = transpose(invert(M)) * N
xyz = N.xyz
d = dot(O.xyz, N.xyz)

xyz и d представляют новую плоскость

4 голосов
/ 23 января 2018

Этот вопрос немного устарел, но я хотел бы исправить принятый ответ.
Вам не нужно конвертировать свое представление в самолете.

Любая точка v=(x,y,z,1) лежит на плоскости p=(a,b,c,d), если ax+by+cz+d
Это можно записать в виде точечного произведения: pt v=0

Вы ищете самолет p', преобразованный вашей матрицей 4x4 M.
По той же причине у вас должно быть p't Mv=0

Итак p't Mv=pt v и с некоторыми договоренностями p'=M^T p


TLDR : если p=(a,b,c,d), p' = transpose(inverse(M))*p

2 голосов
/ 07 августа 2017

нотация

  • n - это нормаль, представленная как (1x3) -строчный вектор
  • n' - преобразованная нормаль n в соответствии с матрицей преобразования T
  • (n|d) - это плоскость, представленная как (1x4) вектор-строка (с n нормалью к плоскости и d расстоянием от плоскости до начала координат)
  • (n'|d') - преобразованная плоскость (n|d) в соответствии с матрицей преобразования T
  • T является (4x4) (аффинной) матрицей преобразования больших столбцов (т.е. преобразование вектора-столбца t определяется как t' = T t).

Преобразование нормального n :

n' = n adj(T)

Преобразование плоскости (n | d) :

(n'|d') = (n|d) adj(T)

Здесь adj является адъютатом матрицы, который определяется следующим образом в терминах обратного и определителя матрицы:

T^-1 = adj(T)/det(T)

Примечание

  • Как правило, адъютат не равен обратной матрице преобразования T. Если T включает отражение, det (T) = -1, обращая порядок намотки!

  • Повторно нормализовать n 'математически не требуется (но, возможно, численно, в зависимости от реализации), поскольку определитель учитывает масштабирование. Благодаря Адриану Леонхарду.

  • Вы можете напрямую преобразовать плоскость, не разбирая и не перекомпоновывая плоскость (нормаль и точка).
...