c# - 如何改变四元数的“角度”但保持其方向。(统一)
问题描述
我做了很多研究,但真的找不到我应该如何使用四元数来执行以下操作:
我有源方向和目标方向,我试图找到从一个方向到另一个方向的特定角度(例如 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
maxDegreesDelta。然后,它返回其中更接近from的任何一个:
from和to
Quaternion
之间的距离是maxDegreesDelta度数到
因此,与您对应的 s 示例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;
作为替代方案,您可以确定和之间的差异,target
并source
以角度(大小)和轴(方向)的形式表示 Quaternion.ToAngleAxis
:
Quaternion difference = Quaternion.Inverse(source) * target;
Vector3 differenceAxis;
float differenceAngle;
difference.ToAngleAxis(out differenceAngle, out differenceAxis);
然后,answer
通过 capping生产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;
推荐阅读
- javascript - mathjax 字体在移动设备中变小
- python - 从csv中查找不规则数据系列的最大梯度
- swift - 如何使用 char 从一个点到另一个点获取字符串的特定部分
- javascript - amcharts 为生成的图表配置标题和背景颜色以导出为 PDF
- .net - 在 Memorystream 中压缩和解压缩
- java - 如何收集/减少java 8流到pojo?
- apache - 如何在 Centos Apache 上使用不同端口在同一域上运行两个网站
- ruby-on-rails - 有条件地设置引导表单选择使用嵌入式 Ruby 选择的标记
- javascript - 美国专利商标局 API 请求不允许
- flutter - 如何添加分页功能 SliverList