3D повороты самолета - PullRequest
       83

3D повороты самолета

8 голосов
/ 24 февраля 2012

Я делаю что-то, где у меня есть плоскость в системе координат A с набором точек на ней. У меня также есть вектор нормали в пространстве N. Как я могу повернуть точки на системе координат A, чтобы основная плоскость имела такое же нормальное направление, что и N?

Хотите знать, есть ли у кого-нибудь хорошая идея, как это сделать? Спасибо

Ответы [ 3 ]

16 голосов
/ 24 февраля 2012

Если у вас есть или вы можете легко вычислить вектор нормали к плоскости, в которой находятся ваши точки, я думаю, что самый простой способ сделать это - повернуть вокруг оси, общей для двух плоскостей. Вот как я могу это сделать:

  1. Пусть M - вектор нормали к вашей текущей плоскости, а N - вектор нормали к плоскости, в которую вы хотите повернуть. Если M == N, вы можете остановиться и оставить исходные точки без изменений.
  2. Рассчитать угол поворота как

    costheta = dot(M,N)/(norm(M)*norm(N))
    
  3. Рассчитать ось вращения как

    axis = unitcross(M, N)
    

    где unitcross - это функция, которая выполняет перекрестное произведение и нормализует его к единичному вектору, т.е. unitcross(a, b) = cross(a, b) / norm(cross(a, b)). Как указано в комментарии user1318499 , этот шаг может вызвать ошибку, если M == N, если ваша реализация unitcross не возвращает (0,0,0), когда a == b.

  4. Вычислить матрицу вращения от оси и угла как

    c = costheta
    s = sqrt(1-c*c)
    C = 1-c
    rmat = matrix([ x*x*C+c    x*y*C-z*s  x*z*C+y*s ],
                  [ y*x*C+z*s  y*y*C+c    y*z*C-x*s ]
                  [ z*x*C-y*s  z*y*C+x*s  z*z*C+c   ])
    

    , где x, y и z являются компонентами axis. Эта формула описана в Википедии .

  5. Для каждой точки вычислите ее соответствующую точку на новой плоскости как

    newpoint = dot(rmat, point)
    

    , где функция dot выполняет умножение матриц.

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


Если у вас нет M, но у вас есть координаты точек в начальной плоскости относительно начала координат в этой плоскости , вы можете вычислить начальный вектор нормали из двух точек 'позиции x1 и x2 как

M = cross(x1, x2)

(вы также можете использовать unitcross здесь, но это не имеет никакого значения). Если у вас есть координаты точек относительно начала координат, которого нет на плоскости, вы все равно можете это сделать, но вам понадобятся три позиции:

M = cross(x3-x1, x3-x2)
1 голос
/ 24 февраля 2012

Одного вектора (ваш нормаль - N) будет недостаточно.Вам понадобятся еще два вектора для двух других измерений.(Представьте, что ваше трехмерное пространство все еще может вращаться / вращаться вокруг нормального вектора, и вам нужно еще 2 вектора, чтобы закрепить его).Если у вас есть нормальный и еще один в самолете, третий будет легко найти (влево или вправо в зависимости от вашей системы).

Убедитесь, что все три нормализованы (длина 1)и положить их в матрицу;используйте эту матрицу для преобразования любой точки в вашем трехмерном пространстве (используйте умножение матриц).Это должно дать вам новые координаты.

0 голосов
/ 24 февраля 2012

Я думаю, сделать единичный вектор [0,0,1] и использовать скалярное произведение вдоль двух плоскостей, чтобы найти угол разницы, и сдвинуть все ваши точки на эти углы. Предполагается, что вы хотите, чтобы ось z совпала с вектором нормали, иначе просто используйте [1,0,0] или [0,1,0] для x и y соответственно.

...