C ++中的3x3矩阵旋转

时间:2013-05-21 06:38:35

标签: c++ matrix rotation translation cartesian

好吧,首先,我知道类似的问题都在网上,我看过的比我想要的还多,我已经试着弄清楚了近3个星期了(不是经常,只是打开和关闭,希望获得洞察力。)

最后,我想得到的是一个函数,你传递你想要旋转多少(目前我在Radian工作,但我可以去Degrees或Radians)它返回旋转矩阵,保留我的任何翻译。

我理解在2D笛卡尔平面中在“Z”轴上旋转的公式是:

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

我确实理解矩阵数学(加法,减法,乘法和行列式/逆),但我不理解的是,如何逐步制作一个可用于旋转的矩阵,保留任何翻译(以及其他任何,如规模)。

从我从其他例子中收集到的,就是乘以我现在的矩阵(无论可能是什么,我们现在只使用一个身份矩阵),像这样的矩阵:

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

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

(不确定这对任何人是否重要,但只是在案例中,使用Windows 7 64位,Visual Studio 2010 Ultimate,我相信OpenGL,这适用于Uni)

虽然我们在这里,有人可以为我仔细检查这个吗?只是为了确保它看起来正确。

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

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

3 个答案:

答案 0 :(得分:2)

首先,3x3空间无法翻译3D矩阵。您必须使用同类4x4矩阵。

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

答案 1 :(得分:1)

让我们澄清一些观点:

您的对象由3D点组成,这些点基本上是3乘1矩阵。

你需要一个3乘3的旋转矩阵来旋转你的对象:R但是如果你还要添加翻译术语,转换矩阵将是4乘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点1点,您还需要添加第4个术语(比例因子),假设固定比例为1,则为1:

[x y z 1]'

产生的产品向量将是4乘1,最后一个术语是缩放项,再次为1,可以删除。

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

答案 2 :(得分:0)

我遇到了同样的问题,在this SO question中找到了令人满意的公式 让(cos0, sin0)分别为角度的余弦和正弦值,(x0, y0)为旋转中心的坐标。
要转换2d坐标点(x,y),您必须将其3x3坐标{3}与3x3矩阵相乘:

(x,y,1)

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