【问题标题】:3x3 Matrix Rotation in C++C++ 中的 3x3 矩阵旋转
【发布时间】: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]

【问题讨论】:

    标签: c++ matrix rotation translation cartesian


    【解决方案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 ]
      

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

      【讨论】:

        猜你喜欢
        • 2011-06-17
        • 2016-04-06
        • 2020-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多