计算几何,三维向量的旋转
2012-07-14 09:53
267 查看
写这篇日志有两个目的:一来是想测试新装上去的LaTeX插件显示数学公式是否好用(不过貌似通过RSS获取到的日志是没有办法显示的……);二来是对于三维向量绕任意轴的旋转之前我都是用结论的,今天因为做计算机图形学的作业去推导了一下,发现计算量相当大,算了我一个早上,故特以此日志留念。
言归正传,首先我们讨论二维向量的旋转。
对于一个向量OP(x, y),我们如何得知其绕原点O,沿逆时针方向(注意,以下所说的旋转均指逆时针方向,并且对于三维的情况我们假定坐标系都是符合右手定则的)旋转θ后的向量OP'(x', y')呢?
我们采取参数方程进行推导。设向量OP的长度为r,其辐角为φ,则其可表示为OP(r cos(φ), r sin(φ)),这样其旋转θ后的向量就可表示为OP'(r cos(φ + θ), r sin(φ + θ)),由三角函数的合角公式即可得到OP'(x cos(θ) - y sin(θ), x sin(θ) + y cos(θ))。
我们知道,几何中的变换是可以用线性代数中的矩阵进行描述的,上述旋转变换如果用矩阵描述便如下所示:
[cosθsinθ−sinθcosθ]⋅[xy]=[xcosθ−ysinθxsinθ+ycosθ]
好,现在我们已经知道如何进行二维向量的旋转了,那么我们开始讨论三维向量的旋转。
与二维向量不同,三维向量的旋转必须首先确定转动轴。那么首先来看三种特殊情况:绕x轴旋转、绕y轴旋转、绕z轴旋转。
注意到这三种特殊情况和二维情况是类似的,因为向量总在某个坐标平面内进行旋转,因此我们可以很容易地把前面那个矩阵扩展到三维,即如下所示:
Rx(θ)=⎡⎣1000cosθsinθ0−sinθcosθ⎤⎦
Ry(θ)=⎡⎣cosθ0−sinθ010sinθ0cosθ⎤⎦
Rz(θ)=⎡⎣cosθsinθ0−sinθcosθ0001⎤⎦
现在,我们来看看如何推导向量绕任意轴向量OS(x, y, z)旋转的矩阵吧。
我们可以这样,先将向量OS通过旋转与x轴重合,这样绕向量OS的旋转就变为了绕x轴的旋转,之后我们再将向量OS转回原来的位置。
为此,我们首先将向量OS通过旋转与x轴重合。分为两步:首先将向量OS绕x轴旋转,直到向量OS处于yOz平面上;再将向量OS绕y轴旋转,直到向量OS与x轴重合。
事实上,通过简单的几何关系,我们可以得出两步中所需要转动角度的sin值和cos值。由此可以写出这两步变换分别对应的矩阵,如下所示(如果难以理解,可以画画图并对照前面绕坐标轴旋转的矩阵):
R1=⎡⎣⎢⎢⎢⎢⎢⎢1000zy2+z2−−−−−−√yy2+z2−−−−−−√0−yy2+z2−−−−−−√zy2+z2−−−−−−√⎤⎦⎥⎥⎥⎥⎥⎥
R2=⎡⎣⎢⎢⎢⎢⎢⎢⎢xx2+y2+z2−−−−−−−−−−√0−y2+z2−−−−−−√x2+y2+z2−−−−−−−−−−√010y2+z2−−−−−−√x2+y2+z2−−−−−−−−−−√0xx2+y2+z2−−−−−−−−−−√⎤⎦⎥⎥⎥⎥⎥⎥⎥
接下来,绕向量OS的旋转就变为了绕x轴的旋转,设旋转角度为θ,则对应的矩阵如下所示:
R3=⎡⎣1000cosθsinθ0−sinθcosθ⎤⎦
最后,需要把向量OS转回原来的位置,这只需要把前面的角度取相反数即可,可以立刻写出矩阵,如下所示:
R4=⎡⎣⎢⎢⎢⎢⎢⎢⎢xx2+y2+z2−−−−−−−−−−√0y2+z2−−−−−−√x2+y2+z2−−−−−−−−−−√010−y2+z2−−−−−−√x2+y2+z2−−−−−−−−−−√0xx2+y2+z2−−−−−−−−−−√⎤⎦⎥⎥⎥⎥⎥⎥⎥
R5=⎡⎣⎢⎢⎢⎢⎢⎢1000zy2+z2−−−−−−√−yy2+z2−−−−−−√0yy2+z2−−−−−−√zy2+z2−−−−−−√⎤⎦⎥⎥⎥⎥⎥⎥
由于矩阵乘法满足结合律,现在,让我们顺次将这些矩阵相乘,最终得到向量绕任意轴OS(x, y, z)旋转的矩阵,如下所示:
R=R5R4R3R2R1=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢x2+(y2+z2)cosθx2+y2+z2yx(1−cosθ)x2+y2+z2+zsinθx2+y2+z2−−−−−−−−−−√zx(1−cosθ)x2+y2+z2−ysinθx2+y2+z2−−−−−−−−−−√xy(1−cosθ)x2+y2+z2−zsinθx2+y2+z2−−−−−−−−−−√y2+(z2+x2)cosθx2+y2+z2zy(1−cosθ)x2+y2+z2+xsinθx2+y2+z2−−−−−−−−−−√xz(1−cosθ)x2+y2+z2+ysinθx2+y2+z2−−−−−−−−−−√yz(1−cosθ)x2+y2+z2−xsinθx2+y2+z2−−−−−−−−−−√z2+(x2+y2)cosθx2+y2+z2⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
看上去很复杂吧?这是我推了一早上得到的最终结果……不保证正确性……不过呢,如果向量OS的长度恰为1(这很容易办到),那么这个矩阵就可以大大简化了,如下所示:
R=⎡⎣⎢⎢x2+(1−x2)cosθyx(1−cosθ)+zsinθzx(1−cosθ)−ysinθxy(1−cosθ)−zsinθy2+(1−y2)cosθzy(1−cosθ)+xsinθxz(1−cosθ)+ysinθyz(1−cosθ)−xsinθz2+(1−z2)cosθ⎤⎦⎥⎥
虽然公式看似繁杂,但可以看出对称性是很强的,其实是很优美的!
嗯,就这样了,如果有误敬请指正!
转自:http://dumbear.com/blog/?p=143
另参考:http://gaoyunxiang.com/?p=13
言归正传,首先我们讨论二维向量的旋转。
对于一个向量OP(x, y),我们如何得知其绕原点O,沿逆时针方向(注意,以下所说的旋转均指逆时针方向,并且对于三维的情况我们假定坐标系都是符合右手定则的)旋转θ后的向量OP'(x', y')呢?
我们采取参数方程进行推导。设向量OP的长度为r,其辐角为φ,则其可表示为OP(r cos(φ), r sin(φ)),这样其旋转θ后的向量就可表示为OP'(r cos(φ + θ), r sin(φ + θ)),由三角函数的合角公式即可得到OP'(x cos(θ) - y sin(θ), x sin(θ) + y cos(θ))。
我们知道,几何中的变换是可以用线性代数中的矩阵进行描述的,上述旋转变换如果用矩阵描述便如下所示:
[cosθsinθ−sinθcosθ]⋅[xy]=[xcosθ−ysinθxsinθ+ycosθ]
好,现在我们已经知道如何进行二维向量的旋转了,那么我们开始讨论三维向量的旋转。
与二维向量不同,三维向量的旋转必须首先确定转动轴。那么首先来看三种特殊情况:绕x轴旋转、绕y轴旋转、绕z轴旋转。
注意到这三种特殊情况和二维情况是类似的,因为向量总在某个坐标平面内进行旋转,因此我们可以很容易地把前面那个矩阵扩展到三维,即如下所示:
Rx(θ)=⎡⎣1000cosθsinθ0−sinθcosθ⎤⎦
Ry(θ)=⎡⎣cosθ0−sinθ010sinθ0cosθ⎤⎦
Rz(θ)=⎡⎣cosθsinθ0−sinθcosθ0001⎤⎦
现在,我们来看看如何推导向量绕任意轴向量OS(x, y, z)旋转的矩阵吧。
我们可以这样,先将向量OS通过旋转与x轴重合,这样绕向量OS的旋转就变为了绕x轴的旋转,之后我们再将向量OS转回原来的位置。
为此,我们首先将向量OS通过旋转与x轴重合。分为两步:首先将向量OS绕x轴旋转,直到向量OS处于yOz平面上;再将向量OS绕y轴旋转,直到向量OS与x轴重合。
事实上,通过简单的几何关系,我们可以得出两步中所需要转动角度的sin值和cos值。由此可以写出这两步变换分别对应的矩阵,如下所示(如果难以理解,可以画画图并对照前面绕坐标轴旋转的矩阵):
R1=⎡⎣⎢⎢⎢⎢⎢⎢1000zy2+z2−−−−−−√yy2+z2−−−−−−√0−yy2+z2−−−−−−√zy2+z2−−−−−−√⎤⎦⎥⎥⎥⎥⎥⎥
R2=⎡⎣⎢⎢⎢⎢⎢⎢⎢xx2+y2+z2−−−−−−−−−−√0−y2+z2−−−−−−√x2+y2+z2−−−−−−−−−−√010y2+z2−−−−−−√x2+y2+z2−−−−−−−−−−√0xx2+y2+z2−−−−−−−−−−√⎤⎦⎥⎥⎥⎥⎥⎥⎥
接下来,绕向量OS的旋转就变为了绕x轴的旋转,设旋转角度为θ,则对应的矩阵如下所示:
R3=⎡⎣1000cosθsinθ0−sinθcosθ⎤⎦
最后,需要把向量OS转回原来的位置,这只需要把前面的角度取相反数即可,可以立刻写出矩阵,如下所示:
R4=⎡⎣⎢⎢⎢⎢⎢⎢⎢xx2+y2+z2−−−−−−−−−−√0y2+z2−−−−−−√x2+y2+z2−−−−−−−−−−√010−y2+z2−−−−−−√x2+y2+z2−−−−−−−−−−√0xx2+y2+z2−−−−−−−−−−√⎤⎦⎥⎥⎥⎥⎥⎥⎥
R5=⎡⎣⎢⎢⎢⎢⎢⎢1000zy2+z2−−−−−−√−yy2+z2−−−−−−√0yy2+z2−−−−−−√zy2+z2−−−−−−√⎤⎦⎥⎥⎥⎥⎥⎥
由于矩阵乘法满足结合律,现在,让我们顺次将这些矩阵相乘,最终得到向量绕任意轴OS(x, y, z)旋转的矩阵,如下所示:
R=R5R4R3R2R1=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢x2+(y2+z2)cosθx2+y2+z2yx(1−cosθ)x2+y2+z2+zsinθx2+y2+z2−−−−−−−−−−√zx(1−cosθ)x2+y2+z2−ysinθx2+y2+z2−−−−−−−−−−√xy(1−cosθ)x2+y2+z2−zsinθx2+y2+z2−−−−−−−−−−√y2+(z2+x2)cosθx2+y2+z2zy(1−cosθ)x2+y2+z2+xsinθx2+y2+z2−−−−−−−−−−√xz(1−cosθ)x2+y2+z2+ysinθx2+y2+z2−−−−−−−−−−√yz(1−cosθ)x2+y2+z2−xsinθx2+y2+z2−−−−−−−−−−√z2+(x2+y2)cosθx2+y2+z2⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
看上去很复杂吧?这是我推了一早上得到的最终结果……不保证正确性……不过呢,如果向量OS的长度恰为1(这很容易办到),那么这个矩阵就可以大大简化了,如下所示:
R=⎡⎣⎢⎢x2+(1−x2)cosθyx(1−cosθ)+zsinθzx(1−cosθ)−ysinθxy(1−cosθ)−zsinθy2+(1−y2)cosθzy(1−cosθ)+xsinθxz(1−cosθ)+ysinθyz(1−cosθ)−xsinθz2+(1−z2)cosθ⎤⎦⎥⎥
虽然公式看似繁杂,但可以看出对称性是很强的,其实是很优美的!
嗯,就这样了,如果有误敬请指正!
转自:http://dumbear.com/blog/?p=143
另参考:http://gaoyunxiang.com/?p=13
相关文章推荐
- Archipelago - SGU 120(计算几何向量旋转)
- poj 2957 计算几何向量的旋转
- 计算几何之向量旋转
- 计算几何初步-向量的旋转 Rescue The Princess
- Board Wrapping(计算几何求凸包加向量的旋转)
- HDU 4449 Building Design 第37届ACM/ICPC 金华赛区H题 (计算几何,三维凸包+空间坐标旋转+二维凸包)
- sdut 2603:Rescue The Princess(第四届山东省省赛原题,计算几何,向量旋转 + 向量交点)
- POJ2991_Crane_计算几何::向量化|向量旋转公式||线段树维护向量和
- poj 2194 Stacking Cylinders 计算几何之向量旋转
- poj 2957 计算几何向量的旋转
- SGU 110 三维计算几何 向量的灵活运用
- 特征值和特征向量的几何意义、计算及其性质(一个变换(或者说矩阵)的特征向量就是这样一种向量,它经过这种特定的变换后保持方向不变,只是进行长度上的伸缩而已)
- 计算两向量的旋转角
- POJ 2187 计算几何之旋转卡壳
- HDU 3692 Shade of Hallelujah Mountain (计算几何,三维空间点的旋转,二维凸包)
- !HDU 4380 三角屋内有奇数个宝藏的三角形有多少个-计算几何-(向量叉乘&线段与点的关系&暴力枚举)
- HDU 1174 爆头(三维计算几何)
- 【计算几何】推导坐标的旋转公式
- 征值和特征向量的几何意义、计算及其性质
- 三维计算几何模板--表面三角形个数 表面多边形个数 三维凸包 表面积 凸包重心 点到面的距离