Повернуть 3D-плоскость

У меня есть плоскость в трехмерном пространстве, состоящая из трех точек. п 1 "=" ( Икс 1 , у 1 , г 1 ) , п 2 "=" ( Икс 2 , у 2 , г 2 ) , п 3 "=" ( Икс 3 , у 3 , г 3 )

Я хочу повернуть и преобразовать эти точки (в равной степени связанную плоскость) в 2D-пространство (избегая г оси, но сохранить расстояние и отношения в 2D-плоскости).

Чтобы уточнить, вы хотите повернуть плоскость, содержащую точки п 1 , п 2 , п 3 в Икс у самолет.
Нужно только повернуть плоскость в плоскость, параллельную плоскости xy. (Если плоскость находится на каком-либо расстоянии от начала координат, то ее невозможно будет повернуть в плоскость x=y, проходящую через начало координат). После поворота параллельно плоскости xy все координаты z в исходной плоскости будут одинаковыми, и их можно будет игнорировать, что сделает плоскость двумерной.

Ответы (3)

В качестве первого шага я бы переехал п 1 к началу координат, так что точки становятся п 1 "=" ( 0 , 0 , 0 ) , п 2 "=" ( Икс 2 Икс 1 , у 2 у 1 , г 2 г 1 ) , п 3 "=" ( Икс 3 Икс 1 , у 3 у 1 , г 3 г 1 ) . Оттуда это просто вопрос применения матрицы вращения.

Матрица вращения р который сохраняет все расстояния и формы и т.д.

р "=" ( е 1 Икс е 2 Икс е 3 Икс е 1 у е 2 у е 3 у е 1 г е 2 г е 3 г )

где векторы ( е 1 α , е 2 α , е 3 α ) для α е { Икс , у , г } ортогональны и имеют единичную длину, т.е.

я "=" 1 3 е я α е я β "=" { 1 α "=" β 0 α β .

Применение р , ваши повернутые точки п я "=" ( Икс я , у я , г я ) даны

( Икс я у я г я ) "=" р ( Икс я у я г я )

Предлагаю сделать верхний ряд р единичный вектор в направлении от п 1 к п 2 , т.е.

( е 1 Икс е 2 Икс е 3 Икс ) "=" 1 ( Икс 1 Икс 2 ) 2 + ( у 1 у 2 ) 2 + ( г 1 г 2 ) 2 ( Икс 1 Икс 2 у 1 у 2 г 1 г 2 )

что означало бы, что строка из п 1 к п 2 отображается в Икс -ось.

Решите, что вы могли бы использовать для второго и третьего рядов р теперь остается решить несколько простых линейных уравнений, чтобы убедиться, что линия от п 1 к п 3 не имеет z-компоненты.

Чтобы решить для ( е 1 г , е 2 г , е 3 г ) , вектор е я г должен иметь нулевое скалярное произведение с обоими е я Икс и ( Икс 3 Икс 1 , у 3 у 1 , г 3 г 1 ) , поэтому уравнения

е 1 Икс е 1 г + е 2 Икс е 2 г + е 3 Икс е 3 г "=" 0 ( Икс 3 Икс 1 ) е 1 г + ( у 3 у 1 ) е 2 г + ( г 3 г 1 ) е 3 г "=" 0

Следовательно

( е 1 г е 2 г е 3 г ) "=" λ г ( ( г 3 г 1 ) е 2 Икс ( у 3 у 1 ) е 3 Икс ( Икс 3 Икс 1 ) е 3 Икс ( г 3 г 1 ) е 1 Икс ( у 3 у 1 ) е 1 Икс ( Икс 3 Икс 1 ) е 2 Икс )

для некоторых λ г , которую следует определить так, чтобы е я г есть вектор единичной длины. Окончательно е я у можно определить как вектор, перпендикулярный обоим е я Икс и е я г , т.е.

( е 1 у е 2 у е 3 у ) "=" λ у ( е 3 г е 2 Икс е 2 г е 3 Икс е 1 г е 3 Икс е 3 г е 1 Икс е 2 г е 1 Икс е 1 г е 2 Икс )

где снова λ у определяется так, что е я у есть вектор единичной длины.

Как предполагает принятый ответ, сначала примените перевод п 1 ко всем точкам. Тогда ваши три очка О , А , и Б (где А "=" п 2 п 1 и Б "=" п 3 п 1 ). Теперь вычислите нормальную единицу плоскости:

н "=" А × Б | А × Б | .

Чтобы повернуть плоскость на Икс у самолет, все, что вам нужно сделать, это повернуть н к ( 0 , 0 , 1 ) . Самый простой способ сделать это - повернуть н о г ось в плюс Икс половина Икс г плоскости, а затем вращаться вокруг у оси до н параллельно положительному г ось.

Вы также можете использовать формулу вращения Родригеса для вращения вокруг оси н × ( 0 , 0 , 1 ) , но эта матрица вращения намного сложнее, чем матрица вращения вокруг координатной оси.

Вычисление матрицы вращения, которая вращается н о г ось в плюс Икс половина Икс г плоскость не требует вычисления угла. Матрица вращения просто задается в терминах н :

р г "=" ( н Икс / н Икс 2 + н у 2 н у / н Икс 2 + н у 2 0 н у / н Икс 2 + н у 2 н Икс / н Икс 2 + н у 2 0 0 0 1 ) .
Матрица вращения, которая вращается н "=" р г н о у ось к ( 0 , 0 , 1 ) также не требует вычисления угла. Это
р у "=" ( н г 0 н Икс 0 1 0 н Икс 0 н г ) .

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