C++ 中的 3x3 矩阵旋转

Posted

技术标签:

【中文标题】C++ 中的 3x3 矩阵旋转【英文标题】:3x3 Matrix Rotation in C++ 【发布时间】:2013-05-21 06:38:35 【问题描述】:

好的,首先,我知道网络上到处都是类似的问题,我查看的内容比我想数的要多,我已经尝试弄清楚了将近 3 周(不是经常,只是时断时续,希望能激发灵感)。

最后,我想要得到的是一个函数,您可以在其中传递要旋转多少(目前我正在使用弧度,但我可以使用度数或弧度)并返回旋转矩阵,保留我所有的翻译。

我理解在二维笛卡尔平面中沿“Z”轴旋转的公式是:

[cos(radians)    -sin(radians)    0]
[sin(radians)     cos(radians)    0]
[0                0               1]

我确实非常了解矩阵数学(加法、减法、乘法和行列式/逆),但我不明白的是如何逐步制作一个可用于旋转的矩阵,保留它具有的任何翻译(以及其他任何东西,如比例)。

根据我从其他示例中收集到的信息,是将我当前的矩阵(不管是什么,我们现在只使用单位矩阵)乘以这样的矩阵:

[cos(radians) - sin(radians)]
[sin(radians) + cos(radians)]
[1]

但是我原来的矩阵最终会变成 3x1 矩阵而不是 3x3,不是吗?我不确定我错过了什么,但我觉得有些不对劲。我不一定要找人为我写的代码,只是为了了解如何正确地做到这一点,然后我可以自己编写。 (不是说我不会看别人的代码:))

(不确定这是否对任何人都重要,但以防万一,使用 Windows 7 64 位、Visual Studio 2010 Ultimate,我相信 OpenGL,这是为 Uni 准备的)

当我们在做的时候,有人可以帮我仔细检查一下吗?只是为了确保它看起来正确。

翻译矩阵(再次,让我们使用身份)是这样的:

[1, 0, X translation element]
[0, 1, Y translation element]
[0, 0, 1]

【问题讨论】:

【参考方案1】:

首先,您不能为3D 空间转换3x3 矩阵。你必须使用齐次的4x4 矩阵。

之后为每个变换(平移、旋转、缩放)创建一个单独的矩阵并将它们相乘以获得最终的变换矩阵(乘以 4x4 矩阵将得到 4x4 矩阵)

【讨论】:

不不,对不起@Andrew,最后,我将它用于 3x3 和 4x4 矩阵,3x3 用于 2D 旋转,4x4 用于 3D。我现在只是想了解 3x3 旋转,当我更了解它时,让它也适用于 4x4。我不确定您为什么认为我将 3x3 用于 3D 笛卡尔平面,除非当我提到“Z”轴上的旋转时,我的意思是旋转它,因为您通常会在 2D 中旋转某些东西,并且不在 X 或 Y 轴上旋转(反过来,如果你明白我的意思,这会将标准的并排马里奥变成纸马里奥) @user2368229:然后将当前 (3x3) 矩阵乘以旋转矩阵 (3x3),您将得到 3x3 矩阵【参考方案2】:

让我们澄清几点:

您的对象由基本上是 3 x 1 矩阵的 3D 点组成。

您需要一个 3 x 3 的旋转矩阵来旋转您的对象:R 但如果您还添加平移项,则转换矩阵将为 4 x 4:

[R11, R12, R13 tx]
[R21, R22, R23 ty]
[R31, R32, R33 tz]
[0,   0,   0,   1]

对于 R 术语,您可以查看:http://inside.mines.edu/~gmurray/ArbitraryAxisRotation/,它们取决于每个轴的旋转角度。

为了旋转您的对象,每个 3D 点都乘以该旋转矩阵。对于每 3 x 1 点,您还需要添加第 4 项(比例因子),假设固定比例为 1:

[x y z 1]'

生成的乘积向量将是 4 x 1,最后一项是比例项,再次为 1,可以删除。

产生的旋转对象点是这些新的 3D 产品点。

【讨论】:

【参考方案3】:

我遇到了同样的问题,并在this SO question 中找到了一个令人满意的公式。 让(cos0, sin0) 分别是角度的余弦和正弦值,(x0, y0) 是旋转中心的坐标。 要转换坐标(x,y) 的二维点,您必须将其齐次3x1 坐标(x,y,1) 乘以这个3x3 矩阵:

[cos0,    -sin0,   x0-(cos0*x0 - sin0*y0)]
[sin0,     cos0,   y0-(sin0*x0 + cos0*y0)]
[   0,        0,                       1 ]

第三列的值是当旋转中心不是系统原点时需要应用的平移量。

【讨论】:

以上是关于C++ 中的 3x3 矩阵旋转的主要内容,如果未能解决你的问题,请参考以下文章

MASM:8086 中的 3X3 矩阵乘法有问题吗?

从 OpenCV 中的旋转矩阵和平移向量中获取旋转轴

三个欧拉角得到3x3旋转矩阵

具有位旋转技巧的快速整数矩阵乘法

如何在 C++ 中构建 3x3 平移矩阵

Android 中的 Matrix