У меня есть плоскость в трехмерном пространстве, состоящая из трех точек. , ,
Я хочу повернуть и преобразовать эти точки (в равной степени связанную плоскость) в 2D-пространство (избегая оси, но сохранить расстояние и отношения в 2D-плоскости).
В качестве первого шага я бы переехал к началу координат, так что точки становятся , , . Оттуда это просто вопрос применения матрицы вращения.
Матрица вращения который сохраняет все расстояния и формы и т.д.
где векторы для ортогональны и имеют единичную длину, т.е.
Применение , ваши повернутые точки даны
Предлагаю сделать верхний ряд единичный вектор в направлении от к , т.е.
что означало бы, что строка из к отображается в -ось.
Решите, что вы могли бы использовать для второго и третьего рядов теперь остается решить несколько простых линейных уравнений, чтобы убедиться, что линия от к не имеет z-компоненты.
Чтобы решить для , вектор должен иметь нулевое скалярное произведение с обоими и , поэтому уравнения
Следовательно
для некоторых , которую следует определить так, чтобы есть вектор единичной длины. Окончательно можно определить как вектор, перпендикулярный обоим и , т.е.
где снова определяется так, что есть вектор единичной длины.
Как предполагает принятый ответ, сначала примените перевод ко всем точкам. Тогда ваши три очка и (где и ). Теперь вычислите нормальную единицу плоскости:
Чтобы повернуть плоскость на самолет, все, что вам нужно сделать, это повернуть к . Самый простой способ сделать это - повернуть о ось в плюс половина плоскости, а затем вращаться вокруг оси до параллельно положительному ось.
Вы также можете использовать формулу вращения Родригеса для вращения вокруг оси но эта матрица вращения намного сложнее, чем матрица вращения вокруг координатной оси.
Вычисление матрицы вращения, которая вращается о ось в плюс половина плоскость не требует вычисления угла. Матрица вращения просто задается в терминах :
Похоже, вам было бы полезно узнать, как представлять направление в 3D с помощью вектора направления. Это влечет за собой изучение того, как нормализовать вектор до единичной длины, что приводит к вектору направления.
Затем, как только вы освоитесь с этим, научитесь определять ориентацию (направление, перпендикулярное) плоскости трехмерного треугольника:
o <-- normalize[(P2-P1) x (P3-p2)] (vector cross product of 2 vector diffs)
Теперь вы хотите определить желаемое вращение 3D-координат, которое выравнивает ориентацию вашей плоскости треугольника с осью z. Опять же, используя перекрестные произведения, это 3 столбца матрицы вращения 3x3, которые вам нужны:
R = [ newXaxis newYaxis newZaxis ] (три ортогональных вектора направления)
По своему выбору вы выбираете значение o как newZaxis.
Две другие новые оси должны быть ортогональны оси newZ и друг другу. Нормализованное векторное векторное произведение дает взаимное ортогональное направление любым двум различным направлениям d1 и d2 (если они не совпадают или не противоположны):
новая ось X = нормализовать (новая ось X [ 1 0 0 ] )
(если newZaxis == [ 1 0 0 ], вместо этого используйте newXaxis = normalize(newZaxis x [ 0 1 0 ] )
новая ось Y = новая ось Z x новая ось Y
Теперь координатно поверните каждую точку вашего треугольника с помощью вращателя R:
p1' <-- R • p1 (вектор, умноженный на матрицу)
p2' <-- R • p2
p3' <-- R • p3
Вы заметите, что точки p1', p2' и p3' имеют одинаковые z-координаты. Вы можете выбросить их и просто использовать их координаты x и y. Вы фактически спроецировали свой треугольник на двухмерную плоскость xy.
Дэрил
пбьер