Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何更改;角度“;指四元数,但保持其方向。(团结)_C#_Unity3d_Quaternions - Fatal编程技术网

C# 如何更改;角度“;指四元数,但保持其方向。(团结)

C# 如何更改;角度“;指四元数,但保持其方向。(团结),c#,unity3d,quaternions,C#,Unity3d,Quaternions,我做了很多研究,但真的找不到我应该如何使用四元数来执行以下操作: 我有一个源方向和一个目标方向,我试图找到从一个方向到另一个方向的特定角度(比如10度)的四元数 我试图理解四元数,也希望避免万向节锁定,所以我需要一个不需要转换为欧拉角的答案 我知道有Slerp函数,但它像一个“百分比”而不是一个角度。另外,我不确定如何找到源和目标之间的差异 基本上我试着做以下工作,但是用四元数代替矢量: Vector3 source, target; //Lets pretend they are define

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

我有一个源方向和一个目标方向,我试图找到从一个方向到另一个方向的特定角度(比如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函数非常相似,只是我想要一个恒定的运动,而不是一个快速缓慢的运动。我还希望避免使用欧拉角,因为万向节锁。

考虑使用
四元数。向
旋转将
四元数
、四元数、以及一个
浮点
最大度数增量。然后,它从返回其中任何一个更接近

  • 四元数
    介于fromto之间,即maxDegreesDelta远离from

  • 因此,一个与您对应的
    四元数
    s的示例可以写成:

    Quaternion source, target; //Lets pretend they are defined
    Quaternion reachedRotation = Quaternion.RotateTowards(source, target, 10f * Time.deltaTime);
    
    如果需要到达点和
    源代码
    之间的差值,可以进行一些四元数计算:

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

    作为替代方案,您可以确定
    目标
    之间的差异,并以角度(幅度)和轴(方向)的形式表示:

    然后,通过对差异角度进行封顶,生成
    答案

    Quaternion answer = Quaternion.AngleAxis(Mathf.Min(differenceAngle, 10f * Time.deltaTime), differenceAxis);
    
    如果您想找到“包含”
    答案
    的旋转,只需将它们相乘(顺序很重要):


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

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

    这是一个很好的答案!如果需要,如何获取中间值?我想我可以用四元数得到角度。但我不确定如何得到这两者之间的四元数差。(所以我的例子中的向量是四元数)。@Marc477我在我的答案中增加了一点。如果不符合你的要求,请告诉我for@Marc477我编辑了我的答案,以便更好地回答你的问题。这真是太棒了!
    reachedRotation = source * answer;
    
    Vector3 source, target; //Lets pretend they are defined
    Vector3 answer = Vector3.MoveTowards(source, target, 10f * Time.deltaTime) - source;