Мой опыт работы с Quaternions в значительной степени ограничен использованием FromToRotation
и LookRotation
, а также методом проб и ошибок, пока я не получу его работу, так что я не очень разбираюсь в Quaternions, но я думаю, что вот что происходит:
Вы обнаруживаете вращение между нормалью поверхности и вектором вверх и затем добавляете это к вашему текущему вращению. Проблема заключается в том, что даже если ваше текущее вращение уже выровнено с нормалью поверхности, вы все равно добавляете это вращение, вызывая его чрезмерное вращение.
![enter image description here](https://i.stack.imgur.com/xOXke.jpg)
Что вам нужно сделать, это либо вычислить вращение от текущего направления вверх к нормали поверхности, либо сделать что-то, как я делал ниже, что довольно легко понять:
Используйте ваше текущее вращение, чтобы определить направление, в котором вы хотите смотреть
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, используя мой дерьмо, поэтому я еще не проверял это.