好吧,首先,我知道类似的问题在网上到处都是,我已经看了很多,我都不想数了,我已经试着弄清楚了将近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]
首先,3D
空间不能有平移3x3
矩阵。你必须使用齐次4x4
矩阵
之后,为每个变换(平移,旋转,缩放)创建一个单独的矩阵,并将它们相乘以获得最终的变换矩阵(乘以4x4
矩阵将得到4x4
矩阵)
让我们澄清一些问题:
你的对象由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:
[x y z 1]'
结果积向量将是4 × 1,最后一项是比例项,该比例项再次为1,可以删除。
生成的旋转对象点就是这些新的3D积点。
我遇到了同样的问题,在这个SO问题中找到了一个令人满意的公式。
设(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 ]
第三列的值是当旋转中心不是系统原点时需要应用的平移量