Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的3x3矩阵旋转+;_C++_Matrix_Rotation_Translation_Cartesian - Fatal编程技术网

C++ C+中的3x3矩阵旋转+;

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

好的,首先,我知道类似的问题在网络上到处都有,我已经看了超过我想数的,我已经试着弄清楚了将近3个星期了(不是经常,只是断断续续,希望能有一点洞察力)

最后,我想得到的是一个函数,在这个函数中,你传递你想要旋转多少(目前我使用弧度,但我可以使用度或弧度),它返回旋转矩阵,保留我的任何平移

我知道在二维笛卡尔平面中沿“Z”轴旋转的公式是:

[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
空间,不能使用translation
3x3
矩阵。您必须使用齐次
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一起工作。我不是