C++ C+中的3x3矩阵旋转+;
好的,首先,我知道类似的问题在网络上到处都有,我已经看了超过我想数的,我已经试着弄清楚了将近3个星期了(不是经常,只是断断续续,希望能有一点洞察力) 最后,我想得到的是一个函数,在这个函数中,你传递你想要旋转多少(目前我使用弧度,但我可以使用度或弧度),它返回旋转矩阵,保留我的任何平移 我知道在二维笛卡尔平面中沿“Z”轴旋转的公式是:C++ C+中的3x3矩阵旋转+;,c++,matrix,rotation,translation,cartesian,C++,Matrix,Rotation,Translation,Cartesian,好的,首先,我知道类似的问题在网络上到处都有,我已经看了超过我想数的,我已经试着弄清楚了将近3个星期了(不是经常,只是断断续续,希望能有一点洞察力) 最后,我想得到的是一个函数,在这个函数中,你传递你想要旋转多少(目前我使用弧度,但我可以使用度或弧度),它返回旋转矩阵,保留我的任何平移 我知道在二维笛卡尔平面中沿“Z”轴旋转的公式是: [cos(radians) -sin(radians) 0] [sin(radians) cos(radians) 0] [0
[cos(radians) -sin(radians) 0]
[sin(radians) cos(radians) 0]
[0 0 1]
我对矩阵数学(加法、减法、乘法和行列式/逆)非常了解,但我不了解的是,如何一步一步地制作一个矩阵,我可以用它来旋转,保留它的任何平移(以及任何其他,如比例)
从我从其他例子中收集的信息来看,就是将我的当前矩阵(不管是什么,我们现在只使用一个单位矩阵)乘以如下矩阵:
[cos(radians) - sin(radians)]
[sin(radians) + cos(radians)]
[1]
[1, 0, X translation element]
[0, 1, Y translation element]
[0, 0, 1]
但是我原来的矩阵会变成3x1矩阵而不是3x3矩阵,不是吗?我不确定我错过了什么,但我觉得有些东西不对劲。我不一定要找人来为我写代码,只是为了理解如何正确地完成这项工作,然后我就可以自己写了。(并不是说我不会看别人的代码:))
(不确定这是否对任何人都重要,但以防万一,使用Windows 7 64位、Visual Studio 2010 Ultimate,我相信OpenGL,这是针对Uni的)
当我们在做的时候,有人能帮我再检查一下吗?只是为了确保它看起来是正确的
翻译矩阵(同样,让我们使用Identity)是这样的:
[cos(radians) - sin(radians)]
[sin(radians) + cos(radians)]
[1]
[1, 0, X translation element]
[0, 1, Y translation element]
[0, 0, 1]
首先,对于
3D
空间,不能使用translation3x3
矩阵。您必须使用齐次4x4
矩阵
之后,为每个变换(平移、旋转、缩放)创建一个单独的矩阵,并将它们相乘以得到最终的变换矩阵(相乘
4x4
matrix将得到4x4
matrix)首先,不能将平移3x3
矩阵用于3D
空间。您必须使用齐次4x4
矩阵
之后,为每个变换(平移、旋转、缩放)创建一个单独的矩阵,并将它们相乘以得到最终的变换矩阵(相乘
4x4
matrix将得到4x4
matrix)让我们澄清一些要点:
对象由三维点组成,这些点基本上是3×1矩阵
您需要一个3乘3的旋转矩阵来旋转对象:R,但如果您还添加了平移项,则变换矩阵将为4乘4:
[R11, R12, R13 tx]
[R21, R22, R23 ty]
[R31, R32, R33 tz]
[0, 0, 0, 1]
对于可以查看的R项:,它们取决于每个轴的旋转角度
为了旋转对象,每个3D点都将乘以该旋转矩阵。对于每3乘1点,还需要添加第4项(比例因子),假设固定比例为1:
[x y z 1]'
得到的乘积向量将是4乘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项:,它们取决于每个轴的旋转角度
为了旋转对象,每个3D点都将乘以该旋转矩阵。对于每3乘1点,还需要添加第4项(比例因子),假设固定比例为1:
[x y z 1]'
得到的乘积向量将是4乘1,最后一项是比例项,该比例项再次为1,可以删除
产生的旋转对象点就是这些新的3D产品点。我遇到了同样的问题,并在中找到了一个令人满意的公式。
让
(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 ]
第三列上的值是当旋转中心不是系统原点时需要应用的平移量。我遇到了同样的问题,并在中找到了一个令人满意的公式。
让
(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 ]
第三列上的值是当旋转中心不是系统原点时应用的必要平移量。否,抱歉@Andrew,最后,我将使用3x3和4x4矩阵,3x3用于二维旋转,4x4用于三维旋转。我现在只是想让我的头绕着3x3旋转,当我更了解它的时候,让它也和4x4一起工作。我不知道你为什么认为我在三维笛卡尔平面上使用了3x3,除非我在“Z”轴上提到旋转,我的意思是旋转它,就像你通常在2D中旋转一样,而不是在X或Y轴上旋转(如果你明白我的意思,这反过来会把标准并排马里奥变成纸马里奥)@user2368229:然后将当前(3x3)矩阵乘以旋转矩阵(3x3),得到3x3矩阵不,对不起@Andrew,最后,我会将其用于3x3和4x4矩阵,3x3用于2D旋转,4x4用于3D旋转。我现在只是想让我的头绕着3x3旋转,当我更了解它的时候,让它也和4x4一起工作。我不是