Я обертаю свого ігрового персонажа, щоб спостерігати за ціллю, використовуючи наступний код:
transform.rotation = Quaternion.Slerp(startQuaternion, lookQuaternion, turningNormalizer*turningSpeed/10f)
startQuaternion - поточне обертання персонажа, коли задано нову ціль.
lookQuaternion - це напрямок, на який повинен дивитися персонаж, і він встановлений так:
destinationVector = currentWaypoint.transform.position - transform.position;
lookQuaternion = Quaternion.LookRotation(destinationVector, Vector3.up);
turnNormalizer просто Time.deltaTime
збільшується і turningSpeed
є статичним значенням, заданим у редакторі.
Проблема полягає в тому, що, хоча персонаж повертається так, як слід, більшу частину часу, у нього виникають проблеми, коли він повинен робити близько 180 градусів. Тоді він часом тремтить і дзеркально обертає:
У цьому погано намальованому зображенні персонаж (праворуч) починає повертатися до кола зліва. Замість того, щоб просто повернути ліворуч або праворуч, він починає цей "дзеркальний танець":
- Він починає обертатись до нового облицювання
- Потім він раптово забивається під тим же кутом, але з іншого боку і продовжує обертатися
Робить це "дзеркальне відображення" так довго, поки не дивиться на ціль. Це справа з кватерніонами, сперпінгами / лерпінгами чи чимось іншим?
EDIT1: Мабуть, проблема не виникає внаслідок самого обертання. Більш ймовірною проблемою є те, що персонаж рухається в бік обличчя під час обертання. Оскільки обмеження кута між обличчям та ціллю, коли символу дозволяється рухатися, зменшується і часом виключає обертання / дзеркальне обертання.
Це, звичайно, викликає більше питань, чому персонаж не може одночасно рухатися і обертатися без проблем? Код, що використовується для руху:
transform.Translate(Vector3.forward * runningSpeed/10f * Time.deltaTime);