如何更改四元数的 "angle" 但保持其方向。 (统一)
How to change the "angle" of a quaternion but keep its direction. (Unity)
我做了很多研究,但真的找不到我应该如何使用四元数来执行以下操作:
我有源方向和目标方向,我试图找到从一个方向到另一个方向的特定角度(例如 10 度)的四元数。
我想了解四元数,也想避免万向节锁定,所以我需要一个不需要转换为欧拉角的答案。
我知道有 Slerp 函数,但它像 "percentage" 而不是角度。另外我不确定如何找到源和目标之间的区别。
基本上我正在尝试执行以下操作,但使用四元数而不是向量:
Vector3 source, target; //Lets pretend they are defined
Vector3 vect_dir = target - source;
float vect_length = Mathf.Min(10f * Time.deltaTime, vect_dir.magnitude);
Vector3 answer = vect_dir.normalized * vect_length;
有人知道如何对四元数做同样的事情吗?我的想法是输入我选择的速度值(示例中为 10)。
它与使用 Slerp 功能非常相似,不同之处在于我想要一个恒定的运动,而不是一个快速并逐渐减慢的运动。由于万向节锁定,我也想避免使用欧拉角。
考虑使用 Quaternion.RotateTowards
Quaternion.RotateTowards
从 Quaternion
,Quaternion
到 ,以及 float
maxDegreesDelta。然后,它 returns 哪个更接近 from:
from和to之间的Quaternion
即maxDegreesDelta 度距 from
到
因此,对应于您的 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
:[=34 以角度(大小)和轴(方向)形式表示=]
Quaternion difference = Quaternion.Inverse(source) * target;
Vector3 differenceAxis;
float differenceAngle;
difference.ToAngleAxis(out differenceAngle, out differenceAxis);
然后,通过封顶 differenceAngle
:
产生 answer
Quaternion answer = Quaternion.AngleAxis(Mathf.Min(differenceAngle, 10f * Time.deltaTime), differenceAxis);
如果你想找到从 "including" answer
到 source
的旋转,只需将它们相乘(顺序很重要):
reachedRotation = source * answer;
作为旁注,您的带有 Vector3
的示例可以写成:
Vector3 source, target; //Lets pretend they are defined
Vector3 answer = Vector3.MoveTowards(source, target, 10f * Time.deltaTime) - source;
我做了很多研究,但真的找不到我应该如何使用四元数来执行以下操作:
我有源方向和目标方向,我试图找到从一个方向到另一个方向的特定角度(例如 10 度)的四元数。
我想了解四元数,也想避免万向节锁定,所以我需要一个不需要转换为欧拉角的答案。
我知道有 Slerp 函数,但它像 "percentage" 而不是角度。另外我不确定如何找到源和目标之间的区别。
基本上我正在尝试执行以下操作,但使用四元数而不是向量:
Vector3 source, target; //Lets pretend they are defined
Vector3 vect_dir = target - source;
float vect_length = Mathf.Min(10f * Time.deltaTime, vect_dir.magnitude);
Vector3 answer = vect_dir.normalized * vect_length;
有人知道如何对四元数做同样的事情吗?我的想法是输入我选择的速度值(示例中为 10)。 它与使用 Slerp 功能非常相似,不同之处在于我想要一个恒定的运动,而不是一个快速并逐渐减慢的运动。由于万向节锁定,我也想避免使用欧拉角。
考虑使用 Quaternion.RotateTowards
Quaternion.RotateTowards
从 Quaternion
,Quaternion
到 ,以及 float
maxDegreesDelta。然后,它 returns 哪个更接近 from:
from和to之间的
Quaternion
即maxDegreesDelta 度距 from到
因此,对应于您的 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
:[=34 以角度(大小)和轴(方向)形式表示=]
Quaternion difference = Quaternion.Inverse(source) * target;
Vector3 differenceAxis;
float differenceAngle;
difference.ToAngleAxis(out differenceAngle, out differenceAxis);
然后,通过封顶 differenceAngle
:
answer
Quaternion answer = Quaternion.AngleAxis(Mathf.Min(differenceAngle, 10f * Time.deltaTime), differenceAxis);
如果你想找到从 "including" answer
到 source
的旋转,只需将它们相乘(顺序很重要):
reachedRotation = source * answer;
作为旁注,您的带有 Vector3
的示例可以写成:
Vector3 source, target; //Lets pretend they are defined
Vector3 answer = Vector3.MoveTowards(source, target, 10f * Time.deltaTime) - source;