Какой поворот показывается в Инспекторе? - PullRequest
0 голосов
/ 08 февраля 2019

Нагрудную кость моего игрока можно вращать во время прицеливания.

Теперь я хотел оценить, насколько (минимальное и максимальное вращение) я должен позволить сундуку вращаться.

Для выполнениято есть я разрешил все степени поворота и взглянул на инспектора.

Например, минимальное значение, по которому сундук должен вращаться влево, должно быть Y = -15.При Y = -15 (видно в Инспекторе) оно все еще выглядело естественным.

Теперь я хотел закодировать это.

К моему удивлению, chest.localRotation.Y было совершенно другим значениемчем то, что показывает инспектор.

Затем я взглянул на переменную сундука и расширил представление.Я просто не вижу значения вращения, которое показывает Инспектор.

Как мне поступить в этом случае, пожалуйста?

Я использую это для поворота кости:

Chest.LookAt(ChestLookTarget.position); 
Chest.rotation = Chest.rotation * Quaternion.Euler(Offset);

Спасибо!enter image description here

1 Ответ

0 голосов
/ 08 февраля 2019

Причина, по которой он не работает:

Quaternion - это не понятное человеку значение.

Один Quaternion всегда уникален, но может иметьнесколько (бесконечных?) разных представлений в Euler пространстве!И наоборот, один Euler всегда представляет ровно одно Quaternion значение.

Если вы посмотрите на документы, в нем явно сказано:

Не изменяйте это напрямую, если вы не знаетекватернионы наизнанку.


Чем, как сказано, то, что вы видите в инспекторе, это localRotation по отношению к родителю Transform.

Лучше сказать, это один из многих возможных Euler входов, которые приводят к Quaternion.То, что вы видите в отладке на localEulerAngles, является другим возможным представлением Euler.Unity обычно в localEulerAngles также дает вам только значения > 0.


Кажется, что сундук в любом случае будет вращаться только вокруг оси Y, верно?

Если этоВ этом случае вы можете просто получить угол между исходным вектором сундука вперед и целью.Обрабатывать Vector3 значения намного проще, чем Quaternion с;)

Кажется, что тот же вариант использования, что и в в этом посте

// get the target direction
Vector3 targetDir = ChestLookTarget.position - Chest.position;

// Reset any difference in the Y axis
// since it would change the angle as well if there was a difference I the height
// between the two objects
targetDir.y = 0;

// however you currently rotate
// instead rotate only the Vector3 variable without applying it to the transform yet
Vector3 newDir = Vector3.RotateTowards(Chest.forward, targetDir, RotationSpeed * Time.deltaTime, 0.0f);

// Compare the target direction to the parents forward vector
float newAngle = Vector3.Angle(Chest.parent.transform.forward, newDir);

if (newAngle > MaxRotationAngle)
{
    // What should happen if angle gets bigger?
    return;
}

// If angle still okey set the new direction
Chest.rotation = Quaternion.LookRotation(newDir);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...