问题标签 [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 投票
2 回答
1757 浏览

c++ - 在二维图像上绘制欧拉角旋转模型

我目前正在尝试在 2d 图像(没有 opengl 或 3d 图形窗口)中绘制欧拉角的 3d 表示。图像输出可能类似于下图。

欧拉角

本质上,我正在寻找可以采用旋转矩阵或一组欧拉角然后将它们输出到二维图像上的研究或算法,如上所示。这将在使用 OpenCV 的 C++ 应用程序中实现。它将用于根据对象的状态在 OpenCV 窗口上输出注释信息。

我想我想多了,因为我应该能够从旋转矩阵中分解单位向量,然后提取它们的 x,y 分量并从 (0,0) 在笛卡尔空间中画一条线。我的这种想法正确吗?

编辑:我正在寻找正交投影。您可以假设上面的图像具有正确的相机/视角。

任何帮助,将不胜感激。

谢谢,

编辑:现在可以在我的仓库中找到示例源代码。标题:https ://bitbucket.org/jluzwick/tennisspindetector/src/6261524425e8d80772a58fdda76921edb53b4d18/include/projection_matrix.h?at=master

类定义:https ://bitbucket.org/jluzwick/tennisspindetector/src/6261524425e8d80772a58fdda76921edb53b4d18/src/projection_matrix.cpp?at=master

这不是最好的代码,但它可以工作,并显示了获取已接受答案中描述的投影矩阵所需的步骤。

这里还有一个投影矩阵的 youtube 视频(以及添加的比例和翻译):http ://www.youtube.com/watch?v=mSgTFBFb_68

0 投票
2 回答
4131 浏览

rotation - 如何从欧拉角中找到“扭曲”角

编辑:我认为需要进一步澄清我正在尝试做的事情:

我在 Maya 中有一个前臂装备设置,使用线变形器来控制扭曲。线变形器位于 skinCluster 的顶部。腕关节有一个额外的角度属性,称为“扭曲”,它链接到与腕关节位于同一位置但保持肘关节方向的父关节。twist 属性也连接到导线的 dropoffLocatorTwist[1] 属性。下降到 100 度时,金属丝将前臂扭曲到无穷大,关节仍然代表手腕和手的“姿势”。为了补偿 skinCluster 的过度旋转,我添加了一个重复的手腕层次结构并将扭曲连接到它的旋转 x。

现在我想进一步推动它。为了减少动画师的麻烦,我想删除额外的扭曲属性并在关节本身的所有三个欧拉旋转值之间进行插值以生成扭曲值。假设动画师直接在通道框中设置值或简单地相对旋转手腕,这些值很容易超过 1000pi(以度为单位)。如果多边形网格足够密集,线变形器可以轻松地沿曲线执行扭曲到该量级,而不会产生任何伪影。问题是如何对欧拉旋转进行插值以获得准确表示姿势和扭曲的单个角度值。我尝试通过将每个欧拉值乘以矩阵中伴随行向量的欧拉旋转的切线的点积来用曲线切线和手腕矩阵进行插值,

twist=rx*(矩阵第1行切点)+ry*(矩阵第2行切点)+rz*(矩阵第3行切点)

特别是,它不喜欢绕 Y 轴旋转。谁能告诉我为什么会这样以及如何正确地将欧拉旋转分解为扭曲角而不将扭曲限制为-pi <-> pi?

以前问过:

我正在使用 Maya 线(曲线)变形器,并希望根据关节的欧拉旋转找到沿线切线的扭曲值。Maya 中的关节实际上是变换矩阵,但其组合方式是用户可以输入可能的最大浮点值作为任何欧拉旋转分量的度数。我想取那些欧拉值(xyz),并以这样的方式组合它们,结果是轴角旋转,其中轴是父矩阵的第一行(或线的切线),角度是围绕该轴的未绑定扭曲值,允许对网格进行无限制的无翻转扭曲。问题是我找不到插值 x、y 和 z 值的方法,因此得到的角度仅代表扭曲而没有别的。更简单地说,我想找到'x' 欧拉旋转的旋转值,其中 x 轴已旋转,因此现在由“y”、“z”或所有三个分量之间的某个值表示。有没有办法做到这一点,而不会将 x 的值丢失到一个较小但相等的值(例如 270 == 90,但我们想要 270)?

0 投票
1 回答
912 浏览

3d - 使用两个之间的差异旋转其他两个欧拉角

我正在尝试使用样条线移动的相机。相机位置很好,但是我希望我的相机眼睛在移动时转向本身。

例如,相机从 x0 y0 z0 移动到 x1 y1 z1。现在我的眼睛向量是正常的(x1-x0,y1-y0,z1-z0)。如何旋转其他两个向量(侧向量和上向量)以匹配眼睛向量而不破坏它们之间的 90 度角?

如果偏航/俯仰形式更容易,那也可以,我可以在两者之间进行转换。或者我想要实现的不同方法?

例如,我认为我可以通过计算样条的法线(它是一个 3 点贝泽曲线)来做到这一点,并且每一步我都可以计算出相机将围绕该法线旋转多少。但如果存在的话,我更喜欢更简单、更通用的方法。

你可以在这里看到我在做什么。(点击一个行星)在这个我将我的新旧眼睛矢量转换为俯仰/偏航并找到差异并使用它旋转其他矢量但这显然是错误的,因为在某些情况下,其他矢量可能根本不会改变(如果眼睛垂直于一个旋转)

0 投票
2 回答
4670 浏览

javascript - 三.js相机旋转顺序

我正在尝试使用游戏手柄在 Three.js 中旋转相机,使用第一人称射击风格的控件。

浏览器检测到游戏手柄并识别它的输入,但相机的旋转顺序错误。当我在相机的局部 Y 轴上旋转时,它也会考虑局部 X 旋转,这是不需要的。

看来我和这个人有同样的问题,但他的问题是使用 Three.js r54 解决的,而我使用的是 r60。他camera.eulerOrder = "YXZ";开始让它工作,但目前的等价物camera.rotation.order = "YXZ";似乎对我不起作用。

我知道 Three.js 的内置“FirstPersonControls”类,但它不适合我,因为它不接受控制器输入,并且稍后在其中塞入其他非移动控件会很麻烦。我也知道 gamepad.js 并且没有兴趣使用它。

任何人都可以帮忙吗?

我的轮换代码:

0 投票
2 回答
11677 浏览

opengl - 将偏航、俯仰和滚动转换为世界坐标中的 x、y、z 向量

我正在 OpenGL (java LWGJL) 中处理一些简单的 3d 图形,我试图弄清楚如何将偏航、俯仰和滚动转换为我的运动矢量的 x、y 和 z 分量。我知道如何只用俯仰和偏航来做到这一点(如此所述),但我还没有找到任何解释如何将滚动集成到这个公式中的东西。

我知道偏航和俯仰是在 3d 空间中定义矢量所需的全部,但在这种情况下我也需要滚动。在基本的 WASD 配置中,我将键绑定到相对于相机的不同运动(A本地左侧,W本地向前,SPACE本地向上),因此滚动会影响相机的移动方式(例如,按下Dpi/2 的滚动(默认)向右移动相机(在世界坐标中),但按下D一卷 pi 会在世界坐标中向上移动相机))。

这是我到目前为止的代码:

这适用于几个旋转,但对于许多它会产生不正确的结果。

所以问题是:

如何修改我的代码,以便它根据我想要的方向(按下什么键)成功计算我的运动矢量的 x、y 和 z 分量,并考虑我的偏航、俯仰滚动?

我可以使用 raw trig(正如我正在尝试做的那样)、涉及矩阵的解决方案或几乎任何东西。

编辑:

请不要仅仅通过链接到关于欧拉角的维基百科文章来回答。我读过它,但我没有足够强大的数学背景来理解如何将它应用到我的情况中。

编辑#2:

我只使用欧拉角在重新定位相机之间存储我的方向。对于实际的相机操作,我使用旋转矩阵。如果需要,我可以删除欧拉角并只使用矩阵。重要的是我可以从我的方向转换为矢量。

编辑#3:

如评论中所述,通过将我的前向向量乘以我的旋转矩阵找到了一个解决方案:

不过,这仍然有问题。

0 投票
3 回答
1450 浏览

vector - 由四元数旋转的 3D 中两个 3D 向量之间的角度

我有一个来自传感器设备的 3D 单位四元数 = {w,x,y,z}。我想获得关于 X、Y 和 Z 轴的角度(ax、ay、az)的数量(但角度应该是独立的,当另一个变化时一个不应该改变)。我遇到过,四元数欧拉角的转换,他们有万向节锁定问题并且他们是依赖项。所以我想采取不同的方法。

取 3D 向量 x = [1,0,0]、y = [0,1,0] 和 z = [0,0,1]。如果我将这些向量 x、y 和 z 旋转四元数,我们会得到 3 个向量 xx、yy 和 zz。然后计算 x, xx 向量之间的角度。类似地,y, yy 和 z, zz 之间的夹角。这似乎也不起作用。以下是我编写的 C# 代码。角度范围应为 -180 到 180 或 0 到 360 度。acos不是首选,因为它存在精度问题。

如何完成这项工作?有标准方法吗?如何将 3D 四元数分解为 3 个四元数,分别用于 X、Y 和 Z 轴?


0 投票
2 回答
3138 浏览

c# - 从欧拉旋转转换为四元数旋转

我正在使用 Leap Motion 设备获取有关我手的位置和方向的可用数据。目前我在编码的方向部分遇到问题。Leap API 只有逐帧旋转的代码,然而,它也提供了一个法线向量(垂直于手掌)和一个指针向量(指向从手掌向外指向手指的方向)。这两个向量是垂直的。

向量:

更多信息可以在 Leap HandAPI 上找到:https ://developer.leapmotion.com/documentation/Languages/CSharpandUnity/API/class_leap_1_1_hand.html

转换为 UnityVector3类:

我使用这些向量来计算我手的欧拉角方向(关于 x 轴的 theta_x 度、关于 y 轴的 theta_y 度和关于 z 轴的 theta_z 度),使用代码:

然后将欧拉角转换为四元数并使用以下代码实现:

Quaternion可以在此处找到有关 Unity 类的更多信息:http: //docs.unity3d.com/Documentation/ScriptReference/Quaternion.html

当我编写代码时,我分别测试了每个旋转轴,注释掉其他轴(将它们设置为 0),它们工作正常。然而,当我同时实现所有三个时,围绕单个轴的旋转行为发生了变化,这让我感到困惑。为什么包括对绕 y 轴旋转的识别会改变绕 x 轴旋转的方式?

当其他旋转轴被注释掉(并设置为 0)时,每个单独的旋转轴都起作用,我认为问题在于欧拉角转换为四元数的方式。我对四元数用于表示旋转的方式不是很了解,但是我很困惑为什么改变绕 y 轴的旋转角度的值会改变绕 x 轴的旋转角度。

谢谢你的帮助。

0 投票
1 回答
499 浏览

rotation - 将 3 个欧拉角转换为一个值

我想问是否有人知道如何将 x,y,z 欧拉角转换/组合成一个值?这有什么功能吗?我已经搜索过,但我发现转换为矩阵或四元数,但这些输出不止一个值(即旋转和矢量)。我对么?

我正在尝试将数据输入到 SPSS 以进行手势识别的统计分析,并且我为每个关节插入 3 列(x、y、z 旋转),但我希望每个关节都有 ONE 列,因此需要 ONE 值来分析并将它们正确分类..有什么建议吗?

非常感谢!带着敬意

0 投票
4 回答
14845 浏览

matlab - 使用 Roll-Pitch-Yaw 角度变换图像(图像校正)

我正在开发一个需要校正从移动相机平台拍摄的图像的应用程序。该平台测量滚动角、俯仰角和偏航角,我想让它看起来像从正上方拍摄的图像,通过对这些信息的某种变换。

换句话说,我想要一个平放在地面上的完美正方形,从远处以某种相机方向拍摄,然后进行变换,以便之后正方形完美对称。

我一直在尝试通过 OpenCV(C++) 和 Matlab 来做到这一点,但我似乎遗漏了一些关于如何做到这一点的基本知识。

在 Matlab 中,我尝试了以下方法:

其中 R_z/y/x 是标准旋转矩阵(以度数实现)。

对于一些偏航旋转,一切正常:

这给出了结果:

图像绕 Z 图像轴旋转 10 度

如果我尝试将图像围绕 X 轴或 Y 轴旋转相同的量,我会得到如下结果:

图像绕 X 图像轴旋转 10 度

但是,如果我旋转 10 度,除以一个巨大的数字,它开始看起来不错。但话又说回来,这是一个没有任何研究价值的结果:

图像绕 X 图像轴旋转 10/1000 度

有人可以帮我理解为什么绕 X 轴或 Y 轴旋转会使转换变得疯狂吗?有没有办法解决这个问题而不用除以一些随机数和其他魔术?这是否可以使用某种欧拉参数来解决?任何帮助将不胜感激!

更新:完整设置和测量

为了完整起见,添加了完整的测试代码和初始图像,以及平台欧拉角:

代码:

初始图像:

在此处输入图像描述

BODY坐标系中的相机平台测量:

据我了解,偏航角与转换没有直接关系。但是,我可能对此有误。

附加信息:

我想指定使用设置的环境不包含可以可靠地用作参考的线条(海洋照片)(地平线通常不在图片中)。此外,初始图像中的正方形仅用作衡量转换是否正确的指标,在​​真实场景中不会出现。

0 投票
1 回答
1003 浏览

ios - iPhone 增强现实欧拉角旋转 - 滚动问题

我正在开发一个 iOS 增强现实应用程序。它是基于位置的,而不是基于标记的。

我使用 GPS、指南针和加速度计来获取纬度、经度、高度和 3 个欧拉角:偏航角、俯仰角和滚动角。我知道使用 NSLog() 这 6 个变量包含有效数据。

我的应用程序在相机视图上显示了一些 3d 对象。只要我使用除滚动角之外的所有东西,它就可以正常工作。

如果我添加第三个角度,则应用于我的 opengl 世界的旋转效果不好。我在主要的 OpenGL 绘制方法中这样做

我认为这种方法有问题,但我肯定不是专家。也许我应该创建某种独特的旋转矩阵而不是 3 个不同的?

也许这不容易?毕竟大多数桌面视频游戏,FPS之类的,只是让用户使用鼠标来改变偏航和俯仰角,所以只有2个角度,而不是3个。但是不像鼠标,它是一个2d设备,一个用于增强的手机现实可以在任何角度移动。

但是话又说回来,我在网上看到的所有 AR 教程都无法正确处理“滚动”。使用一些滚动补偿策略,“滚动”你的手机要么完全弄乱 AR 的东西,要么什么都不做。

所以我的问题是,假设我使用手机传感器有 3 个欧拉角,我应该如何将它们应用于我的 3d opengl 视图?