好吧,首先,我知道类似的问题都在网上,我看过的比我想要的还多,我已经试着弄清楚了近3个星期了(不是经常,只是打开和关闭,希望获得洞察力。)
最后,我想得到的是一个函数,你传递你想要旋转多少(目前我在Radian工作,但我可以去Degrees或Radians)它返回旋转矩阵,保留我的任何翻译。
我理解在2D笛卡尔平面中在“Z”轴上旋转的公式是:
[cos(radians) -sin(radians) 0]
[sin(radians) cos(radians) 0]
[0 0 1]
我确实理解矩阵数学(加法,减法,乘法和行列式/逆),但我不理解的是,如何逐步制作一个可用于旋转的矩阵,保留任何翻译(以及其他任何,如规模)。
从我从其他例子中收集到的,就是乘以我现在的矩阵(无论可能是什么,我们现在只使用一个身份矩阵),像这样的矩阵:
[cos(radians) - sin(radians)]
[sin(radians) + cos(radians)]
[1]
但是我原来的Matrix最终会成为3x1矩阵而不是3x3,不是吗?我不确定我错过了什么,但对我来说似乎不对。我不一定要为某人为我写代码,只是为了理解如何正确地做到这一点然后我自己可以写。 (不是说我不会看别人的代码:))
(不确定这对任何人是否重要,但只是在案例中,使用Windows 7 64位,Visual Studio 2010 Ultimate,我相信OpenGL,这适用于Uni)
虽然我们在这里,有人可以为我仔细检查这个吗?只是为了确保它看起来正确。
翻译矩阵(再次,让我们使用Identity)是这样的:
[1, 0, X translation element]
[0, 1, Y translation element]
[0, 0, 1]
答案 0 :(得分:2)
首先,3x3
空间无法翻译3D
矩阵。您必须使用同类4x4
矩阵。
之后为每个变换创建一个单独的矩阵(平移,旋转,缩放)并将它们相乘以得到最终的变换矩阵(乘以4x4
矩阵将为您提供4x4
矩阵)
答案 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术语,您可以查看:http://inside.mines.edu/~gmurray/ArbitraryAxisRotation/,它们取决于每个轴的旋转角度。
为了旋转对象,每个3D点都乘以此旋转矩阵。对于每3点1点,您还需要添加第4个术语(比例因子),假设固定比例为1,则为1:
[x y z 1]'
产生的产品向量将是4乘1,最后一个术语是缩放项,再次为1,可以删除。
产生的旋转物点是这些新的3D产品点。
答案 2 :(得分:0)
我遇到了同样的问题,在this SO question中找到了令人满意的公式
让(cos0, sin0)
分别为角度的余弦和正弦值,(x0, y0)
为旋转中心的坐标。
要转换2d坐标点(x,y)
,您必须将其3x3坐标{3}与3x3矩阵相乘:
(x,y,1)
第三列的值是旋转中心不是系统原点时应用的平移量。