как узнать поворот объекта в unity
Rotation and Orientation in Unity
Summary
Rotations in 3D applications are usually represented in one of two ways, Quaternions or Euler angles. Each has its own uses and drawbacks. Unity uses Quaternions internally, but shows values of the equivalent Euler angles in the inspector to make it easy for you to edit.
The Difference Between Euler Angles and Quaternions
Euler Angles
Euler angles have a simpler representation, that being three angle values for X, Y and Z that are applied sequentially. To apply a Euler rotation to a particular object, each rotation value is applied in turn, as a rotation around its corresponding axis.
Quaternions
Quaternions can be used to represent the orientation or rotation of an object. This representation internally consists of four numbers (referenced in Unity as x, y, z & w) however these numbers don’t represent angles or axes and you never normally need to access them directly. Unless you are particularly interested in delving into the mathematics of Quaternions, you only really need to know that a Quaternion represents a rotation in 3D space and you will never normally need to know or modify the x, y & z properties.
In Unity all Game Object rotations are stored internally as Quaternions, because the benefits outweigh the limitations.
In the Transform Inspector however, we display the rotation using Euler angles, because this is more easily understood and edited. New values entered into the inspector for the rotation of a Game Object are converted “under the hood” into a new Quaternion rotation value for the object.
The rotation of a Game Object is displayed and edited as Euler angles in the inspector, but is stored internally as a Quaternion
As a side-effect, it is possible in the inspector to enter a value of, say, X: 0, Y: 365, Z: 0 for a Game Object’s rotation. This is a value that is not possible to represent as a quaternion, so when you hit Play you’ll see that the object’s rotation values change to X: 0, Y: 5, Z: 0 (or thereabouts). This is because the rotation was converted to a Quaternion which does not have the concept of “A full 360-degree rotation plus 5 degrees”, and instead has simply been set to be oriented in the same way as the result of the rotation.
Implications for Scripting
Creating and Manipulating Quaternions Directly
Unity’s Quaternion class has a number of functions which allow you to create and manipulate rotations without needing to use Euler angles at all. For example:
However sometimes it’s desirable to use Euler angles in your scripts. In this case it’s important to note that you must keep your angles in variables, and only use them to apply them as Euler angles to your rotation. While it’s possible to retrieve Euler angles from a quaternion, if you retrieve, modify and re-apply, problems will arise.
Here are some examples of mistakes commonly made using a hypothetical example of trying to rotate an object around the X axis at 10 degrees per second. This is what you should avoid:
And here is an example of using Euler angles in script correctly:
Implications for Animation
Many 3D authoring packages, and indeed Unity’s own internal animation window, allow you to use Euler angles to specify rotations during an animation.
These rotations values can frequently exceed range expressable by quaternions. For example, if an object should rotate 720 degrees in-place, this could be represented by Euler angles X: 0, Y: 720, Z:0. But this is simply not representable by a Quaternion value.
Unity’s Animation Window
External Animation Sources
When importing animation from external sources, these files usually contain rotational keyframe animation in Euler format. Unity’s default behaviour is to resample these animations and generate a new Quaternion keyframe for every frame in the animation, in an attempt to avoid any situations where the rotation between keyframes may exceed the Quaternion’s valid range.
For example, imagine two keyframes, 6 frames apart, with values for X as 0 on the first keyframe and 270 on the second keyframe. Without resampling, a quaternion interpolation between these two keyframes would rotate 90 degrees in the opposite direction, because that is the shortest way to get from the first orientation to the second orientation. However by resampling and adding a keyframe on every frame, there are now only 45 degrees between keyframes so the rotation will work correctly.
Как получить значение угла поворота по y координате в gameobject?
Здравствуйте, мне необходимо получить значение угла поворота gameobject’a, но все никак не могу это сделать, подскажите в какую сторону копать?
Вот это мне нужно получить:
Вот это я в итоге получаю:
То, что обведено синим, это я получаю вот так:
А то, что обведено синим, я получаю вот так:
И то что я заметил:
Все правильно выводится до значения в 360, а если объект повернут к примеру на 361 градус то от кода я получу ответ в 359, а точнее в 358.9999
P.S. Всем огромное спасибо
градусов всего 360. круг..
после этого вы по сути уменьшаете отклонение от нуля))
Denis Gaydak, так, хорошо, я вас понял, теперь такой вопрос:
На сцене есть 2 объекта, 1 основной, а 2-ой дополнительный и мне нужно вращать дополнительный вот так:
Но так вращать дополнительный объект не получается, так как, когда основной объект превышает угол поворота в 360, к примеру угол становится 390, то код показывает, что угол равен 330 и тогда в этот момент дополнительный объект начинает вращаться в обратную сторону, т.е. почему тогда в редакторе угол показан 390, а код говорит о том что угол равен 330, а не просто 30, тогда бы все работало. Что делать не пойму, подскажите пожалуйста.
не знаю зачем вам преобразование..
mainObject.transform.rotation.ToAngleAxis(out y, out v);
вы бы описали какого эффекта хотите добиться. что и как вращать))
повторять угол по Y.
кватернионы вообще так устроены))
не выйдет у вас «два оборота по часовой» сделать или что то подобное..таким образом..
для вращения это равноценно тому, что ничего не поменялось..
можете попробовать запоминать и накапливать именно ЧИСЛО..УГОЛ))
и тогда лерпить к примеру от нуля до 720.
именно подставляя напрямую Y.
будет тогда два оборота по часовой..как в анимации..
Спасибо вам огромное за все!!
Вот эта строка помогла мне.
И за советы тоже огромное спасибо! Удачи и еще раз спасибо реально выручили 🙂
Eulerangle: как получить значение свойства Rotation из Inspector?
Доброго времени суток
Как получить значение свойства Rotation из Inspector?
Мне нужно показания углов поворота объекта
Такой код не работает(работает не корректно)
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Как получить значение свойства объекта в переменную?
var_dump($obj); Выводит: object(SimpleXMLElement)#338 (1) < =>string(6) «0.1818» > Как передать.
Ну вообщем мне нужно чтобы пользователь крутил объект с помощью мыши(вращал его). Ну и когда я вращаю его «вверх» (ровно по одной оси) значение угла увеличивается, а когда в противоположную сторону то уменьшается, затем начинает расти градусов 20 и снова падает.
Надеюсь понятно объяснил
Добавлено через 1 минуту
Очень странные дела.
Добавлено через 19 секунд
Точно туда смотришь?)
Собственно я и спрашиваю, можно ли как то получить значения Rotation которые в инспекторе?
Ну вообщем я занимаюсь робототехникой, и у меня есть научный проект создания дирижабля для аэрофотосъемки. Когда пришла пора думать как управлять своим дирижаблем, решил обратить свое внимание на Unity3d. Создал простую игровую сцену из двух объектов: модель дирижабля, которую пользователь может вращать как угодно по осям, тем самым задавая направления полета, и Plane перед дирижаблем, на котором будет отображаться видео с камеры в реальном времени. Значения углов нужны для того чтобы знать в какую сторону лететь и как сильно должны вращаться моторы.
Добавлено через 26 минут
У меня выдает такую фигню:
Хотя смотрел что этот метод делает и что он существует
Assets/nrf2401.cs(39,35): error CS0117: `UnityEngine.Vector3′ does not contain a definition for `SignedAngle’
Все using на месте
Добавлено через 1 час 10 минут
Может все таки есть способ просто получать эти 3 значения Rotation из Inspecora? Больше мне ничего от Unity даром не надо
Как проверить, повёрнут ли объект?
Нужно реализовать подобный код, но я не имею представления как это реализовать. Помогите, пожалуйста.
if (обьект повёрнут на 90 градусов)
Помощь в написании контрольных, курсовых и дипломных работ здесь.
word 2007 как повернут страницу.
Вставил таблицу в альбомном режиме тепер нада повернут его и вставит в основной тексть. Таблица не.
Как повернут футпринт на PCB в altium?
Как повернут футпринт на PCB в altium? Пробел не поворачивает.
Как проверить объект на существование?
Всем здарвсвуйте! Подскажите как можно проверить существет ли объект, к примеру Label и если.
Как проверить объект на повторения
Добрый день, уважаемые коллеги :senor: В проекте использую словарь интернационализации, просто.
Решение
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Как проверить, что объект создан
Всем привет! Скажем Thread lThread; мы объявили переменную, но пока не создали ее. как.
Как проверить, существует ли объект в базе?
Привет всем! У меня маленькая проблемка. Мне необходимо в программе VB проверить есть ли в талице.
Как проверить существования ссылки на объект Database, Connection?
1. Как проверить существования ссылки на объект Database, Connection? Через IsObject(var) не.
Русские Блоги
[Unity] Вращение в Unity 3D
Вращение в Unity 3D
1. Вращение в Unity 3D
Чтобы повернуть GameObject, вы можете напрямую передать следующий код:
Тогда возникают следующие вопросы:
Ответьте один за другим ниже.
Во-вторых, ось вращения
Прежде всего, чтобы ответить на первый вопрос, какая система координат является основанием оси вращения? Разделены на следующие три ситуации.
1. Ось вращения: значение вращения Transform в Инспекторе.
Для этой ситуации есть четкое объяснение в Unity Doc,
The position, rotation and scale values of a Transform are measured relative to the Transform’s parent. If the Transform has no parent, the properties are measured in world space.
То есть ось вращения компонента Transform в редакторе является осью координат пространства модели родительского узла.Если родительский узел отсутствует, ось вращения является осью координат мирового пространства.
На рисунке выше показано, что если у Transform есть родительский узел, такой как «Mesh» на рисунке, Position будет позицией в пространстве модели его родительского узла (здесь «Cow»); если нет родительского узла, Position будет в мировом пространстве. В локации. Точно так же поворот и масштаб в преобразовании одинаковы.
2. Ось вращения: используйте функцию Rotate в Script, вращайте в Space.Self
Выше упоминались три типа перегруженных функций, в качестве примера мы берем в основном первый. Второй параметр имеет два значения: Space.Self или Space.World.
Используйте следующий код, чтобы проверить эффект вышеуказанной функции.
Делаем вывод: вращаемся в Space.Self, ось вращения является координатной осью локальной системы координат.
3. Ось вращения: используйте функцию Rotate в Script для вращения в Space.World
После установки Rotate Space в World в Inspector, результат выполнения показан на рисунке ниже. Здесь мы знаем, что ось Y родительского узла кубоида не является осью Y мира, и кубоид здесь вращается вокруг оси Y в мировой системе координат.
Следовательно, делается вывод, что ось вращения является координатной осью мировой системы координат при вращении в Space.World.
4. Статический угол Эйлера и динамический угол Эйлера.
Упомянутая выше задача об оси вращения имеет соответствующее понятие в математике. Это так называемый статический угол Эйлера и динамический угол Эйлера.
Так называемыеСтатический угол Эйлера, То есть его вращающаяся ось использует неподвижную систему отсчета.Динамический угол Эйлера, Само твердое тело используется в качестве системы отсчета, поэтому система отсчета будет вращаться вместе с вращением твердого тела.
Три, положительное направление вращения
Переходя ко второму вопросу, поскольку локальная система координат и мировая система координат в Unity являются левосторонними системами координат, положительное направление вращения здесь может быть определено правилом правой руки.
В-четвертых, порядок вращения
Давайте посмотрим на третий вопрос. Порядок вращения, то есть наш угол Эйлера (xAngle, yAngle, zAngle), состоит из трех компонентов, соответствующих вращению вокруг оси x, вращению вокруг оси y и вращению вокруг оси z, затем Как он вращается вокруг этих трех осей?
Это также делится на статические углы Эйлера и динамические углы Эйлера для обсуждения.
1. Статический угол Эйлера.
Эта ситуация соответствует вращению с использованием Space.World, описанному выше, и вращению в Инспекторе. Даже если ось вращения остается неизменной во время вращения, порядок вращения определяет окончательный результат вращения. Посмотрим на следующий пример, будет очень наглядное понимание:
Как видите, из-за разной последовательности вращения конечный результат вращения отличается! (Суть в том, что умножение матриц не удовлетворяет закону коммутативности)
Как правило, не существует фиксированной формулы для порядка вращения, поэтому при ее использовании необходимо четко указать порядок. Для этого есть специальный термин, который называетсяСоблюдение. Если вращение в системе координат сначала вращается вокруг оси x, затем вокруг оси y и, наконец, вокруг оси z, это называется соответствием X-Y-Z. И так далее.
Что касается Unity, вы можете видеть из документации, что его transform.Rotate () использует соответствие Z-X-Y.Итак, если в Unity, используйте статическое вращение угла Эйлера (90,90,0), чтобы получить ситуацию случая 1.
2. Динамический угол Эйлера.
Сначала посмотрите на разницу между ними:
Как обстоят дела в Unity? Запустите следующий код напрямую, чтобы увидеть результат:
Можно обнаружить, что ситуация в Unity такая же, как и в ситуации 1. Таким образом, когда второй шаг заключается в повороте на 90 вокруг оси y, он вращается вокруг оси y в начальном состоянии A.
Чтобы получить эффект во втором случае, вы можете повернуть его дважды и запустить следующий код:
Можно обнаружить, что эффект в это время такой же, как в сценарии 1.
В итоге мы пришли к следующему выводу: каждый раз, когда Space.Self используется для Rotate в Unity, он вращается вокруг оси координат локальной системы координат во время вызова.
3. Эквивалентная форма статического угла Эйлера и динамического угла Эйлера.
Статический угол Эйлера и динамический угол Эйлера можно преобразовать взаимно.
Правило преобразования: в статическом угле Эйлера, в определенной системе координат E в соответствии с определенным соответствием, таким как угол поворота XYZ (a, b, c), что эквивалентно динамическому углу Эйлера, вращающемуся под E (0, 0, c), повернуть (0, b, 0) в повернутой системе координат E ‘и повернуть (a, 0, 0) в повернутой новой системе координат E «.
Rotate in Space.Self с углом поворота ZXY (a, b, c), что эквивалентно вращению в Space.Self (0, b, 0), и вращение в новом Space.Self (a, 0, 0), rotate (0, 0, c) в обновленном Space.Self.
Докажем, что два указанных выше поворота эквивалентны. Посредством составной матрицы вращения.
Матрица вращения b вокруг оси Y в системе координат E равна Rb (Rb == Ry),
Матрица вращения поворота оси X a в новой системе координат E ’после поворота b вокруг оси Y вокруг системы координат E равна Ra,
Матрица вращения поворота c оси Z в новой системе координат E «после поворота a вокруг оси X вокруг системы координат E’is Rc.
Кроме того, обратная матрица R обозначается как R
Доказать: Rz * Rx * Ry == Rb * Ra * Rc
доказать:
Rb == Ry, это можно узнать из того же определения.
Ra = (Rb
) * Rx * Rb, чтобы получить вращение по оси X, матрицу вращения Ra в новой системе координат E ‘после поворота вокруг системы координат E вокруг оси Y b, сначала примените Rb
для поворота в систему координат E Вниз, затем поверните a вокруг оси X в системе координат E и, наконец, используйте Rb, чтобы вернуться в систему координат E ‘.
Rc = ((Rb * Ra)
) * Rz * (Rb * Ra), причина та же, что и выше.
F,
Вправо = Rb * Ra * Rc
= Rb * Ra * ((Rb * Ra)
) * Rz * (Rb * Ra)
= Rz * Rb * Ra
= Rz * Rb * (Rb
) * Rx * Rb
= Rz * Rx * Rb
= Rz * Rx * Ry = влево
Готово!
С точки зрения кода следующие две функции эквивалентны.