###### Popy007(Twinsen)的专栏

3-D图形学算法在游戏程序中的应用

###### 向量几何在游戏编程中的使用5

<5>物体的旋转
-Twinsen编写

-本人水平有限，疏忽错误在所难免，还请各位数学高手、编程高手不吝赐教

1、矩阵加减法

m +(-) M =

[a b c]      [A B C]   [a+(-)A b+(-)B c+(-)C]
[d e f] +(-) [D E F] = [d+(-)D e+(-)E f+(-)F]
[g h i]      [G H I]   [g+(-)G h+(-)H i+(-)I]

1）结合律 m + (M + N) = (m + M)  + N
2) 交换律 m + M = M + m

2、数量乘矩阵

k x M =

[A B C]   [kxA kxB kxC]
k x [D E F] = [kxD kxE kxF]
[G H I]   [kxG kxH kxI]

k和l为常数
1) (k + l) x M = k x M + l x M
2) k x (m + M) = k x m + k x M
3) k x (l x M) = (k x l) x M
4) 1 x M = M
5) k x (m x M) = (k x m) x M = m x (k x M)

3、矩阵乘法

m x M =

[a b c]   [A B C}   [axA+bxD+cxG axB+bxE+cxH axC+bxF+cxI]
[d e f] x [D E F] = [dxA+exD+fxG dxB+exE+fxH dxC+exF+fxI]
[g h i]   [G H I]   [gxA+hxD+ixG gxB+hxE+ixH gxC+hxF+ixI]

1) 结合律 (m x M) x N = m x (M x N)
2) 乘法加法分配律 m x (M + N) = m x M + m x N ； (m + M) x N = m x N + M x N

4、矩阵的转置

m' =

[
a b c]'   [a d g]
[
d e f]  = [b e h
[
g h i]    [c f i]

1）(m x M)' = M' x m'
2）(m')' = m
3）(m + M)' = m' + M'
4）(k x M)' = k x M'

5、单位矩阵

[1 0 0]
E = [0 1 0] 称为3级单位阵
[0 0 1]

6、矩阵的逆

1) (m^-1)^-1 = m
2) (k x m)^-1 = 1/k x m^-1
3）(m')^-1 = (m^-1)'
4) (m x M)^-1 = M^-1 x n^-1

x0 = |R| * cosA
y0 = |R| * sinA
=>
cosA = x0 / |R|
sinA = y0 / |R|

x1 = |R| * cos(A+B)
y1 = |R| * sin(A+B)

x1 = |R| * (cosAcosB - sinAsinB)
y1 = |R| * (sinAcosB + cosAsinB)

cosA = x0 / |R|
sinA = y0 / |R|

x1 = |R| * (x0 * cosB / |R| - y0 * sinB / |R|)
y1 = |R| * (y0 * cosB / |R| + x0 * sinB / |R|)
=>
x1 = x0 * cosB - y0 * sinB
y1 = x0 * sinB + y0 * cosB

x1 = x0 * cos(-B) - y0 * sin(-B)
y1 = x0 * sin(-B) + y0 * cos(-B)
=>
x1 = x0 * cosB + y0 * sinB
y1 = -x0 * sinB + y0 * cosB

[cosA  sinA]      [cosA -sinA]
[-sinA cosA] 或者 [sinA cosA]

[cosA  sinA]
[x, y] x  [-sinA cosA] = [x*cosA-y*sinA  x*sinA+y*cosA]

[x, y]   [cosA  sinA]   [x*cosA-y*sinA  x*sinA+y*cosA]
[0, 0] x [-sinA cosA] = [0              0            ]

[cosA -sinA]   [x 0]   [x*cosA-y*sinA  0]
[sinA  cosA] x [y 0] = [x*sinA+y*cosA  0]

[x y 1]   [1   0   0]   [cosA  sinA 0]   [1    0    0]   [x' y' -]
[0 1 0] x [0   1   0] x [-sinA cosA 0] x [0    1    0] = [-  -  -]
[0 0 1]   [rtx rty 1]   [0     0    1]   [-rtx -rty 1]   [-  -  -]

[1   0   0]   [cosA  sinA 0]   [1    0    0]
M = [0   1   0] x [-sinA cosA 0] x [0    1    0]
[rtx rty 1]   [0     0    1]   [-rtx -rty 1]

[x y 1]
[0 1 0] x M
[0 0 1]

p(x, y, z）是3-D空间中的一点，也可以说是一个位置向量，当以上图中的坐标为准，p点所围绕的中心轴指向你的屏幕之外时，有

p

[x y z 1]   [cosA -sinA 0 0]    [x y z 1]   [cosA sinA  0 0]
[0 1 0 0] x [sinA cosA  0 0] 和 [0 1 0 0] x [-sinA cosA 0 0]
[0 0 1 0]   [0    0     1 0]    [0 0 1 0]   [0     0    1 0]
[0 0 0 1]   [0    0     0 1]    [0 0 0 1]   [0     0    0 1]

p绕x轴逆时针和顺时针旋转角度A分别写成：

[x y z 1]   [1 0     0    0]    [x y z 1]   [1 0     0    0]
[0 1 0 0] x [0 cos  -sinA 0] 和 [0 1 0 0] x [0 cosA  sinA 0]
[0 0 1 0]   [0 sin  cosA  0]    [0 0 1 0]   [0 -sinA cosA 0]
[0 0 0 1]   [0 0    0     1]    [0 0 0 1]   [0 0     0    1]

p绕y轴逆时针和顺时针旋转角度A分别写成：

[x y z 1]   [cosA  0 sinA 0]    [x y z 1]   [cosA 0  -sinA 0]
[0 1 0 0] x [0     1 0    0] 和 [0 1 0 0] x [0     1  0    0]
[0 0 1 0]   [-sinA 0 cosA 0]    [0 0 1 0]   [sinA  0  cosA 0]
[0 0 0 1]   [0     0 0    1]    [0 0 0 1]   [0     0  0    1]

[x y z 1]   [1  0 0  0]   [cosA  0 sinA 0]   [1 0 0 0]   [x' y z' -]
[0 1 0 0]   [0  1 0  0]   [0     1 0    0]   [0 1 0 0]   [-  - -  -]
[0 0 1 0] x [0  0 1  0] x [-sinA 0 cosA 0] x [0 0 1 0] = [-  - -  -]
[0 0 0 1]   [-s 0 -t 1]   [0     0 0    1]   [s 0 t 1]   [-  - -  -]

[x y z 1]   [1  0 0  0]   [1 0    0     0]   [1 0 0 0]   [x  y' z' -]
[0 1 0 0]   [0  1 0  0]   [0 cosA -sinA 0]   [0 1 0 0]   [-  -  -  -]
[0 0 1 0] x [0  0 1  0] x [0 sinA cosA  0] x [0 0 1 0] = [-  -  -  -]
[0 0 0 1]   [0 -s -t 1]   [0 0    0     1]   [0 s t 1]   [-  -  -  -]

[x y z 1]   [1  0  0  0]   [cosA -sinA 0 0]   [1 0 0 0]   [x' y' z  -]
[0 1 0 0]   [0  1  0  0]   [sinA cosA  0 0]   [0 1 0 0]   [-  -  -  -]
[0 0 1 0] x [0  0  1  0] x [0    0     1 0] x [0 0 1 0] = [-  -  -  -]
[0 0 0 1]   [-s -t 0  1]   [0    0     0 1]   [s t 0 1]   [-  -  -  -]

Wow!终于来到了最后一部分，这一节我们将综合运用上面涉及到的所有旋转知识，完成空间一点或着说位置向量围绕空间任意方向旋转轴的旋转变换（我在下面介绍的一种方法是一个稍微繁琐一点的方法，大体上看是利用几个基本旋转的综合。我将在下一篇中介绍一个高档一些的方法）。

1）将红色轴变换到yoz平面上
2) 将yoz平面上的红色轴变到z轴上

[cosA  sinA 0 0]
[-sinA cosA 0 0]
[0     0    1 0]
[0     0    0 1]

cosA = y0 / 轴向量在xoy面的投影长
sinA = x0 / 轴向量在xoy面的投影长

[y0/lr  x0/lr 0 0]
[-x0/lr y0/lr 0 0]
[0      0     1 0]
[0      0     0 1]

[y0/lr -x0/lr 0 0]
[x0/lr y0/lr  0 0]
[0      0     1 0]
[0      0     0 1]

[1 0     0    0]
[0 cosB  sinB 0]
[0 -sinB cosB 0]
[0 0     0    1]

cosB = z0 / 轴向量的长
sinB = lr / 轴向量的长

cosB = z0
sinB = lr

[1 0   0   0]
[0 z0  lr  0]
[0 -lr z0  0]
[0 0   0   1]

[1 0   0   0]
[0 z0  -lr 0]
[0 lr  z0  0]
[0 0   0   1]

[y0/lr  x0/lr 0 0]   [1 0   0  0]   [cosA  sinA 0 0]   [1 0  0   0]   [y0/lr  -x0/lr 0 0]
[-x0/lr y0/lr 0 0]   [0 z0  lr 0]   [-sinA cosA 0 0]   [0 z0 -lr 0]   [x0/lr  y0/lr  0 0]
M = [0      0     1 0] x [0 -lr z0 0] x [0     0    1 0] x [0 lr z0  0] x [0      0      1 0]
[0      0     0 1]   [0 0   0  1]   [0     0    0 1]   [0 0  0   1]   [0      0      0 1]

[x y 0 0]       [x' y' z' -]
[0 1 0 0]       [-  -  -  -]
[0 0 1 0] x M = [-  -  -  -]
[0 0 0 1]       [-  -  -  -]

[1   0    0  0]       [1  0  0  0]
[0   1    0  0]       [0  1  0  0]
m = [0   0    1  0] x M x [0  0  1  0]
[-lx -ly -lz 1]       [lx ly lz 1]

#### 向量几何在游戏编程中的使用

2010年03月07日 116KB 下载

#### 向量几何在游戏编程中的使用2

2013-11-03 00:42:52

#### 经典_向量几何在游戏编程中的使用_带目录.pdf

2009年04月23日 397KB 下载

#### 向量几何在游戏编程中的使用4

2013-11-03 00:47:41

#### 向量几何在游戏编程中的使用5

2009-06-20 16:14:00

#### 向量几何在游戏编程中的使用1

2013-11-03 00:34:42

#### 向量几何在游戏编程中的使用(一)

2013年10月22日 139KB 下载

#### 向量几何在游戏编程中的使用3

2013-11-03 00:46:12

#### [转]向量几何在游戏编程中的使用

2008-02-25 22:42:00

#### 向量几何在游戏编程中的使用6

2005-05-20 14:42:00