标签: quaternions

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

我有两个向量u和v.有没有办法找到一个四元数来表示从u到v的旋转?

math vector quaternions

99
推荐指数
5
解决办法
7万
查看次数

为什么四元数用于旋转?

我是一名物理学家,并且一直在学习一些编程,并且遇到很多人使用四元数进行旋转而不是以矩阵/向量形式编写东西.

在物理学中,有很好的理由我们不使用四元数(尽管偶尔讲述汉密尔顿/吉布斯/等的奇怪故事).物理学要求我们的描述具有良好的分析行为(这具有精确定义的含义,但是在一些相当技术的方面远远超出了正常介绍类中教导的内容,所以我不会详细讨论).事实证明,四元数没有这种好的行为,所以它们没用,而矢量/矩阵也没用,所以我们使用它们.

然而,仅限于刚性旋转和不使用任何分析结构的描述,可以以任一方式(或其他一些方式)等效地描述3D旋转.

一般情况下,我们只是想要一个点X =(X,Y,Z)的映射到一个新的点X '=(X',Y",Z ')受约束X 2 = X' 2.并且有很多事情可以做到这一点.

天真的方法是只绘制这个定义的三角形并使用三角学,或者使用点(x,y,z)和向量(x,y,z)和函数f(X)= X'之间的同构,使用一些其他方法(x,y,z)T(a,b,c)(x',y',一个矩阵MX = X',或使用四元数,或沿旧方法投射旧矢量的分量. z')等

从数学的角度来看,这些描述在这个设置中都是等价的(作为一个定理).它们都具有相同数量的自由度,相同数量的约束等.

那么为什么四元数似乎比矢量更受欢迎呢?

我看到的通常原因是没有云台锁或数字问题.

没有万向节锁定论证似乎很奇怪,因为这只是欧拉角的问题.它也只是一个坐标问题(就像极坐标中r = 0处的奇点(Jacobian松散等级)),这意味着它只是一个局部问题,并且可以通过切换坐标,旋转出简并性来解决,或使用两个重叠的坐标系.

我对数字问题不太确定,因为我不清楚这些(以及任何替代方案)是如何实现的.我已经读过,对四元数进行重新规范化比对旋转矩阵进行重新规范化更容易,但这只适用于一般矩阵; 一个旋转具有额外的约束,使得这些约束变得无足轻重(这些约束被内置到四元数的定义中)(事实上,这必须是真的,因为它们具有相同数量的自由度).

那么使用四元数而不是向量或其他替代方法的原因是什么?

3d matrix quaternions rotational-matrices

99
推荐指数
8
解决办法
3万
查看次数

多个四元数的"平均"?

我正在尝试在我的OpenGL程序中从矩阵切换到四元数以进行骨架动画,但我遇到了一个问题:

给定一些单位四元数,我需要得到一个四元数,当用于变换向量时,将给出一个向量,该向量是由每个四元数单独转换的向量的平均值.(使用矩阵我只需将矩阵加在一起并除以矩阵数)

math quaternions

44
推荐指数
5
解决办法
2万
查看次数

四元数绕轴旋转的分量

我很难找到关于这个主题的任何好消息.基本上我想找到四元数旋转的分量,即围绕给定轴(不一定是X,Y或Z - 任意单位矢量).有点像将四元数投影到矢量上.因此,如果我要求围绕与四元数轴平行的某个轴进行旋转,我将得到相同的四元数.如果我要求围绕与四元数轴正交的轴旋转,我会得到一个标识四元数.中间......嗯,这就是我想知道如何解决:)

rotation quaternions

38
推荐指数
2
解决办法
3万
查看次数

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

是否存在将旋转的四元数表示转换为欧拉角表示的现有算法?欧拉表示的旋转顺序是已知的,并且可以是六个排列中的任何一个(即xyz,xzy,yxz,yzx,zxy,zyx).我已经看到了固定旋转顺序的算法(通常是NASA标题,银行,滚动惯例),但不是任意旋转顺序.

此外,因为存在单个方向的多个欧拉角表示,所以该结果将是模糊的.这是可以接受的(因为方向仍然有效,它可能不是用户期望看到的方向),但是如果存在一个采用旋转限制的算法(即自由度数和考虑到每个自由度的限制,并在给定这些约束条件下产生"最明智的"欧拉表示.

我有一种感觉,这个问题(或类似的东西)可能存在于IK或刚体动力学领域.


解决:我刚刚意识到我可能不清楚我是通过遵循图形宝石的Ken Shoemake的算法来解决这个问题的.当时我确实回答了我自己的问题,但是我发现它可能并不清楚我这样做了.有关详细信息,请参阅下面的答案.


只是为了澄清 - 我知道如何从四元数转换为所谓的' Tait-Bryan '表示 - 我称之为'NASA'约定.这是zxy的旋转顺序(假设'Z'轴向上)的惯例.我需要一个适用于所有轮换订单的算法.

那么,解决方案可能是采用zxy顺序转换,并从其中获得其他五个转换以获得其他旋转顺序.我想我希望有一个更"全面"的解决方案.无论如何,我很惊讶我找不到现有的解决方案.

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


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

language-agnostic math animation quaternions euler-angles

27
推荐指数
4
解决办法
2万
查看次数

从四元数中提取偏航

我有一个旋转四元数,想要提取围绕向上轴(偏航)的旋转角度.我正在使用XNA,据我所知,没有内置功能.做这个的最好方式是什么?

感谢任何帮助,Venatu

math xna quaternions

26
推荐指数
3
解决办法
4万
查看次数

C/C++中的四元数库

在C/C++中进行四元数计算的任何好的库?

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

谢谢

c++ math quaternions

25
推荐指数
4
解决办法
3万
查看次数

实现复杂的基于旋转的摄像头

我正在实现用于空间可视化的3D引擎,并且正在编写具有以下导航功能的相机:

  • 旋转相机(即类似于旋转头部)
  • 旋转任意3D点(空间中的一个点,可能不在屏幕的中心;相机需要围绕此旋转,保持相同的相对观察方向,即外观方向也会改变.这不直接看选择的旋转点)
  • 平移在相机的平面中(因此在垂直于相机外观矢量的平面中向上/向下或向左/向右移动)

相机不应该滚动 - 也就是说,"向上"仍在继续.因此,我代表具有位置和两个角度的摄像机,围绕X和Y轴旋转(Z将滚动.)然后使用摄像机位置和这两个角度重新计算视图矩阵.这适用于平移和旋转眼睛,但不适用于围绕任意点旋转.相反,我得到以下行为:

  • 眼睛本身显然比它应该进一步向上或向下移动
  • m_dRotationX0或pi 时,眼睛根本不向上或向下移动.(万向节锁?我怎么能避免这种情况?)
  • 眼睛的旋转被反转(当它m_dRotationX在pi和2pi之间时,改变旋转使其在看起来应该向下看时向下看,当看起来应该向下看时向下看).

(a)导致这种"漂移"的原因是什么?

这可能是万向节锁定.如果是这样,标准答案是"用四元数来表示转动"说,这里的许多倍SO(1,2,3为例),但遗憾的是没有具体的细节(例如,这是最好的答案,我发现到目前为止;它很少见.)我一直在努力使用四元数结合上述两种类型的旋转来实现相机.事实上,我正在使用两个旋转来构建四元数,但是下面的评论者说没有理由 - 立即构建矩阵也没关系.

在围绕某个点旋转时更改X和Y旋转(表示摄像机外观方向)时会发生这种情况,但直接更改旋转时不会发生这种情况,即将摄像机绕自身旋转.对我来说,这没有意义.这是相同的价值观.

(b)这种相机会采用不同的方法(例如四元数)吗?如果是这样,我如何实现上述所有三个相机导航功能?

如果不同的方法会更好,那么请考虑提供该方法的具体实施示例.(我使用的是DirectX9和C++,以及SDK提供的D3DX*库.)在第二种情况下,我会在几天内添加并奖励一笔赏金,我可以在问题中添加一个.这可能听起来像我在蹦蹦跳跳,但我的时间很少,需要快速实施或解决这个问题(这是一个紧迫的截止日期的商业项目.)详细的答案也将改善SO档案,因为大多数到目前为止我读过的相机答案对代码很轻松.

谢谢你的帮助 :)


一些澄清

感谢您的评论和答案到目前为止!我将尝试澄清有关该问题的一些事项:

  • 每当其中一个变化时,从摄像机位置和两个角度重新计算视图矩阵.矩阵本身永远不会累积(即更新) - 它会重新重新计算.然而,相机位置和两个角度变量被累积(例如,每当鼠标移动时,基于鼠标上下移动的像素数量,一个或两个角度将增加或减少一小部分和/或或者在屏幕左右.)

  • 评论员JCooper声称我正遭受万向节锁定,我需要:

在变换上添加另一个旋转,在应用变换之前将eyePos旋转到完全在yz平面中,然后再旋转另一个旋转.在应用偏航 - 俯仰 - 滚动矩阵之前和之后立即围绕y轴旋转以下角度(其中一个角度需要被否定;尝试它是决定哪个角度的最快方法). double fixAngle = atan2(oEyeTranslated.z,oEyeTranslated.x);

不幸的是,当按照描述实现这一点时,由于其中一个旋转,我的眼睛以非常快的速度从场景上方射出.我确定我的代码只是这个描述的一个糟糕的实现,但我仍然需要更具体的东西.一般来说,我发现算法的非特定文本描述不如评论,解释的实现有用. 我正在为一个具体的工作示例添加一个赏金,它与下面的代码集成(也就是使用其他导航方法.)这是因为我想了解解决方案,并且有一些有用的东西,因为我因为我处于紧迫的截止日期,所以需要实施一些有效的方法.

如果你回答算法的文字描述,请确保它足够详细('旋转Y,然后变换,然后旋转'对你有意义,但缺乏细节知道你的意思. 好答案清晰,标示,即使有不同的基础,也会让其他人理解,是'坚固的防风雨信息板.')

反过来,我试图清楚地描述问题,如果我能说清楚,请告诉我.


我目前的代码

要实现上述三个导航功能,在基于光标移动的像素移动的鼠标移动事件中:

// Adjust this to change rotation speed when dragging (units are radians …
Run Code Online (Sandbox Code Playgroud)

c++ math directx matrix quaternions

22
推荐指数
2
解决办法
6774
查看次数

两个四元数之间的"差异"

我在Ogre工作,但这是一个普遍的四元数问题.

我有一个对象,我最初应用了旋转四元数Q1.后来,我想让它好像我最初用不同的四元数Q2旋转对象.

如何计算将已经旋转了Q1的对象的四元数,并将其对齐,就像我所做的一样是将Q2应用于初始/默认方向?我当时正在寻找,但我不确定这是否仅适用于方向而非旋转

math ogre3d quaternions

20
推荐指数
2
解决办法
3万
查看次数

四元数和标准化

我知道如果我想旋转矢量,则需要对四元数进行归一化.

但有没有任何理由不自动规范化四元数?如果有,那么四元数运算会导致非标准化四元数?

  • 乘以两个四元数?
  • 点产品?

对不起,如果这个问题有点模糊.我还在尝试绕着四元数缠绕我.

normalization quaternions

20
推荐指数
3
解决办法
3万
查看次数