在正式开始推导之前,首先要明确旋转的方向和角度的数值问题。这个确定之后,推导的时候就不会有疑惑。
旋转的方向与坐标弧度值
一般我们所说的旋转正方向指的是,a 绕某轴旋转了θ角度, 就是说a正方向旋转了θ角度。 在右手系中,我们又会以逆时针为正方向,也就是a逆时针旋转了θ角度, 这里仍然是右手螺旋法则。
一个平面的法向确定之后,再来谈它的旋转方向。在 xOy中,实际上就是以z轴为旋转轴。 请竖起你的大拇指,看看四指缠绕的方向是不是逆时针, 如果是,恭喜你,你用的是右手。
角度的变化量却不一定是这样的。 变化量 = 结果 - 初始值。
比如,在xOz 平面中,我们要通过某点的坐标直接计算其角度的话,得到的结果刚好相反。
通过坐标计算角度是这样的, 算出其正弦,余弦值, 通过反正切求出一个角度 α。
如果正弦值大于0这个α的值域应该是 [0, π], 如果不在此区间,应该用 nπ + α,直到满足这个区间 ;
若正弦为负,其值域为[π, 2π] , 不在此区间 则用 nπ +α 直到满足这个区间 ;
因为正切的周期是π, 值域是[-π/2, π/2] . js的函数是Math.atan2(x,y) ; 不过其返回值是严格按照反正切函数来的,不会给我们转换。
但是,要理解角度的值,就是要加上前面的坐标转换。这个值仅仅代表,以x轴为起始边,x z为正半轴计算得到的角度, 和旋转无关。 不理解的话,就当你没看过前面这部分,我们直接开始旋转。
旋转公式的推导
以下所说的旋转,全部都是逆时针。y=sina,x = cosa,a表示当前角度, theta是角度的变化量。
绕z轴
这个就是我们熟悉的二维笛卡尔直角坐标系,xOy。 注意 x y 这个顺序不能乱,这个顺序不同于前面所说,接下来的 aOb 全部是按照旋转方向来写的。
我们把某点(x, y) 旋转θ角,会得到(x1,y1)。 假设(x1,y1) 可以由(x, y)线性变换得到,也就是说。(a1x + b1y, a2x + b2y) =(x1,y1)。 显然, 我们只要求出那四个系数即可,而这些系数必然和角度有关。
求解这个最简单的方法就是特殊值代入。从特殊到一般。 90deg 很特殊,很适合。
把点 (1,0) 旋转90度, 得到(0,1)。代入得 a1= cosθ, a2=sinθ。 把点 (0,1) 旋转-90度,得到(1,0),代入可得 b1 = -sinθ, b2= cosθ ;
我们现在可以把z分量加上去, 显然旋转不受z分量的影响,因此z坐标在xy的系数全部为0,本身是1。
写成矩阵,我们把向量看做是列向量,矩阵放左边,向量放右边,前行后列相乘,结果是一个列向量。
矩阵的第一行就是 cosθ, -sinθ, 0. 第二行就是cosθ , sinθ, 0, 最后一行 0 0 1。
绕x轴
其实和z轴一模一样。就是我们要确定是 zOy 还是 yOz。 如何确定?
很简单。作为右手系都是逆时针,一个轴能逆时针旋转90度和另一个轴重合就是正方向,这是我的个人理解,因为这样好确定旋转方向。
y轴旋转90度就和z轴重合了,z轴旋转90度和y轴反向。 所以是 yOz 。 确定了这一点,下面就完全一样了。
这里的一样,指的是旋转这个线性变换一样 , 也就是说,线性组合的系数是一样的,只不过,现在换了坐标系。
之前是 xoy, x轴旋转90度,到y轴, 现在是yoz,y轴旋转90度到z轴。
以前的 (x,y, z) --> ( x·cosθ + y· (-sinθ), x·sinθ + y·cosθ, z)
现在的 (x,y,z) --> (x , y·cosθ + z·(-sinθ), y·sinθ + z·cosθ) ,
把 (0,1,0) 旋转90度得到 (0,0,1)。 结果就应该是。
矩阵的第一行就是 1, 0, 0
第二行就是 0, cosθ, -sinθ,
最后一行 0, sinθ, cosθ。
绕y轴
同上。 就是我们要确定是 zOx 还是 yOx。 z轴旋转90度就和x轴重合了,所以是 zOx 。
把 (0,0,1) 旋转90度得到 (1,0,0)。
但是这里有一个问题,那就是 z=- sina,x = cosa,此处的a不是变化量,而是以x轴为起始边,逆时针的角度。 我就直接把用和角公式的推导过程写出来吧。
(x,y,z)就是(cosa,y,-sina)。旋转sinθ 角得到 (cos(a +θ), y, -sin(a+θ))
也就是(cosθcosa -sinasinθ, y, - cosasinθ -sinacosθ) ===> (cosθ·x + sinθ·z, y, - sinθ·x+ cosθ·z)
矩阵的第一行就是 cosθ, 0, sinθ 对应x的结果
第二行就是 0, 1, 0,
最后一行 -sinθ, 0, cosθ 对应z
加上齐次坐标
齐次就是在原本维度上增加一维, 0 代表向量 其他数字代表点位 数字为1时就是原始坐标值。
至于多出来的一行 ,暂且不必理会。
和角公式
用和角公式推导也可以, 和角公式就是一般性的推导了,反而很简单。
单位圆 一点(x,y),用角度来表示就是(cosα, sinα)。
旋转β度之后 就是(cos(α+β),sin(α+β)),这里说的仍然是旋转角度的变化,和坐标计算的角度无关。
用和角公式就是 (cosβ·cosα - sinβ·sinα, sinβ·cosα + cosβ ·sinα )
系数就是 (cosβ, -sinβ) (sinβ,cosβ)
附上和角公式