问题标签 [euler-angles]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
4737 浏览

math - 基于四元数的 3D 相机应该累积四元数还是欧拉角?

所以我编写了一个面向新程序员的基于四元数的 3D 相机,因此他们非常容易集成和开始使用。

在我开发它时,起初我会将用户输入作为欧拉角,然后根据该帧的输入生成一个四元数。然后,我将获取相机的四元数并将其乘以我们为输入生成的四元数,理论上这应该只是将输入旋转添加到相机旋转的当前状态,然后一切都会变得又胖又快乐。让我们称之为:累积四元数,因为我们只存储和添加四元数。

但我注意到这种方法存在问题。我使用它的次数越多,即使我只在一个欧拉角上旋转,比如 Yaw,它也会在一些迭代中开始流血到另一个,比如 Pitch。这是轻微的,但相当不可接受。

所以我做了更多的研究,发现一篇文章说累积欧拉角更好,所以相机将它的当前旋转存储为欧拉角,并且输入只是在每一帧添加到它们。然后我每帧从它们生成一个四元数,然后用来生成我的旋转矩阵。这解决了旋转渗入不当轴的问题。

那么有任何 Stackoverflow 成员对这个问题有任何见解吗?这是一种正确的做事方式吗?

0 投票
7 回答
12622 浏览

user-interface - 欧拉角与四元数 - 内部存储和呈现给用户之间的紧张关系引起的问题?

四元数可以说是在内部表示对象旋转的合适选择。它们可以简单有效地插值并明确表示单个方向。

但是,在用户界面中呈现四元数通常是不合适的 - 欧拉角通常对用户来说更熟悉,并且它们的值更直观和可预测。

欧拉角在代码级别受到复杂影响 - 它们需要存储旋转顺序,并且使用此顺序和相关角度组成实际方向(无论是矩阵还是四元数)至少可以说很麻烦。

使用四元数表示最方便地执行可靠插值 - 那么这是否意味着我们必须在欧拉表示和四元数表示之间不断转换?这在性能方面可行吗?

我们可以将方向存储为四元数并将它们转换为仅显示给用户吗?这可能是不可能的,因为对于任何给定的方向,只有一个四元数表示,但有许多欧拉表示。我们如何“挑选”对应于最初定义该方向的欧拉表示?这似乎是一项不可能完成的任务——我们在转换为四元数时实际上已经丢失了信息。

我们可以存储为欧拉角,然后根据需要转换为四元数吗?这可能是不可扩展的——从欧拉角到四元数的转换、插值,然后再转换回来可能是相对昂贵的代码。

我们可以简单地存储这两种表示并使用最适合任何给定情况的表示吗?内存方面的大量成本(想象一下具有大约 60 根骨骼的骨骼的动画曲线)并保持这些值同步可能会很昂贵,或者至少很麻烦。

有没有人看到、使用或提出过任何聪明的解决方案?上面的三个选项肯定不是唯一的吗?还有其他类似的问题域已经解决了吗?

0 投票
8 回答
23189 浏览

language-agnostic - 是否有将四元数旋转转换为欧拉角旋转的算法?

是否存在将旋转的四元数表示转换为欧拉角表示的现有算法?欧拉表示的旋转顺序是已知的并且可以是六种排列中的任何一种(即xyz、xzy、yxz、yzx、zxy、zyx)。我见过固定旋转顺序的算法(通常是 NASA 航向、倾斜、滚动约定),但不是任意旋转顺序的算法。

此外,由于单个方向存在多个欧拉角表示,因此该结果将是模棱两可的。这是可以接受的(因为方向仍然有效,只是可能不是用户期望看到的方向),但是如果有一种算法可以接受旋转限制(即自由度数和考虑到每个自由度的限制)并在给定这些约束的情况下产生“最合理的”欧拉表示。

我感觉这个问题(或类似问题)可能存在于 IK 或刚体动力学领域。


澄清一下——我知道如何从四元数转换为所谓的“ Tait-Bryan ”表示——我称之为“NASA”约定。这是 zxy 的旋转顺序(假设“Z”轴向上的约定)。我需要一个所有轮换顺序的算法。

那么,可能的解决方案是采用 zxy 顺序转换并从中派生五个其他旋转顺序的其他转换。我想我希望有一个更“总体”的解决方案。无论如何,我很惊讶我无法找到现有的解决方案。

此外,这也许应该是一个单独的问题,任何转换(当然假设已知的旋转顺序)都会选择一个欧拉表示,但实际上有很多。例如,给定 yxz 的旋转顺序,两个表示 (0,0,180) 和 (180,180,0) 是等价的(并且会产生相同的四元数)。有没有办法使用自由度限制来约束解决方案?就像你在 IK 和刚体动力学中所做的那样?即在上面的例子中,如果围绕 Z 轴只有一个自由度,那么可以忽略第二个表示。


我在这个 pdf中找到了一篇可能是算法的论文,但我必须承认我发现逻辑和数学有点难以理解。当然还有其他解决方案吗?任意轮换顺序真的那么罕见吗?当然,每个允许骨骼动画和四元数插值的主要 3D 软件包(即 Maya、Max、Blender 等)都必须完全解决这个问题?

0 投票
4 回答
33457 浏览

math - 计算旋转以查看 3D 点?

我需要计算 3D 对象面对任意 3D 点的 2 个角度(偏航和俯仰)。这些旋转被称为“欧拉”旋转,仅仅是因为在第一次旋转之后(假设 Z,基于下图),Y 轴也随着对象旋转。

这是我正在使用的代码,但它不能完全工作。在地平面 (Y = 0) 上,对象正确旋转以面对该点,但是一旦我在 Y 中向上移动该点,旋转看起来不正确。

你知道如何计算给定一个点的 2 个欧拉角吗?


下图显示了我旋转的方式。这些是我需要计算的角度。(唯一的区别是我按 X、Y、Z 的顺序旋转对象,而不是 Z、Y、X)

图片

在此处输入图像描述


这是我的系统。

  • 坐标系是 x = 向右,y = 向下,z = 更靠后
  • 默认情况下,对象位于 (0,0,1),它面向后
  • 旋转的顺序是 X、Y、Z,其中在 X 上的旋转是俯仰,Y 是偏航,Z 是滚动

我的系统

0 投票
3 回答
28219 浏览

c# - 将欧拉转换为矩阵和矩阵转换为欧拉

我正在尝试使用 .NET/C# 将用欧拉角描述的 3D 旋转转换为矩阵,然后返回。我的约定是:

  • 左手系统(x 右,y 上,z 向前)
  • 旋转顺序:绕 y 航向,绕 x 俯仰,绕 z 倾斜
  • 使用左手规则旋转是正数(拇指指向+无穷大)

我的试验是:

欧拉到矩阵(为了简化,我删除了 x、y、z 转换部分)

欧拉矩阵

一定是错的。如果我取 3 个角度,将它们转换为矩阵并将矩阵转换回角度,如果结果与初始值不同。

I have browsed several sites with different formulas, starting with euclideanspace.com, but I'm now completely lost, and can't find the right computations. I' appreciate a little help. Is there a mathematician onboard?

0 投票
1 回答
1832 浏览

math - 欧拉角和四元数方向

如何仅将 wintracker II 设备的四元数方向输出转换为欧拉角输出。因为 Wintracker II 设备输出欧拉角和四元数方向。我只想输出欧拉角。

0 投票
2 回答
3321 浏览

c# - 将本地四元数旋转转换为全局(陀螺仪)

我需要一种方法来从本地获取在全局参考系中旋转的欧拉角。我正在使用 c#、wpf 3d 和陀螺仪。我在屏幕上有一个地球仪,它应该以与陀螺仪相同的方式移动。由于陀螺仪发送相对于自身的运动,我需要使用四元数来保持对象的状态并更新它,但我被卡住了。如果我执行以下操作:

IT 在一个轴上正确旋转。当我在一个方向上由 A 旋转,然后在另一个方向上由 B 旋转时,物体和陀螺仪的旋转不再是相同的方向,因为上述适用于绝对旋转(相对于世界)。

例如:

这是有效的,因为我总是在全局轴上通过键盘增加滚动、俯仰、偏航,即键盘值。陀螺仪在 LOCAL 轴上发送旋转。

切换四元数旋转的顺序无济于事

0 投票
1 回答
273 浏览

math - 我可以使用哪些欧拉旋转?

我有两个笛卡尔坐标。有 xyz 和 BIG XYZ。我想让它们彼此平行。例如,x 与 X 平行,y 与 Y 平行,z 与 Z 平行。我使用旋转矩阵,但我有很多不同的旋转矩阵。例如,我在 xyz 笛卡尔坐标中有 3D 点,称为 A,我想将笛卡尔坐标更改为 BIG XYZ,并在该坐标中找到相同的 3D 点,称为 B。直到现在还可以。但是当我使用不同的旋转矩阵时,点发生了变化。我能做些什么?我可以使用哪些欧拉旋转?

0 投票
1 回答
975 浏览

math - 如何改变坐标的手性?

如何从欧拉坐标 E1 = (x1, y1, z1, yaw1, pitch1, roll1) 转换为 E2 = (x2, y2, z2, yaw2, pitch2, roll2) 其中 x, y, z 是一个点的坐标,并且偏航,俯仰,滚动以原点为原点的矢量的方向/方向。yaw 围绕 y,pitch 围绕 x,roll 围绕 z。它们按该顺序执行。偏航 0 垂直于平面 xy(与 E1 中的 z 相反,等于 E2 中的 z)。

E1 使用右手空间,E2 使用左手空间。两者具有相同的原点,y(顶部)和 z(进入屏幕)的方向相同。它们的区别在于 x 位于 E1 的左侧和 E2 的右侧。它们的正转方向也不同。

我有一个自定义类型来保存标量表示并从和转换为等效的 WPF Matrix3d 表示。

0 投票
5 回答
2296 浏览

math - 3D 数学:从 Look 和 Up 正交向量计算倾斜(滚动)角

我希望这是提出这个问题的正确位置,它与这个问题相同,但表示为纯数学而不是图形(至少我希望我将问题正确地转换为数学)。

考虑:

  • 两个正交向量:Up (ux, uy, uz) 和 Look (lx, ly, lz)
  • 垂直于 Look 的平面 P(因此包括 Up)
  • Y1 是 Y(垂直轴)沿 Look 到 P 的投影

问题:Y1和Up之间的角度值是多少?

正如数学家会同意的那样,这是一个非常基本的问题,但至少两周来我一直在摸不着头脑,无法想象如何将 Y 投影到 P 上……也许现在太老了,无法找到学校练习的解决方案。

我正在寻找三角解决方案,而不是使用矩阵的解决方案。谢谢。

编辑:我发现我需要确定角度的符号,相对于必须是 Look 的旋转轴。我在链接的问题上发布了最终代码(请参阅上面的链接)。感谢那些帮助过的人。我很感激你的时间。