Как изменить ось вращения в unity

от admin

Rotation and orientation in Unity

In Unity, you can use both Euler angles and quaternions to represent rotations and orientation. These representations are equivalent but have different uses and limitations.

Typically, you rotate objects in your scene A Scene contains the environments and menus of your game. Think of each unique Scene file as a unique level. In each Scene, you place your environments, obstacles, and decorations, essentially designing and building your game in pieces. More info
See in Glossary using the Transform component A Transform component determines the Position, Rotation, and Scale of each object in the scene. Every GameObject has a Transform. More info
See in Glossary , which displays orientation as a Euler angle. However, Unity stores rotations and orientations internally as quaternions, which can be useful for more complex motions that might otherwise lead to gimbal lock.

Euler angles

In the Transform coordinate, Unity displays rotation with the vector property Transform.eulerAngles X, Y, and Z. Unlike a normal vector, these values actually represent the angle (in degrees) of rotation about the X, Y, and Z axes.

Euler angle rotations perform three separate rotations around the three axes. Unity performs the Euler rotations sequentially around the z-axis, the x-axis and then the y-axis. This method of rotation is extrinsic rotation; the original coordinate system doesn’t change while the rotations occur.

To rotate a GameObject The fundamental object in Unity scenes, which can represent characters, props, scenery, cameras, waypoints, and more. A GameObject’s functionality is defined by the Components attached to it. More info
See in Glossary , you can enter angle values of how far you want each axis to rotate into the Transform component. To rotate your GameObjects with script, use Transform.eulerAngles . If you convert to Euler angles to do calculations and rotations, you risk problems with gimbal lock.

Gimbal lock

When an object in 3D space loses a degree of freedom and can only rotate within two dimensions, it’s called gimbal lock. Gimbal lock can occur with Euler angles if two axes become parallel. If you don’t convert the rotational values to Euler angles in your script, the use of quaternions should prevent gimbal lock.

If you do have problems with gimbal lock, you can avoid Euler angles if you use Transform.RotateAround for rotations. You can also use Quaternion.AngleAxis on each axis and multiply them together (quaternion multiplication applies each rotation in turn).

Quaternions

Quaternions provide mathematical notation for unique representations of spatial orientation and rotation in 3D space. A quaternion uses four numbers to encode the direction and angle of rotation around unit axes in 3D. These four values are complex numbers rather than angles or degrees. You can look into the mathematics of quaternions for more information.

Unity converts rotational values to quaternions to store them because quaternion rotations are efficient and stable to compute. The Editor doesn’t display rotations as quaternions because a single quaternion can’t represent a rotation greater than 360 degrees about any axis.

You can use quaternions directly if you use the Quaternion class. If you use script for your rotations, you can use the Quaternion class and functions to create and change rotational values. You can apply values to your rotation as Euler angles but you need to store them as quaternions to avoid problems.

Convert between Euler angles and quaternions

To convert between quaternions and Euler angles to view and edit your rotations in your preferred way, you can use script:

Поворот и вращение объектов в Unity

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

Как поворот объекта, так и вращение, осуществляется путём изменения значений компонента Transform, и его свойства Transform.rotation.

И начнём данную статью с вращения, так как он более прост и понятен.

Вращение игрового объекта

Для начала разберём, что означает вращение? Вращение, это плавное изменение значений Transform.rotation, вокруг определённых осей. Вот их нам и нужно менять.

Для изменения этих значений, нам поможет метод Transform.Rotate. Работает он следующим образом:

Этот скрипт будет вращать вашего персонажа по оси Z со скоростью 1. Вы так же можете выбрать другую ось вращения, например X или Y. Или же увеличить скорость вращения на 2.

Читать:
Как найти точки касания параболы и окружности

На этом всё! Как видите, вращать игровые объекты очень просто. Теперь перейдём к повороту, который по своей сути немного тяжелее.

Поворот игрового объекта

Поворот персонажа подразумевает его поворот на 180 градусов по одной из осей. Например, очень часто такое может понадобиться в 2д играх, преимущественно платформерного типа. Поэтому в качестве примера мы будем использовать 2д персонажа, которого нужно развернуть по горизонтали, то-есть по оси X.

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

Для того, чтобы это сделать, необходимо прописать следующий код:

Давайте разберём код:

  • В первой строке с помощью метода Transform.eulerAngles мы получаем значения roration в виде углов эйлера.
  • Во второй строке установили значение y в 180, тем самым развернули объект на 180 градусов.
  • В третьей строке, элеровские значения конвертируем в кватернионы, и сохраняем полученные данные.

Таким же образом мы можем вернуть объект в нормальное положение:

Аналогичным образом мы можем разворачивать наш объект по любой оси, изменив rotate.y на rotate.x или на rotate.z.

Если остались вопросы, пишите в комментариях. А так же ставьте лайки, если помог 🙂

Web server is returning an unknown error Error code 520

There is an unknown connection issue between Cloudflare and the origin web server. As a result, the web page can not be displayed.

What can I do?

If you are a visitor of this website:

Please try again in a few minutes.

If you are the owner of this website:

There is an issue between Cloudflare’s cache and your origin web server. Cloudflare monitors for these errors and automatically investigates the cause. To help support the investigation, you can pull the corresponding error log from your web server and submit it our support team. Please include the Ray ID (which is at the bottom of this error page). Additional troubleshooting resources.

Cloudflare Ray ID: 7a6dafe1a71b2d4f • Your IP: Click to reveal 88.135.219.175 • Performance & security by Cloudflare

Как изменить ось вращения в unity

Кватернионы используются для представления вращений.
В Unity все вращения представлены в виде кватернионов. Их использование решает проблему «шарнирного замка» (gimbal lock).

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

Первый способ (углы указываются в градусах):

Второй способ (значения вращения по каждой оси в градусах):

Третий способ (через ось и угл вращения вокруг неё в градусах):

Получить углы Эйлера из кватерниона можно через свойство eulerAngles:

Или можно получить ось и угол вращения вокруг нее:

Теперь разберемся, как с их помощью вращать объекты.
Для этого нужно кватернион, из которого мы хотим повернуть (текущее положение), умножить на кватернион, на который хотим повернуть.
Пример:

Но кватернионы — это тот случай, когда от перемены мест множетелей произведение меняется.
Поэтому такой код даст иной результат:

Интерполяция

Есть несколько методов интерполяции для кватернионов, первый из них — Lerp:

Данный метод возвращает промежуточное вращение между a и b на основе t. При этом значение t ограничивается диапазоном от 0 до 1.
Вернёт a, при t равное или меньше 0.
Вернёт b, при t равное или больше 1.

Второй метод интерполяции — LerpUnclamped:

От предыдущего он отличается только отсутствием ограничений t. Т.е результат выходит за пределы a и b, если t 1.

Картинка для наглядности:

Отличие Lerp от LerpUnclamped

Следующие два метода интерполяции — Slerp и SlerpUnclumped:

Разница между ними такая же, как и между двумя предыдущими.
А отличие Lerp от Slerp поможет понять это видео (синее — lerp, белое — slerp):

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

Немного изменим задачу.
Прожектор должен освещать не всё вокруг, а только сектор в 90 градусов.
Для этого заменим LerpUnclamped на Lerp. А чтобы прожектор не стопорился в конце, обвернём значение времени функцией Mathf.PingPong:

Задаём направления

Функция FromToRotation (или ее аналог SetFromToRotation) создает такой кватернион, что если его применить к fromDirection, то направление этого вектора совпадёт с toDirection: Обычно используется, чтобы повернуть объект так, чтобы одна из его осей смотрела в нужном направлении.

Функция LookRotation (или SetLookRotation) создает вращение, при котором ось Z сонаправленна forward, а ось Y сонаправленна upwards.

Похожие статьи