Углы связанной системы координат

From Valve Developer Community
< Ru
Jump to navigation Jump to search
English (en)Deutsch (de)Русский (ru)中文 (zh)Translate (Translate)

QAngle 'это C++ класс в Source представляющий трёхмерные углы вращения в неподвижной системе координат в соотствестии с правилом правой руки от основной оси Z.

Каждый QAngle содержит три значения векторного вращения:

Оси

Y

Тангаж (наклон) +вниз/-вверх

Z

Рысканье (поворот) +влево/-вправо

X

Крен (отклонение) +направо/-налево

В id Tech 2 id Tech 2, и следовательно в GoldSrc GoldSrc, Source Source и Source 2 Source 2, используется Y Z X = Тангаж (Pitch), Рысканье (Yaw), Крен (Roll), следовательно (-45,10,0) означает 45° вверх, 10° влево и 0° крена направо.


Tip.pngСовет: Оси иногда называют rX, rY и rZ, чтобы отличать их от вектора(en) в декартовых осях.
Note.pngПримечание: Крен ограничен значениями +50/-50 для угла обзора игрока.

Объявление

C++

QAngle angMyAngle = QAngle(-45,10,0);
  • Можно задавать значения X, Y и Z отдельно.
Warning.pngВозможна путаница:The variables refer to the placement in the array, not the axis they rotate around, so eg. Y means Yaw, not Pitch![подтвердить]
  • Префикс ang (или просто a) используется для обозначения переменной угла.


CS_Script

type QAngle = { pitch: число, yaw: число, roll: число };

Направление в пространстве

Чтобы понять, как работает QAngle(Qx, Qy, Qz), представьте вид от первого лица:

Qx: Взгляд вниз или вверх соответствует положительному или отрицательному значению [Y] соотвественно
Qy: Взгляд влево или вправо соответствует положительному или отрицательному значению [Z] соотвественно
Qz: Наклон головы так, чтобы правое или левое ухо было ближе земле, соответствует положительному или отрицательному значению [X] соотвественно

Чтобы соотнести это с векторами и координатами: значения [X], [Y] и [Z] соответствуют вращению по часовой стрелке (в градусах) вокруг осей y, z и x неподвижной системы координат[подтвердить] соотвественно.

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

Соглашения об именовании

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

Авиация

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

В авиации, такая система называется углами Эйлера, в то время как QAngles - углы относительного вращения. Смотрите "Математика" для понимания различия.

Математика

Строго говоря, QAngles можно было бы определить как внешние вращения Тейта-Брайана, в соответствии с правилом правой руки. Однако термины "углы Тейта-Брайана" и "углы Эйлера" иногда используются как взаимозаменяемые. Рассмотрим эти термины в более понятных составляющих:
  • Отличие внутренних и врешних вращений, заключается в том, что в первом случае каждое вращение смещает оси вместе с ним
  • Отличие действительных углов Эйлера и углов Тайта-Брайана, заключается в том, что в первом случае вращение отсчитывается дважды вокруг одной оси и один раз вокруг другой (попеременно), в то время как во втором случае вращение отсчитывается один раз вокруг всех трех осей
  • Правило правой руки гласит, что если большой палец правой руки человека направлен вдоль положительного направления оси, то остальные пальцы будут сгибаться в положительном направлении вращения
Tip.pngСовет: Поскольку разнородные определения используются одновременно, однозначная формулировка наиименования позволяет избежать путаницы

Камеры
When talking about cameras the terms Tilt (up/down), Pan (left/right) and Roll (slant left/right) is used for camera (Gimbal) rotations. This is likely the reason why QAngle uses YZX coordinates.

Преобразование из Вектора

Так как для углов не определён специальный ключ-параметр описания данных(en), созданные в Hammer данные будут считываться как вектор(en). Его ординаты будут представлять градусы поворота, а не координаты, поэтому их необходимо конвертировать перед использованием:

QAngle angMyAngle = QAngle(vecFromHammer.x, vecFromHammer.y, vecFromHammer.z);

// Преобразование обратно в вектор, при необходимости
AngleVectors(angMyAngle, &vecFromHammer);
Note.pngПримечание: Результатом функции AngleVectors() является нормированный вектор(en) (значение ограничено 1 единицей)

Реализация

Смотрите также