Подтвердить что ты не робот

Вращение вектора в 3D пространстве

Я делаю проект андроида в opengl es, который использует акселерометр, чтобы вычислить изменение в конкретных осях, и моя цель - повернуть мой вектор движения, подобный космическому кораблю. Проблема в том, что я не могу понять математику за вращающимися матрицами. Вектор движения по умолчанию равен 0,1,0, означает + y, поэтому объект сначала смотрит вверх. и я пытаюсь повернуть вектор движения, чтобы я мог перемещать объект там, где он указывает. Я могу собирать изменения в телефоне. ось x: вращать [0], ось y: вращать [1], ось z: вращать [2]. Как я могу повернуть вектор движения с помощью матрицы вращения?

4b9b3361

Ответ 1

Если вы хотите повернуть вектор, вы должны создать так называемую матрицу вращения.

Вращение в 2D

Скажем, вы хотите повернуть вектор или точку на θ, тогда тригонометрия утверждает, что новые координаты

    x' = x cos θ − y sin θ
    y' = x sin θ + y cos θ

Для демонстрации давайте возьмем кардинальные оси X и Y; когда мы поворачиваем ось X на 90 ° против часовой стрелки, мы должны получить ось X, преобразованную в ось Y. Рассмотрим

    Unit vector along X axis = <1, 0>
    x' = 1 cos 90 − 0 sin 90 = 0
    y' = 1 sin 90 + 0 cos 90 = 1
    New coordinates of the vector, <x', y'> = <0, 1>  ⟹  Y-axis

Когда вы понимаете это, создание матрицы для этого становится простым. Матрица - это всего лишь математический инструмент, позволяющий выполнять это удобным, обобщенным образом, чтобы различные преобразования, такие как вращение, масштабирование и перемещение (перемещение), можно было объединить и выполнить за один шаг, используя один общий метод. Исходя из линейной алгебры, чтобы повернуть точку или вектор в 2D, строимая матрица имеет вид

    |cos θ   −sin θ| |x| = |x cos θ − y sin θ| = |x'|
    |sin θ    cos θ| |y|   |x sin θ + y cos θ|   |y'|

Вращение в 3D

Это работает в 2D, а в 3D нам нужно учесть третью ось. Поворот вектора вокруг начала координат (точки) в 2D означает просто поворот его вокруг оси Z (линии) в 3D; поскольку мы вращаемся вокруг оси Z, ее координату следует поддерживать постоянной, то есть 0 ° (вращение происходит на плоскости XY в 3D). В 3D вращение вокруг оси Z будет

    |cos θ   −sin θ   0| |x|   |x cos θ − y sin θ|   |x'|
    |sin θ    cos θ   0| |y| = |x sin θ + y cos θ| = |y'|
    |  0       0      1| |z|   |        z        |   |z'|

вокруг оси Y будет

    | cos θ    0   sin θ| |x|   | x cos θ + z sin θ|   |x'|
    |   0      1       0| |y| = |         y        | = |y'|
    |−sin θ    0   cos θ| |z|   |−x sin θ + z cos θ|   |z'|

вокруг оси X будет

    |1     0           0| |x|   |        x        |   |x'|
    |0   cos θ    −sin θ| |y| = |y cos θ − z sin θ| = |y'|
    |0   sin θ     cos θ| |z|   |y sin θ + z cos θ|   |z'|

Примечание 1: ось, вокруг которой выполняется вращение, не имеет элементов синуса или косинуса в матрице.

Примечание 2: Этот метод выполнения поворотов основан на системе вращения угла Эйлера, которая проста в обучении и проста для понимания. Это прекрасно работает для 2D и для простых 3D случаев; но когда вращение должно выполняться вокруг всех трех осей одновременно, то углов Эйлера может быть недостаточно из-за присущего этой системе недостатка, который проявляется как замок карданного подвеса. В таких ситуациях люди прибегают к кватерниону, который более продвинут, чем этот, но при правильном использовании не страдает от блокировок подвеса.

Я надеюсь, что это проясняет основные повороты.

Вращение, а не революция

Вышеупомянутые матрицы вращают объект на расстоянии r = √ (x² + y²) от начала координат по окружности радиуса r; ищите полярные координаты, чтобы узнать почему. Это вращение будет связано с мировым космическим происхождением, как революция. Обычно нам нужно вращать объект вокруг его собственной рамки/оси, а не вокруг мира, то есть локального происхождения. Это также можно рассматривать как особый случай, когда r = 0. Поскольку не все объекты имеют мировое происхождение, простое вращение с использованием этих матриц не даст желаемого результата вращения вокруг собственной рамки объекта. Сначала вы должны перевести (переместить) объект в начало координат мира (чтобы источник объекта выровнялся по миру, тем самым сделав r = 0), выполнить вращение с одной (или несколькими) из этих матриц. и затем переведите его обратно на прежнее место. Порядок, в котором применяются преобразования , имеет значение. Объединение нескольких преобразований вместе называется конкатенацией или композицией.

Состав

Я призываю вас прочитать о линейных и аффинных преобразованиях и их композиции для выполнения нескольких преобразований за один раз, прежде чем играть с преобразованиями в коде. Без понимания основных математических основ отладка преобразований была бы кошмаром. Я нашел это видео лекции очень хорошим ресурсом. Другой ресурс - это руководство по трансформациям, цель которого - быть интуитивно понятным и иллюстрировать идеи с помощью анимации (предостережение: автор мной!).

Вращение вокруг произвольного вектора

Произведения вышеупомянутых матриц должно быть достаточно, если вам нужны только повороты вокруг кардинальных осей (X, Y или Z), как в опубликованном вопросе. Однако во многих ситуациях вы можете захотеть вращаться вокруг произвольной оси/вектора. формула Родрига (a.k.a. формула оси-угла) является обычно предписываемым решением этой проблемы. Однако прибегайте к этому, только если вы застряли только с векторами и матрицами. Если вы используете Quaternion, просто создайте кватернион с требуемыми вектором и углом. Кватернионы - превосходная альтернатива хранению и управлению трехмерными вращениями; это компактно и быстро, например объединение двух поворотов в представлении осевого угла довольно дорого, умеренно с матрицами, но дешево в кватернионах. Обычно все манипуляции с вращением выполняются с кватернионами и в качестве последнего шага преобразуются в матрицы при загрузке в конвейер рендеринга. Смотрите Понимание кватернионов, чтобы найти приличный учебник по кватернионам.

Ответ 2

Справочные документы здесь: http://developer.android.com/reference/android/opengl/Matrix.html

  • Построить матрицу вращения
  • Преобразование вектора с помощью матрицы

Вам не нужно понимать математику, функции библиотеки будут выполнены.