当前位置: 首页 > 知识库问答 >
问题:

四元数能代表360度以上的旋转吗?

傅星光
2023-03-14

我喜欢基于度数的Euler旋转,因此我可以为大量度数的动画设置关键帧,比如1000,并在对象上获得多个完整的360度旋转,以便设置旋转等。

然而,我现在正在做一件事,涉及两个不同轴之间的许多连续动画,我想我看到了万向锁的效果。当我执行其中一个链接动画时,我的对象在完成90度旋转后会继续翻转180度。这听起来像万向节锁吗?它只会在沿着不同的轴进行其他先前和成功的旋转之后发生。

在任何情况下,我都尝试过切换到四元数,但四元数似乎不适合这种旋转效果,因为它们只是给你一个方向,并使用以下方法将360的倍数视为0:

template <typename T>
 inline QuaternionT<T>  QuaternionT<T>::CreateFromAxisAngle(const Vector3<T>& axis, float radians)
 {
QuaternionT<T> q;
q.w = std::cos(radians / 2);
q.x = q.y = q.z = std::sin(radians / 2);
q.x *= axis.x;
q.y *= axis.y;
q.z *= axis.z;
return q;
}

四元数技术有可能实现360度以上的旋转吗?

共有1个答案

闾丘照
2023-03-14

你的情况听起来不像万向节锁。万向节锁是指你不能再向任何其他方向旋转,而是向一个方向旋转,因为你的轴彼此对齐*。听起来更像向量积会做的事情。无论如何,你不应该有任何问题,因为你只有两个轴,所以只要你选择合适的旋转顺序,万向节锁就不会有任何问题。

quats工作的原因是它们统一表示旋转空间,并且该空间没有多余的值。您可以每180到90度设置一次关键点,quats将正常工作。然而,它们不会像你现在这样插值。事实上,你不可能同时在多个轴上旋转,总是只有一个旋转在进行,同时旋转的欧拉角会一直保持第二个旋转方向。实现这一点的一种方法是均匀分割动画,并使用四元插值,但使用欧拉计算关键帧位置。另一种方法是在quat的长度中对旋转周期进行编码。

无论如何,结果都不一样,因为你不会得到欧拉摆动。

* you can visualize this by drawing rings at each axis orientation instead
  of your object and see how they move to overlap (like a gimbal hence the name).
 类似资料:
  • 问题内容: 我试图了解四元数旋转的工作原理,我发现了这个迷你教程http://www.julapy.com/blog/2008/12/22/quaternion- rotation/, 但是他做出了一些我不能锻炼的假设,就像我如何“ 简单地通过绕轴旋转矢量来计算绕轴的旋转矢量 ” 。 他如何计算angleDegreesX,angleDegreesY和angleDegreesZ? 有人可以提供可行的

  • 本文向大家介绍unity3d 四元数外观旋转,包括了unity3d 四元数外观旋转的使用技巧和注意事项,需要的朋友参考一下 示例 Quaternion.LookRotation(Vector3 forward [, Vector3 up])将创建一个四元数旋转,该旋转向前看“向下”向前的向量,并使Y轴与“向上”向量对齐。如果未指定up向量,Vector3.up则将使用。 旋转此游戏对象以查看目标游

  • 我正在尝试旋转一个与这三个元素相关的2D对象(在GTA风格的小地图覆盖中)。js摄像机旋转。我的3D场景中的y值。 问题是相机返回的弧度。旋转y值有点奇怪,从0开始 有人知道如何将这些值转换或翻译成360个坐标吗? 我用的是透视相机和轨道控制。 提前谢谢!

  • 问题内容: 我想将影像检视无限期旋转360度。 我该怎么做? 问题答案: 从早期答案编译而来的Swift 2.x无限期旋转UIView的方法: 更新Swift 3.x

  • 这是我当前的代码: 我一辈子都不知道如何旋转这个。我看了其他几个论坛,但没有其他机构讨论这个问题。 据我所知,没有办法旋转JPanel或JFrame,所以我运气不好吗? 这就是它现在的样子: 数字时钟 我想把它旋转90度。基本上是垂直的。 编辑:解决方案:

  • 我写了一个函数,它接受两个参数: > JPG图像作为3D数组 α给出的旋转度我的方法是: 公共静态整数[][]旋转(整数[][]img,双alpha){双rad=Math.toRadians(alpha);双sin=Math.sin(rad);双cos=Math.cos(rad); } 在固定索引范围的同时,输出是一个黑色的图像。我错过了什么?