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