问题标签 [quaternions]

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 投票
8 回答
38254 浏览

c++ - C/C++ 中的四元数库

在 C/C++ 中有什么好的四元数计算库吗?

旁注:任何好的教程/示例?我已经用谷歌搜索并浏览了前几页,但也许你有一些来自 compsci 或数学课程的演示/实验室,你可以/愿意分享?

谢谢

0 投票
3 回答
2344 浏览

math - 帮我解决刚体物理/变换

我想实例化一个滑块约束,它允许一个物体在 A 点和 B 点之间滑动。为了实例化约束,我将两个物体分配给约束,在这种情况下,一个动态物体被约束到静态世界,想想滑动门. 第三个和第四个参数是变换,参考帧 A参考帧 B。为了创建和操作变换,该库支持四元数、矩阵和欧拉角。

默认滑块约束沿 x 轴滑动主体。我的问题是: 我如何设置这两个变换,以便身体 B 沿着由它自己的原点和空间中的一个附加点给出的轴滑动?

我天真地尝试过:

然而,四元数似乎并没有像我预期的那样工作。我对它们的数学知识不好,所以如果有人能告诉我为什么这不起作用,我将不胜感激。发生的情况是身体沿着与方向正交的轴滑动。当我在四元数构造函数中改变旋转部分时,主体围绕该滑动方向旋转。

编辑: 框架是子弹物理。这两个转换是滑块关节如何相对于每个身体的局部坐标系附加在每个身体上。

Edit2 我还可以通过正交基设置变换的旋转部分,但是我必须可靠地从单个向量构造正交基。我希望四元数能阻止这种情况。

Edit3 我在以下过程中取得了一些有限的成功:

但是,GramSchmidt 总是翻转 trafoB 矩阵的某些轴,并且门出现颠倒或从右到左。我希望有一种更优雅的方式来解决这个问题。 Edit4 我找到了一个解决方案,但是如果顶部向量与滑动方向对齐,我不确定这是否会导致约束求解器出现奇点:

0 投票
3 回答
4772 浏览

opengl - 旋转的四元数数学?

我正在gluDisk()我的场景中绘制一个平面磁盘。gluDisk()绘制面向正 Z 轴的磁盘,但我希望它面向我拥有的任意法线。
显然我需要用它glRotate()来让磁盘正确面对,但应该是什么旋转?我记得这可以使用四元数计算,但我似乎不记得数学。

0 投票
4 回答
2350 浏览

opengl - 有人可以解释我如何使用 Quanternions 像 FPS 一样使用鼠标环顾四周吗?

昨天我问:简单地调用 Pitch 和 Yaw 怎么会导致相机滚动?

基本上,我发现是因为“Gimbal Lock”,如果你俯仰+偏航,你将不可避免地产生滚动效果。有关更多信息,您可以阅读该问题。

我正试图阻止这种情况发生。当您在普通的 FPS 射击游戏中环顾四周时,您的相机不会到处滚动!

这是我当前的被动鼠标功能:

这会导致相机根据鼠标移动进行俯仰/偏航(同时将光标保持在中心)。我还在这里发布了我原来的相机课程。

该线程中的某个人建议我使用四元数来防止这种效果发生,但在阅读了关于它们的维基百科页面后,我根本不了解它们。

如何在我的 OpenGL/Glut 应用程序中创建四元数,这样我就可以正确地让我的“相机”环顾四周而不会出现不必要的滚动?

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 投票
9 回答
100981 浏览

math - 找到表示从一个向量到另一个向量的旋转的四元数

我有两个向量 u 和 v。有没有办法找到代表从 u 到 v 的旋转的四元数?

0 投票
1 回答
3955 浏览

rotation - Gmod 表达式中的空间旋转2

我正在使用 expression2 对 Garry 的 mod 中的行为进行编程。Expression2存档链接

好吧,开个先例。在 Gmod 中,我有一个块,我完全不知道如何让它围绕 3 个上、下和右矢量旋转(这是局部的。即;如果我将它倾斜 45 度,则前向矢量为 0.707、0.707、 0)。从本质上讲,我希望能够从 3 个向量中获得本地 Pitch/Roll/Yaw。Local Pitch Roll Yaw 我的意思是它们完全相互独立,允许真正的 3d 旋转。例如,例如;如果我放置我的飞行器,使其鼻子平行于地板,则 X、Y、Z 将为 0,0,0。如果我将它平行于地板(世界和本地偏航)90 度,它现在是 0、0、90。如果我然后将它俯仰(世界滚动,本地俯仰)它 180 度,它现在是 180、0、90。我已经已经探索过四元数,但是我认为我不应该在这里发布我的代码,因为我认为我正在重新发明轮子。

我知道我没有很好地解释,但我相信这个问题很笼统。非常感谢任何人可以提供的任何帮助。

哦,我也想避免使用 gimblelock。

本质上是使用上/前/右矢量计算围绕每个工艺上/前/右矢量的旋转。

简单来说,一个通用的实现而不是一个特定于 Gmod 的实现是绝对好的。

0 投票
1 回答
1983 浏览

quaternions - Wiimote 方向作为 3D 矢量

我想知道是否有可能,因为 Wiimote 有 3 个加速度计,将加速度计读数转换为 3D 矢量。

我知道提取俯仰/滚动的技巧,但它只使用 X 和 Z 加速度计,并且存在万向节锁定问题。

我想要的是一个完整的 3D 矢量,可以转换为四元数旋转表示。