gpt4 book ai didi

c# - 如何更改四元数的 "angle"但保持其方向。 (统一)

转载 作者:行者123 更新时间:2023-11-30 22:54:08 29 4
gpt4 key购买 nike

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

我有源方向和目标方向,我试图找到从一个方向到另一个方向的特定角度(例如 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 功能非常相似,不同之处在于我想要一个恒定的运动,而不是一个快速并逐渐减慢的运动。由于万向节锁定,我还想避免使用欧拉角。

最佳答案

考虑使用 Quaternion.RotateTowards

Quaternion.RotateTowards 需要一个Quaternion from,一个Quaternion to,和一个float ma​​xDegreesDelta。然后,它返回其中最接近 from 的一个:

  1. fromto 之间的四元数,与from 相差ma​​xDegreesDelta

因此,对应于您的 Quaternion 的示例可以这样写:

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;

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

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

关于c# - 如何更改四元数的 "angle"但保持其方向。 (统一),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56536814/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com