Как повернуть голову персонажа вокруг векторов тела вверх и вправо? - PullRequest
0 голосов
/ 08 сентября 2018

Я пишу камеру в стиле шутера от первого лица и контроллер персонажей.Моя модель персонажа супер базовая - это прямоугольник для тела и куб для головы.У меня есть единственный сустав в голове, чтобы я мог вращать вокруг этого сустава.В Unity у меня камера привязана к голове, поэтому, куда бы она ни указывала, камера будет смотреть.

У меня есть один скрипт на C #, в котором я выполняю все свои переводы и поворотыдля персонажа и движения головы.Я предоставляю сценарий Transform моего сустава через редактор Unity.

Моя проблема в том, что всякий раз, когда я поворачиваю голову вокруг, как вертикально, так и горизонтально, голова начинает делать бочку.Голова будет вверх ногами или в любой ориентации.Я могу понять, почему - если я посмотрю налево, а затем посмотрю вверх, то при последующем взгляде назад вправо голова будет вращаться в странной ориентации для настоящей головы - она ​​начнет выполнять броски ствола.

Я пытался изменить код так, чтобы он «вращался» вокруг верхних и правых векторов тела моего персонажа, но это, похоже, ничего не меняет.Я все еще испытываю вращение бочки.

Я также пытался изменить относительное пространство от себя к миру, что «исправляет», пока мой персонаж стоит прямо в мире.Если мой персонаж начинает вращаться, то вращение головы начинает выглядеть странно.

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

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

private void ApplyHeadVerticalRotation()
{
    var amountX = (-Input.GetAxis("Mouse Y")) * Time.deltaTime * RotationSpeed;

    HeadJoint.Rotate(transform.right, amountX);
}

private void ApplyHeadHorizontalRotation()
{
    var amountY = Input.GetAxis("Mouse X") * Time.deltaTime * RotationSpeed;

    HeadJoint.Rotate(transform.up, amountY);
}

Редактировать:

Я имел в виду включить эту ссылку в код моего скрипта ...

1 Ответ

0 голосов
/ 09 сентября 2018

Вы сказали, что можете понять, почему это происходит, но вот отличный пост на эту тему на gamedev.stackexchange.
И вот быстрое решение: поверните голову горизонтально вокруг вектора тела вверх (в «пространстве тела») и поверните голову вертикально вокруг правого вектора головы (в «пространстве головы»). Здесь head является потомком body.

public Transform body;
public Transform head;   

public float rotationSpeed; 

void Update()
{
    var amountX = (-Input.GetAxis("Mouse Y")) * Time.deltaTime * rotationSpeed;
    var amountY =   Input.GetAxis("Mouse X")  * Time.deltaTime * rotationSpeed;

    head.Rotate(body.up,    amountY, Space.World);        
    head.Rotate(head.right, amountX, Space.World);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...