【问题标题】:How to change the "angle" of a quaternion but keep its direction. (Unity)如何改变四元数的“角度”但保持其方向。 (统一)
【发布时间】:2019-06-11 05:05:48
【问题描述】:

我做了很多研究,但真的找不到我应该如何使用四元数来执行以下操作:

我有源方向和目标方向,我试图找到从一个方向到另一个方向的特定角度(例如 10 度)的四元数。

我正在尝试理解四元数并且也想避免万向节锁定,所以我需要一个不需要转换为欧拉角的答案。

我知道有 Slerp 功能,但它就像一个“百分比”而不是一个角度。另外我不确定如何找到源和目标之间的区别。

基本上我正在尝试执行以下操作,但使用四元数而不是向量:

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 功能非常相似,只是我想要一个恒定的运动,而不是一个快速而逐渐减慢的运动。由于万向节锁定,我也想避免使用欧拉角。

【问题讨论】:

    标签: c# unity3d quaternions


    【解决方案1】:

    考虑使用Quaternion.RotateTowards

    Quaternion.RotateTowards 接受 Quaternion fromQuaternion tofloat ma​​xDegreesDelta。然后,它返回更接近 from 的任何一个:

    1. fromto 之间的 Quaternionfrom 相差 ma​​xDegreesDeltafrom

    因此,与您对应的 Quaternions 示例可以写成:

    Quaternion source, target; //Lets pretend they are defined
    Quaternion reachedRotation = Quaternion.RotateTowards(source, target, 10f * Time.deltaTime);
    

    如果您需要到达点和source 之间的差异,您可以做一些四元数数学运算:

    Quaternion answer = Quaternion.Inverse(source) * midpoint;
    

    作为替代方案,您可以确定targetsource 之间的差异,并用Quaternion.ToAngleAxis 以角度(大小)和轴(方向)的形式表示:

    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);
    

    如果您想找到“包括”answersource 的旋转,只需将它们相乘(顺序很重要):

    reachedRotation = source * answer;
    

    作为旁注,您使用Vector3s 的示例可以写成:

    Vector3 source, target; //Lets pretend they are defined
    Vector3 answer = Vector3.MoveTowards(source, target, 10f * Time.deltaTime) - source;
    

    【讨论】:

    • 这是一个很好的答案!如果我需要它们,我将如何获得中间值?我想我可以用 Quaternion.Angle 得到角度。但不确定我将如何获得两者之间的四元数差异。 (所以我的例子中的 vect_dir 是四元数)。
    • @Marc477 我在回答中添加了一些关于此的内容。如果这不完全符合您的要求,请告诉我
    • @Marc477 我编辑了我的答案,以便更好地回答你写的问题
    • 这真是太棒了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 2011-04-19
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多