Нежелательное вращение игрока по оси Y - PullRequest
2 голосов
/ 12 мая 2019

Любой гений Quaternion может сказать мне, что не так с моим кодом?У меня есть скрипт PlayerRotation, который выполняет две вещи:

Поворот оси игрока по локальной оси

Выравнивание игрока по нормали поверхности

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

input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
Vector2 inputDir = input.normalized;
//Angle part
if (inputDir != Vector2.zero)
{
    targetAngle = Mathf.Atan2(input.x, input.y) * Mathf.Rad2Deg + cam.eulerAngles.y;
    Quaternion localRotation = Quaternion.Euler(0f, targetAngle - lastTargetAngle, 0f);
    transform.rotation = transform.rotation * localRotation;
    lastTargetAngle = targetAngle;
}
//Raycast part
if (Physics.Raycast(transform.position - transform.up * start, -transform.up, out hit, end))
{
    Quaternion targetRotation = Quaternion.FromToRotation(transform.up, hit.normal);
    transform.rotation = targetRotation * transform.rotation;
}         

После многих поправок сделан вывод, что проблема, кажется, исходит от части радиопередачи, но я не понимаю, почему

1 Ответ

0 голосов
/ 13 мая 2019

Мой опыт работы с Quaternions в значительной степени ограничен использованием FromToRotation и LookRotation, а также методом проб и ошибок, пока я не получу его работу, так что я не очень разбираюсь в Quaternions, но я думаю, что вот что происходит:

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

enter image description here

Что вам нужно сделать, это либо вычислить вращение от текущего направления вверх к нормали поверхности, либо сделать что-то, как я делал ниже, что довольно легко понять:

Используйте ваше текущее вращение, чтобы определить направление, в котором вы хотите смотреть

lookDirection = transform.rotation * Vector3.forward

И используйте ваш targetRotation, чтобы определить направление, в котором вы хотите быть

upDirection = targetRotation * Vector3.up

И вычислите ваше окончательное вращение, используя Quaternion.LookRotation

LookRotation (вектор3 вперед, вектор3 вверх)

В результате ваш блок raycast выглядит так:

Quaternion targetRotation = Quaternion.FromToRotation(transform.up, hit.normal);
transform.rotation = Quaternion.LookRotation(transform.rotation * Vector3.forward, targetRotation * Vector3.up);

РЕДАКТИРОВАТЬ: Я в Uni, используя мой дерьмо, поэтому я еще не проверял это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...