c++中的3x3矩阵旋转

3x3 Matrix Rotation in C++

本文关键字:旋转 3x3 中的 c++      更新时间:2023-10-16

好吧,首先,我知道类似的问题在网上到处都是,我已经看了很多,我都不想数了,我已经试着弄清楚了将近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]

首先,3D空间不能有平移3x3矩阵。你必须使用齐次4x4矩阵

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

让我们澄清一些问题:

你的对象由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:

[x y z 1]'

结果积向量将是4 × 1,最后一项是比例项,该比例项再次为1,可以删除。

生成的旋转对象点就是这些新的3D积点。

我遇到了同样的问题,在这个SO问题中找到了一个令人满意的公式。
(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 ]

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