DirectX学习之-------从零做起 (续)

2.6  复数和四元数

            

 四元数有个别称:最简单的超复数。实际上可以理解为四元数是复数概念的扩展,复数的概念由四元数扩展到高维在抽象代数的发展上有很

 

 重要的意义。四元数可以构造强制变换的有力工具,尤其是在物体的旋转和变换中。

            

 先来理解一下复数:
           

  复数由实部和虚部组成:z=(a+b*i) ,其中a为实部,b为虚部。
            

 下面来看下复数的九种运算方式:sqrt(a2+b2)
             

 1.复数的范数:复数向量的模.
             

 2.复数与标量相乘或相除:符合乘法分配律,实部与虚部分别进行乘除运算.
             

 3.复数加法和减法:实部与实部相加减,虚部与虚部相加减。
             

4.复数加法恒等元:与任何复数相加,结果仍未该复数。(0+0*i),加法恒等元好似实数中0的概念.
             

5.复数加法逆元素:任何复数与其加法逆元素相加,结果为复数加法恒等元。
             

 6.共轭复数:指两个复数,实部相等,虚部互为相反数,这两个复数互为共轭复数。
             

7.复数乘法:以一个复数的实部和虚部分别去乘另一个复数的实部和虚部,结果相加。复数相乘得到的是一个新的复数,符合乘法分配律。
             

 8.复数除法:除数和被除数,同时乘以除数的共轭复数,转换为复数除以实数的运算。
            

  9.复数的倒数和复数本身相乘,结果为1。(1+0*i)

            

  与复数相似,一个四元数有一个实部三个虚部:q=s+ia+jb+kc
           

   其中,虚数项系数a.b.c.是实数;参数s也是实数,称为标量部分。而参数i,j,k是虚数:
           

   i2=j2=k2=-1                       ij=ji=k                (1)

            

  => jk=-kj=i   ,       ki=-ik=j                         (2)

            

  i,j,k可以看作3个相互垂直的单位向量,这七个叫做四元数的basis ,向量基。
            

  其标量的乘法为:以四元数的4个分量的每一个分量乘以标量的值,加法也是同样的道理。
            

  两个四元数的乘法遵循 (1)、(2)两个方程式的操作。

            

  四元数的排列法和复数类似:q=(s,v),v是向量(a,b,c)于是:

            

  四元数的加法:q1+q2=(s1+s2,v1+v2)
           

   四元数的乘法:q1*q2=(s1s2-v1●v2, s1v2+s2v1+v1 X v2)
            

  四元数的平方值:|q|2=s2+v v
            

  四元数的逆:q-1=(1/|q|2) * (s,-v)
            

  所以有:qq-1=q-1q=(1,0)

           

   四元数的理解和应用需要一个过程,这里就先复习这些。

   

 2.61  图形变换

           

  在复习这部分内容之前,必须明确三维图形变换的显示流程:

           

  输入用户坐标  ->  投影  ->  对窗口裁剪  -> 窗口到视区的变换  ->  显示或绘图

           

  先来看下齐次坐标的内容。

            

 2.6.1.1 齐次坐标

 

            

      将一个原本是n维的向量用一个n+1维向量来表示,这就是所谓的齐次坐标表示法了。 为实数。显然一个向量的齐次表示是不唯一的,

 

齐次坐标的h取不同的值都表示的是同一个点,比如齐次坐标[8,4,2]、[4,2,1]表示的都是二维点[2,1]。
            

      普通坐标和齐次坐标的关系为宜一对多。若二维点(x,y)的齐次坐标为(hx,hy,h) , 则[h1x, h1y, h1]  ,  [h2x, h2y, h2],.....等等 ,

 

而它们实际上都表示二维空间中的同一个点 (x , y) 的齐次坐标 , 就好像[8,4,2]、[4,2,1]。同理:三维空间的齐次坐标为[hx,hy,hz,h]。

 

那如此煞费波折的使用它是为了什么呢?

            

      首先,提供了以矩阵运算把二维,三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。
            

一个二维的齐次坐标变换矩阵的形式是一个三维的方形矩阵。
                              a    d    g
                  A = { b     e    h }
                              c     f     i

            

其次,可以表示一个无穷远的点。如:n+1维中, h=0的齐次坐标实际上标识了一个n维的无穷远点。
           

  对于二维齐次坐标[a, b, h]: 当h->0, 表示了ax+by=0的直线 ,  即:  在 y= -(a/b)x 上的连续点 [x, y], 逐渐趋于无穷远, 但斜率不变.

 

那在三维情况下利用其次坐标表示视点在原点时的投影变换 ,  几何意义上便会更加清晰了.
           

 

  一个齐次向量可以表示为 : p=(px , py , pz , pw) , 对于点, pw=1 ;对于向量, pw=0.  而如果是投影变换可以用其他值来取代pw , 得

 

到的是经过投影的点。

            

2.6.1.2  二维图形几何变换


                         如果:
                              a    d    g
                  A = { b     e    h }
                              c     f     i

           

   那么:

            

   a,b,d,e,完成对图形的缩放, 旋转, 对称, 错切等变换.
             

  c, f : 平移变换
            

   g, h: 投影变换
                    

   其中, g可在y轴的1/g处产生一个灭点 ;  h可在 y轴的1/h 处产生一个灭点 .

            

   i : 可对整个图形伸缩变换.

            

   平移变换: 
                                                   1    0   0
                [x"  y"  1]= [x  y  1] * [0    1   0]=[x+Tx   y+Ty    1]
                                                   Tx  Ty  1

             
               比例变换(缩放变换, 下同): 

 

                                                   Sx    0    0
                [x"  y"  1]= [x  y  1] * [ 0    Sy   0]=[Sx*x    S y*y    1]
                                                    0     0    1

 

 

                       Sx=Sy=1时:  恒等比例变换;
                       Sx=Sy>1时:  等比例放大;
                       Sx=Sy<1时:  等比例缩小;
                       Sx不等于Sy时: 非均匀变换

              

 对称变换: 
                                                   a    d   0
                [x"  y"  1]= [x  y  1] * [b    e   0]=[ax+by    x+ey    1]
                                                   0     0   1

             

  旋转变换: 
                                                   cosθ     sinθ    0
                [x"  y"  1]= [x  y  1] * [-sinθ    cosθ    0]=[xcosθ-ysinθ     xsinθ+yxcosθ     1]
                                                       0          0      1

       
            

   错切变换: 
                                                   1    d   0
                [x"  y"  1]= [x  y  1] * [b    1   0]=[x+by    dx+y    1]
                                                   0     0   1

             

 上面这些如果想通了, 复合变换其实也就无需多说了 , 其实我们主要明白的是原理, 大部分时候, 我们还是使用数学库来运算的 :)

             

2.6.3  三维图形几何变换
               

 2.6.3.1 基本变换

               

 其实看完上面的二维变换, 三维也就好理解多了.
                

                  

变换矩阵
                      

  三维图形的几何变换通过一个4*4的矩阵来表示:


                                 a11     a12    a13    a14
                         T= { a21     a22    a23    a24  }
                                 a31     a32    a33    a34
                                 a41     a42    a43    a44

                     

 变换的功能以4个子矩阵来体现:

                    

  a11,a12.a13;a21,a22,a23;a31,a32,a33 :  也就是一个3*3的矩阵 ,  负责 比例, 旋转 , 错切 等变换;
                     

 a41,a42,a43:  平移变换 ;
                    

  a14,a24,a34:  投影变换;
                    

  a44 :  整体比例变换.

                  

 (1)平移变换
                                                                             1      0    0   0
                                                                             0      1    0   0
                       [x"    y"    z"    1]=[x    y    z    1]=[0      0    1   0 ] =[x+Tx    y+Ty    z+Tz    1]
                                                                             Tx   Ty   Tz  1

                 

  (2)比例变换

                       

 矩阵S(s)=S(sx,sy,sz). 使对象沿xyz轴以缩放因子sx,sy,sz放大或缩小, 值越大, 倍数越大, 若各分量为1 , 则表示没有缩放.
                                 

                                    sx   0    0  0
                       S(s)= {  0   sy   0  0 }
                                    0   0   sz  0
                                    0   0    0  1

                      

 缩放因子的一个或者三个分量如果置负, 就会产生一个 Reflective  Matrix (反射矩阵) , 也称为iMirror  Matrix (镜像矩阵) .如其中两个因

 

子是-1将会旋转180度 .  当发现变换矩阵为反射矩阵的时候, 通常需要特殊处理.
                     

  缩放矩阵S(s)的逆矩阵为: S"(s)=S(1/sx , 1/sy, 1/sz)

                  

 (3)旋转变换
                     

  我们以矩阵R来表示一个旋转矩阵, 同样的三维环境下, 它是4*4的矩阵 , 如果是二维则是3*3矩阵.
                     

  假设: Rx(θ) ,  Ry(θ) ,  Rz(θ) , 分别为:绕x , y , z轴的旋转变换 , 旋转角度为θ , 则各旋转矩阵表示为:

                                     1       0          0       0
                       Rx(θ) ={ 0    cosθ     sinθ    0 }
                                     0    -sinθ     cosθ   0
                                     0        0          0      1


                                     cosθ    0    -sinθ    0
                       Ry(θ) ={    0       1       0       0 }
                                      sinθ     0    cosθ    0
                                         0       0       0       1


                                     cosθ     sinθ     0    0
                       Rz(θ) ={ -sinθ    cosθ    0    0 }
                                        0          0       1    0
                                        0          0       0    1


                       假设点 P(px, py, pz, 1) , 则p 与Rz(θ)的乘积为 :


                                                        cosθ     sinθ     0     0
                       pR= (px, py, pz, 1) { -sinθ    cosθ     0     0  } = (pxcosθ-pysinθ, pxsinθ+pycosθ, pz ,1)  得到一个变换后的新点 p"
                                                           0          0        1     0
                                                           0          0        0     1
                   
                     

  对于绕任意轴旋转角度θ的旋转矩阵R , 从中取出与旋转变换相关的3*3的子矩阵, 可以计算出其对角元素之和 是一个与坐标轴勿怪的常

 

数,  称为:  Trace (迹)

                       

                 tr(R)=1+2cosθ

                       

所以旋转矩阵R, 可以旋转的同时保持各点的位置.

             

   

2.6.3.2 特殊变换

                       

(1)欧拉变换
                           

通常用于构造一个自定位或使任何实体处于特定方向的矩阵.
                           

首先, 定义一个默认的观察方向, 欧拉变换是绕三个旋转轴的旋转矩阵的乘积 : M=Rx Ry Rz
                          

  三个坐标轴的旋转角度成为欧拉角Euler. 绕x轴的是倾斜角pitch, y轴的是 翻滚角或偏转角 head or yaw ,z轴为摇摆角 roll, 物体

 

朝向以欧拉角表示。但需要注意的是:
                          

  1.它的旋转必须按某个特定次序进行.
                         

   2.有可能导致 Gimbal Lock  顾名思义, 万向节死锁. example:一个平行与学】轴的向量绕y轴旋转90度,平行于x轴,那么所有绕z

 

轴的旋转都不再起作用。

                       

(1)四元数变换
                           

为了解决欧拉变化中的死锁问题,可以引入四元数变换。它占用的空间较小,当然,如果矩阵相乘采用了硬件实现,那么,矩阵乘法,效率

 

将更高。由于有了它就不需要计算三角函数,所以转换过程效率较高。这里需要提及矩阵和四元数之间的相互转换,本文此处暂且不提。

               

 2.6.3.4  投影变换
                   

投影是什么?  (x, y, z) => (x, y) ,n 维空间的点变换为小于n维空间的点. 投影,主要包括三个方面  投影的对象; 投影的面 和投影线,投影线

 

是投影对象与投影面之间的联线.以投影线的角度分: 主要分为 平行投影和透视投影.(Parallel  Projection & Perspective Projection).

                   

平行投影里面有正交平行投影和斜交平行投影.
                  

 

  所谓正交平行投影, 投影线与投影面成90度角,所以,如果投影到x,y平面.则投影对象的x,y分量不变,z分量变为0.斜交平行投影是投影线与投

 

影面成α角.交点a离开正交投影与投影面的交点b的距离为L, L与X夹角为Φ则: x"=x+LcosΦ  ,y"=x+YsinΦ  , z"=0.其中 L与α的关系:

 

tanα=z/L. 所以α一定时Lz成正比.如果z=1, 它的矩阵运算为 a11, a22, a44.为1 . a31,a32为L1cosΦ.L1sinΦ.其他为0.
                   

 

透视投影是一组从投影中心产生的不平行的投影线. 不平行于投影平面的视线汇聚的一点称为灭点.,也就是投影中心.在坐标轴上的灭点叫做主

 

灭点, 按照主灭点的个数可分为一点透视和二点、三点透视.一般情况,只考虑一点透视.
                  

       为简化问题的叙述,导出视点选在z轴上,且取与此轴垂直的坐标平面为画面的透视投影公式。设视点E(0,0,ze)在z轴上,空间点为

 

P(xp,yp,zp),则视线EP的直线方程为:
                    DirectX学习之-------从零做起 (续)_第1张图片

 

       透视投影转换为平行投影,遵循:对一个空间物体,一定存在另一个空间物体,使前者在画面上的透视投影与后者的平行投影是一样的,且保留了深度方向的对应关系。

你可能感兴趣的:(DirectX学习之-------从零做起 (续))