c# - Unity 中的四元数
问题描述
我正在用 Unity 和 C# 编写一个 3D 的 6DOF 太空射击游戏。我正在使用鼠标和键盘进行移动。使用鼠标,我使用 Quarterions 在 X、Y 和 Z 轴上进行旋转。
我尝试了以下代码:
void Update()
{
float test = Input.GetAxis("Pitch");
float test2 = Input.GetAxis("Yaw");
float test3 = Input.GetAxis("Roll");
rotX += test;
Quaternion q1 = Quaternion.AngleAxis(rotX, Vector3.right);
rotY += test2;
Quaternion q2 = Quaternion.AngleAxis(rotY, Vector3.up);
roll += test3;
Quaternion q3 = Quaternion.AngleAxis(roll, Vector3.forward);
transform.rotation = q1 * q2 * q3;
}
该代码有效,但不适用于所有角度。看起来每 90 度的移动都不正确(x 轴和 y 轴转动)。我希望这段代码适用于每个角度,这段代码有什么问题?
解决方案
您正在使用绝对(世界)向量作为参考框架。将 Vector3.up 更改为 transform.up,将 Vector3.forward 更改为 transform.forward,将 Vector3.right 更改为右变换,这样您将沿局部轴旋转,并且云台锁定问题应该较小。
操作顺序仍然很重要,但对于相对较小的增量,它应该按预期工作。
我认为您在分配新旋转之前将四元数相乘是正确的,否则每个局部向量都会随着每次操作而改变 - 行为会略有不同
推荐阅读
- python - 使用 numpy.load 随机选择的文件加载时间比顺序文件要长
- python - 在Python中将两个不同数组的第一个元素合并为一个数组
- r - R从列表中迭代DataFrame列,错误:选择了未定义的列
- javascript - 选择构建文本列表 HTML 的项目
- reactjs - React:更新数组中的多个对象变量
- c# - 使用 Azure Function V3,如何将现有的 Ilogger 注入到新的类文件中?
- typescript - 如何将 Object 转换为 Formgroup?
- python - 从 TinyDB 列出文档 ID
- python - 有没有办法在绘图中改变旭日形图中层的厚度
- python - 迭代地理数据框时更改几何图形