用于导出旋转矩阵的所有规范旋转公式都用于绕原点旋转。如果要改为围绕特定点应用该旋转,则必须首先偏移原点-或等效地移动对象,以便要围绕其旋转的点位于原点。
首先考虑2D情况,因为它更简单且技术可扩展。如果您有一个以原点为中心的宽度为2的立方体,并且想要将其绕其原点旋转45度,则这将是2D旋转矩阵的简单应用。
但是,如果您想绕它的右上角(位于1,1
)旋转它,则首先必须对其进行平移,以使该角位于原点。可以通过翻译来完成-1,-1
。然后,您可以像以前一样旋转对象,但是您必须通过将其平移回(by 1,1
)来进行后续操作。因此,通常来说,要获得大约点R
旋转的旋转矩阵,请执行以下操作:r
P
R = translate(-P) * rotate(r) * translate(P)
其中translate
和rotate
是分别为标准平移/旋转矩阵。碰巧的是,这只是微不足道地缩放到3D,除了必须同时为旋转提供轴外,您还可以始终选择标准的X,Y或Z轴旋转矩阵,但这很乏味。您将要使用任意的轴角旋转矩阵。因此,您R
在3D中的最终成绩是:
R = translate(-P) * rotate(a,r) * translate(P)
其中a
是代表旋转轴的单位向量,P
现在是模型空间中代表旋转点的3D点。
碰巧,四元数可以被转换到和从矩阵表示,所以你可以做你的串联这样,你应该选择这样做。或者,您也可以将所有内容都保留为矩阵(四元数具有一些不错的优点,例如更容易以理智的方式进行插值,但是是否需要由您自己决定)。
也:
因此,我将其可视化为围绕尾部不在本地原点的向量旋转。
严格来说,虽然向量可以通过将其视为从原点的位移来表示位置,但向量本身没有位置,因此可视化这样的位置有点不寻常。