Что такое кватернион?

Что такое кватернион и как они работают? Кроме того, какие преимущества вы получаете, используя три точки на 2D-плоскости? Наконец, когда считается хорошей практикой использовать кватернионы?

49 голосов | спросил SirMathhman 9 12015vEurope/Moscow11bEurope/MoscowMon, 09 Nov 2015 18:13:39 +0300 2015, 18:13:39

2 ответа


42

Математически кватернион представляет собой комплексное число с 4-мерным размером. Но в разработке игр Quaternions часто используются для описания вращения в 3d пространстве путем кодирования:

  1. ось вращения (в виде трехмерного вектора)
  2. как далеко обойти эту ось

Обратите внимание, что эта информация кодируется синусами и косинусами внутри кватерниона, поэтому в общем случае вы не должны пытаться явно установить или прочитать внутренние компоненты кватерниона (x y z w) индивидуально. Легко сделать ошибку таким образом и получить не имеющий смысла результат. Математическая библиотека кватернионов обычно предоставляет функции для работы на кватернионах (например, преобразование их в угол от Эйлера или по оси), что гарантирует правильность математики и дает преимущество в том, что ваш код легче читать и понимать.

Альтернативный способ описания поворотов - это описание того, как можно обойти 3 фиксированные оси x, y и z (aka углы Эйлера), которые требуют только 3 числа вместо 4 и обычно более интуитивно понятны в использовании. Тем не менее, углы Эйлера подвержены проблеме, называемой gimbal-lock : когда вы поворачиваете 90 ° вокруг одной оси, две другие оси становятся эквивалентными. С кватернионами эта проблема не возникает.

Другой способ выразить вращения в 3d-пространстве - это 4x4 матрица преобразования . Но с матрицей трансформации вы не можете просто вращаться, но также масштабировать, переводить и перекосы. Если вы хотите только вращение, матрица будет излишней, а кватернион - гораздо более быстрым и простым решением.

Эта проблема применима только в трехмерном пространстве. В 2d-пространстве у вас есть только одна ось вращения. Любое вращение может быть выражено с помощью одного числа с плавающей запятой или одного комплексного номера, поэтому у вас нет этой проблемы. Хотя теоретически можно выразить поворот на 2d-плоскости с кватернионом, где ось указывает на плоскость (или из нее), она обычно является избыточной.

ответил Philipp 9 12015vEurope/Moscow11bEurope/MoscowMon, 09 Nov 2015 18:32:57 +0300 2015, 18:32:57
13

Это нужно добавить к ответу @ Филиппа.

  

Кроме того, какие преимущества вы получаете, используя три точки на двумерной плоскости?

Вам действительно не нужны кватернионы, если вам все интересно, поворачивать на плоскость, т. е. о оси z. В этом случае вам нужен только угол рыскания, и вы можете использовать тот факт, что последовательные вращения вокруг оси z коммутируют. Таким образом, вы можете применять свои вращения в любом порядке.

Ситуация другая, если вы вращаетесь на плоскости, которая не является плоскостью XY. Это вращение эквивалентно вращению вокруг произвольной трехмерной оси. Теперь у вас есть два варианта:

  • поверните свою плоскость в 3D так, чтобы она совпадала с плоскостью XY, а затем рысканием и обратно, или

  • подумайте о том, что ваш поворот будет в 3D в начале.

Второй вариант проще кодировать. Как сказал @Philipp, кватернионы избегают блокировки карданных (если вы избегаете промежуточных RPY или преобразований оси /угла).

  

Наконец, когда считается хорошей практикой использовать кватернионы?

Всякий раз, когда появляются 3D-вращения, рекомендуется использовать кватернионы.

например:.

  • В Qt . Quats упрощают интерполяцию между вращениями, как в slerp .

  • ROS использует их для преобразования позы роботов.

  • В двигателе динамики Bullet

  • Для очень сложного приложения см. здесь для их использования в классической 3D-механике.

ответил PKG 10 22015vEurope/Moscow11bEurope/MoscowTue, 10 Nov 2015 03:29:18 +0300 2015, 03:29:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132