Quaternion.RotateTowards
принимает Quaternion
от , Quaternion
до иfloat
maxDegreesDelta .Затем он возвращает значение, которое ближе к с :
Quaternion
между с и до то есть maxDegreesDelta градусов от от
до
Таким образом, пример с Quaternion
s, который соответствует вашему, может быть записан так:
Quaternion source, target; //Lets pretend they are defined
Quaternion reachedRotation = Quaternion.RotateTowards(source, target, 10f * Time.deltaTime);
Если вам нужна разница между достигнутой точкой и source
, вы можете выполнить некоторую кватернионную математику:
Quaternion answer = Quaternion.Inverse(source) * midpoint;
В качестве альтернативы вы можете определить разницу между target
и source
и выразить ее в форме угла (величины) и оси (направления) с помощью Quaternion.ToAngleAxis
:
Quaternion difference = Quaternion.Inverse(source) * target;
Vector3 differenceAxis;
float differenceAngle;
difference.ToAngleAxis(out differenceAngle, out differenceAxis);
А затем выведите answer
, нажав differenceAngle
:
Quaternion answer = Quaternion.AngleAxis(Mathf.Min(differenceAngle, 10f * Time.deltaTime), differenceAxis);
И если вы хотите найти поворот, который получается в результате «включения» answer
наsource
, просто умножьте их (порядок важен):
reachedRotation = source * answer;
Как пример, ваш пример с Vector3
s может быть записан как:
Vector3 source, target; //Lets pretend they are defined
Vector3 answer = Vector3.MoveTowards(source, target, 10f * Time.deltaTime) - source;