3

好吧,首先,我知道网络上到处都是类似的问题,我查看的内容比我想数的要多,我已经尝试弄清楚了将近 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]
4

3 回答 3

2

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

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

于 2013-05-21T06:42:11.307 回答
1

让我们澄清一些观点:

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

您需要一个 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 产品点。

于 2013-05-21T07:02:56.290 回答
1

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

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

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

于 2014-02-17T03:31:56.767 回答