Quaternion unity что это
Перейти к содержимому

Quaternion unity что это

Quaternion

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Submission failed

For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Description

Quaternions are used to represent rotations.

They are compact, don’t suffer from gimbal lock and can easily be interpolated. Unity internally uses Quaternions to represent all rotations.

Русские Блоги

Подробное объяснение кватернионных классов в Unity [подробно]

I. Введение

Кватернион, также известный как кватернион, состоит из четырех компонентов x, y, z и w. Это математическая концепция, открытая ирландским математиком Уильямом Лоуэном Гамильтоном в 1843 году. Умножение кватернионов не соответствует коммутативному закону. С четкой точки зрения кватернионы являются необратимым продолжением множественного числа. Если множество кватернионов рассматривается как многомерное пространство действительных чисел, кватернион представляет собой четырехмерное пространство, а не двумерное пространство для комплексных чисел.

кватернион

Для ознакомления со свойствами кватернионов, их связи с вращением и сферической линейной интерполяцией, пожалуйста, прочитайтеМатематические методы в 3D играх и компьютерной графике-кватернионахНет больше введения здесь. Следующее в основном вводит Quaternion в Unity.

В Unity Quaternion используется для хранения и представления угла поворота объекта. Преобразование кватерниона более сложное: для общего поворота и перемещения GameObject вы можете использовать соответствующие методы в Transform для реализации.

Во-вторых, атрибуты класса Quaternion

eulerAngles- Эйлера углы

Как изменить состояние вращения игрового объекта, мы можем изменить порядок углов Эйлера, изменив его Преобразование. Например, предположим, что p (x, y, z) — точка на игровом объекте, поверните угол вокруг оси x и Ось y поворачивается на угол b, а угол c поворачивается вокруг оси z, так что можно получить состояние p ‘(x’, y ‘, z’) после поворота. Процесс реализации Unity очень прост, и это можно сделать с помощью одной строки кода. Но конкретный процесс реализации действительно сложен, пожалуйста, прочитайте деталиМатематические методы в 3D играх и компьютерной графике-трансформации。

Ниже приведен пример, демонстрирующий использование углов Эйлера.

В-третьих, метод экземпляра класса Quaternion

1, метод SetFromToRotation — создать экземпляр вращения

Вы можете создать экземпляр Quaternion от formDirection до toDirection.

Объект GameObject можно преобразовать следующим образом. Сначала направления осей x, y и z собственной системы координат объекта GameObject соответствуют направлениям осей x, y и z мировой системы координат, а затем направление, в котором вектор V1 собственной системы координат объекта GameObject указывает. Поверните к V2.

1.2 PS: Вы не можете напрямую использовать transform.rotation.SetFromToRotation (v1, v2) для установки. Вы можете только скопировать экземпляр Quaternion в transform.rotation.

Результаты показаны на следующем рисунке:

SetLookRotation метод-Установить ориентацию экземпляра Quaternion

Направление transform.forward совпадает с направлением V1.

transform.right перпендикулярен плоскости, состоящей из трех точек Vector3.zer0, V1 и V2.

V2 определяет направление transform.up, потому что после определения направлений transform.forward и transform.right угол между направлением transform.up и направлением V2 всегда меньше или равен 90 градусам.

Когда V1 — Vector3.zero, метод завершается ошибкой.

2.2 PS: Как и выше, не используйте transform.rotation.SetLookRotation (v1, v2) для создания объектов Quaternion.

2.3 Примеры

Метод 3.ToAngleAxis

Угол параметра является углом поворота, а ось параметра является вектором оси.

Эта функция может преобразовать вращение объекта GameObject из состояния Quaternion.identity в текущее состояние. Вам нужно только повернуть объект GameObject вокруг оси (мировой системы координат) на угол.

3.2 Пример демонстрации

В-четвертых, статические методы класса Quaternion

В Quaternion есть девять статических методов: метод угла, метод точки, метод Эйлера, метод FromToRotation, метод Inverse, метод Lerp, метод LookRotation, метод RotateToWards и метод Slerp. Использование статических методов состоит в том, чтобы вызывать их статические методы напрямую с именем класса, например Quaternion.Angle (q1, q2), а также последующий анализ этих статических методов.

1. Угловой метод

Этот метод может вычислить минимальный включенный угол между двумя состояниями вращения от a до b.

1.2 Пример демонстрации

Из выходных данных видно, что значения a1 и a2 равны, то есть возвращаемое значение Angle является минимальным углом между двумя экземплярами Quaternion.

2. Точечный метод умножения точек

Этот метод может оценить соотношение между a и b, соответствующее углу Эйлера, в соответствии с результатом умножения точки.

Например, если есть два кватернионных экземпляра q1 (x1, y1, z1, w1) и q2 (x2, y2, z2, w2), то float f = Quaternion.Dot (q1, q2), то есть f = x1 * x2 + y1 * y2 + z1 * z2 + w1 * w2, диапазон значения результата f равен [-1,1].

Когда f = + (-) 1, углы Эйлера, соответствующие q1 и q2, равны, то есть состояния вращения являются согласованными. В частности, когда f = -1, это означает, что одно вращение поворачивается на 360 ° больше, чем другое вращение.

2.2 Пример демонстрации

Исходя из результатов, мы можем доказать, что углы Эйлера q1 и q2 равны, но значения вращения противоположны.Это также показывает, что когда возвращаемое значение Dot равно -1, угол двух параметров равен 360 °.

3. Метод Эйлера

Этот метод используется для возврата кватерниона Quaternion q (qx, qy, qz, qw), соответствующего углу Эйлера Vector3 (ex, ey, ez). Соответствующее соотношение выглядит следующим образом:

Известно, что PIover180 = 3.141592 / 180 = 0.0174532925f является постоянным источником света в компьютерной графике, и процесс его преобразования заключается в следующем:

3.2 Проверьте процесс преобразования

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

Выходное значение округляется.

Метод 4.FromToRotation

Метод экземпляра SetFromToRotation был представлен ранее, их функции одинаковы, но использование немного отличается. Чтобы использовать статический метод класса FromToRotation, необходимо вызвать его напрямую с именем класса, например Quaternion.FromToRotation (v1, v2);

Не делай демо здесь!

5. Обратный метод

5.1 Функциональный прототип

Этот метод может вернуть значение обратного кватерниона параметра поворота.

Например, вращение (x, y, z, w), затем Quaternion.Inverse (вращение) = (-x, -y, -z, w). Предположим, что угол поворота Эйлера равен (a, b, c), тогда transform.rotation = Quaternion.Inverse (вращение) эквивалентно преобразованию оси z, оси x и оси y своей собственной системы координат на -c °, — ° и -z °. Поскольку это преобразование в локальной системе координат, значения компонентов угла Эйлера последнего преобразования не обязательно равны -a, -b или -c.

6.Lerp и Slerp методы

6.1 Функциональный прототип

Эффект обоих методов заключается в возврате интерполяции из формы в. Когда параметр t <= 0, возвращаемое значение равно, а когда параметр t> = 1, возвращаемое значение равно. Где Lerp — линейная разность, а Slerp — сферическая интерполяция.

7.RotateTowards метод

7.1 Функциональный прототип

Этот метод также является методом интерполяции, то есть интерполяцией из возвращаемого параметра из to в, и максимальный угол возвращаемого значения не превышает maxDegreesDelta. maxDegreesDelta — это значение угла, а не коэффициент интерполяции. Когда maxDegreesDelta <0, будет выполняться обратная интерполяция, то есть интерполяция рассчитывается от направления к к от.

Метод 8.LookRotation

Параметр forward — это прямое направление экземпляра Quaternion. Этот метод имеет ту же функцию, что и метод экземпляра SetLookRotation, упомянутый ранее, поэтому я не буду вдаваться в подробности.

Пять, кватернионные операторы

Класс Quaternion включает в себя умножение двух объектов Quaternion и умножение объекта Quaternion на объект Vector3, поэтому необходимо перегрузить оператор «*».

1.Функция прототипа

Умножьте два кватернионных объекта

Умножение двух объектов Quaternion в основном используется для преобразования самовращения, например:

  • B будет вращаться вокруг осей z, x и y локальной системы координат B в порядке вращения вокруг оси z, затем оси x и, наконец, оси y соответственно. A.eulerAngles.z градусов, A.eulerAngles.x градусов и A.eulerAngles.y степень. Поскольку он вращается вокруг локальной системы координат, при вращении вокруг одной из осей он может влиять на углы Эйлера двух других координатных осей (если углы Эйлера двух других осей не равны 0, они не будут затронуты). влияет).
  • Если угол Эйлера A равен aEuler (ax, ay, az), то, глядя вниз в направлении aEuler исходной локальной системы координат B, B вращается по часовой стрелке вокруг aEuler. На вращение B также влияет его начальное состояние.

2.1 Пример демонстрации

B вращается вокруг направления Vector3 (1.0f, 1.5f, 2.0f) своей собственной системы координат. Хотя угол поворота вокруг этой оси каждый раз один и тот же, значение поворота угла по трем координатным осям не равно нулю, и вращение трех осей будет влиять друг на друга, поэтому каждый компонент угла Эйлера B Это приращение не является фиксированным.

3. Объекты Quatiternion и Vector3

Умножение объекта Quaternion на объект Vector3 в основном используется для преобразования себя, например:

Где A — объект Vector3. Объект, соответствующий преобразованию, будет перемещать длину модуля A вдоль направления вектора A в своей собственной системе координат. Умножение transform.rotation на A определяет направление и расстояние перемещения.

3.1 Пример демонстрации

4, сходства и различия между умножением двух объектов Quaternion и объекта Quaternion и объекта Vector3

  • Пусть A будет результатом умножения двух объектов Quaternion. B является результатом умножения объекта Quaternion на объект Vector3. Где A — это тип кватерниона, а B — тип Vector3.
  • А и В одинаковы тем, что они оба осуществляют преобразования в мировой системе координат, «умножая» свою собственную систему координат.
  • A в основном используется для реализации преобразования для вращения вокруг оси своей собственной системы координат, а B в основном используется для реализации преобразования для перемещения в определенном направлении своей собственной системы координат.
  • Необходимо следовать форме объекта Quaternion * Vector3 объект, вы не можете изменить порядок.

Поскольку все они вращаются или перемещаются относительно своей собственной системы координат, когда ось их собственной системы координат и ось мировой системы координат несовместимы, их изменения вокруг оси в их собственной системе координат будут влиять Изменение каждой оси объекта в мировой системе координат.

Преобразование кватерниона в кватернион сложнее, но соответствующая функция была написана в Unity для реализации операции преобразования.

В недавнем проекте я столкнулся с движением экрана мобильного телефона одним пальцем для выполнения операции поворота модели.Попробовав различные функции поворота в Unity, желаемый эффект не был достигнут, я решил использовать Quaternion. Функция AngleAxis для достижения эффекта вращения.

Сначала рассмотрим Quaternion.AngleAxis (угол, ось). Параметры angle и axis представляют угол поворота и ось вращения объекта. Как показано ниже: Направление красной стрелки представляет ось вращения вокруг объекта, и угол поворота можно настраивать.

Далее нам нужно сделать две вещи, определить ось и вычислить угол. В этом проекте мы используем один палец для скольжения на экране телефона.Мы записываем расстояние скольжения, увеличение в направлении X и увеличение в оси Y, чтобы заложить основу для расчета оси и угла. Функция ввода Unity имеет функцию GetTouch. Нам нужно только вызвать соответствующие методы этой функции для достижения требований.

Теперь мы создаем новую сцену в Unity и новый куб в сцене.

Обратите внимание на мировую координатную ось куба, направление оси Z должно быть в сторону камеры. Согласно предыдущему анализу кватернионного скрипта, скрипт вращения куба:

Если мы запустим это на новой машине, мы обнаружим, что вращение первого пальца нормально, но во второй раз будет процесс избиения. Здесь нам нужно обратить внимание на проблему: функция кватерниона Quaternion.AngleAxis предназначена для вращения куба вокруг оси Оси на начальный угол поворота, а не на приращение в предыдущем состоянии. Если вам нужно продолжить предыдущее состояние вращения, вам нужно восстановить вращение этого объекта в исходное состояние. В соответствии с этой идеей я добавил родительский объект в куб. Мы работаем с родительским объектом во время операции, а затем, когда палец покидает экран, удаляем куб из родительского объекта, а затем восстанавливаем вращение родительского объекта. Куб связан как дочерний объект родительского объекта.После следующего вращения пальца куб продолжит вращаться после предыдущего вращения, которое реализует продолжение вращения.

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

Quaternions in Unity

Dealing with Quaternions can be a pain at first. If you don’t already know, Unity handles rotation in its scripting using Quaternions, and there are a bunch of advantages to this. That said, it’s strange.

Let’s say you have a Vector3 that’s pointed forward from your players position, something to track where a shot should take place. If we don’t take the players rotation into account, we’ll be shooting in one direction all day.

Introducing Quaternions

So a quaternion itself is similar to a Vector4 shape. It has 4 different values (XYZW) that are calculated in radians. The funny thing about them is that we NEVER MESS WITH THE VALUES DIRECTLY. NEVER.

Which begs the question “So how do we deal with them?” The answer is simple multiplication. Whenever we do quaternion math, we multiply the values, or otherwise compare them with a simple boolean check.

So why bother using complex math when a simple Vector3 could do the trick? Clearly, having an XYZ value would work for rotation just as fine as it does for scale and position, right?

To answer this question, we have to go over what this is meant to solve.

Gimbal Lock

A gyroscope is the perfect example of this concept.

There comes a time when two of those rings are going to run parallel to each other, and this comes at a price: a loss of a degree of freedom. Rather, it makes it so that a rotational axis that should be in place isn’t, it’s out of wack. If we tried rotating it that way, it would go in some strange pattern reseting the axes properly before going to the right rotation smoothly.

Why does the editor show rotation as a Vector3 then?

Because it’s easy to use and manipulate, but Unity will operate on the object’s rotation based on its quaternion value. It’s just easier to use what we call Euler angles (oil-er angles).

Euler angles are represented as a Vector3, and it’s our easy to understand way to see the rotation of an object. Behind the scenes, it’s all quaternions.

To solve these issues, Unity exclusively uses quaternions for rotation. They also assure that calculated angles are properly equal. For example, if something is rotated 90 degrees on the X axis, then it is equally aligned to an object rotated at -270 degrees on the X axis. Euler angles would not say that’s equal since locally, the angles are 90 and -270.

Quaternions do not do that. The math is complicated to get into, but the main takeaway is that this data type will handle things that normally observable angles would not.

Using Quaternions

The first time I encountered Quaternions was when I was first creating a PlayerController. The error was something along the lines of “cannot assign a Vector3 value to a Quaternion,” and I was thoroughly confused.

Then I tried figuring out how to manipulate them, and no dice. After a few tutorials, I was dumbfounded to find out that it was a ton of multiplication, but nothing more complicated than that.

Rotating Vector 3's

In the standard FPS PlayerController, you can rotate a player 360 degrees. To shoot a projectile or raycast in front of you, you need to take rotation into account. Unity handles this with Transform.forward today, but here’s the math to figure that out with Quaternions.

The format of getting a returned Vector3 is quaternion * vector3. This will rotate a vector around a point.

For example: I need to rotate an object 90 degrees around it’s local Y axis. If I wanted to do that, I would need to get that 90 degrees in the form of a quaternion. We can’t just call new Quaternion the way we might otherwise, or at least it’s best not to.

Instead, we can use the built in features of the Quaternion class to do that for us. We’ll start with the Quaternion.Euler() method.

If we pass in Vector3 or 3 floats, we can calculate the Quaternion of the Euler angle that we’d expect. This is an easy way to get some kind of targeted angle that is visible to you in the format you need.

Smooth Rotation from Angle to Angle

Here’s a snipet from a project I’ve been working on. It still needs some work, but let’s dive into the logic. There are 3 bits I’ll highlight from this:

Your Start method and initial variables

We need to get a few things setup before we get going. I want this script to allow a node to rotate from one specified angle to another horizontally. The min and max angles represent the angle away from the forward vector of the object. The goToMin variable will control which direction it will be rotating towards (either the min or max angle).

The Vector3’s above are mainly for some GUI stuff, so we’ll ignore that for now.

Setting up the Quaternions

We adjust a position to make sure that we’re not using the base of the object, and we can determine that with some basic math. Now we use the Quaternion.Euler method from before to get base-angles from our inputs.

The last two lines are the real heroes here. So in order to get the rotation based on our objects LOCAL rotation (ie: rotate some degrees around it’s y axis based on it’s current rotation), we need to get information about our Up axis. We’re rotating about that axis to get our object to face that way.

The AngleAxis method takes in a float and Vector3 argument to spit out a quaternion. If we pass in the min and max angles, as floats (ie: what we did before), and we pass in the local Up axis, we get a quaternion rotation. If we multiply that by the current rotation, we have our targets.

  1. Get your target value as a float
  2. Pass that in and the axis you want to Rotate ABOUT

3. Multiply that by the current rotation of the object

The Rotating Method:

I want these to go off smoothly, and outside of update. Coroutines are the best way to handle these, since we need to wait for them to activate.

I started off creating a quick check to make sure the object is rotating, then a loop to run while it’s rotating. When that’s broken, it goes into another check to rotate to the next angle.

The if/else checks should be refactored, but the essential function is to tell the object to restart the function in the other direction, osculating from one to the other.

So what did we learn?

If anything, remember why we need to use this type of data. It helps us avoid unseemly transitions in movement that we don’t want, making things seem more organic and usable. It also allows us to calculate equivalent angles more clearly and in a way that makes logical sense, without messy positive/negative angle calculations that could cause problems otherwise.

It takes a bit to get used to, and the documentation over at Unity is great. When you inevitably need to do something involving rotation, check them out for other great built-in methods you can use to calculate what you need to do.

Also, it can be hard at first, and there will be a bunch of trial and error involved in more complex rotations, but hopefully this will help you with the “Why make this so complicated” problem you may be facing.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *