3D数学基础:图形和游戏开发第二版学习笔记——2

第八章

本章讨论的是三维旋转,其重点是如何描述三维旋转,用了几种表示方法并进行比较。前篇文章里我们分析过了描述一个旋转需要一个轴和一个角度,这包含了四个数据,如果我们假定轴从原点出发,那么我们只需要三个数据。

旋转矩阵

前文已经得到了旋转矩阵,需要注意的是方向余弦矩阵,其与旋转矩阵等价,这个说法其实更数学, a i j aij aij的值等于i,j坐标轴方向向量的点积。
优点:   1:可以直接使用
      2:和图形API接口契合
      3:方便运算(嵌套组合求逆)
缺点:   1:人类难以直接使用
      2:使用了9个数据,有6度冗余,带来空间,格式等问题(如矩阵蠕变)

欧拉角

用三个正交的轴方向的旋转角度表示旋转。
优点:   1:人类理解容易
缺点:   1:万向节死锁
      2:插值麻烦

轴+角 指数映射

前文已经提到,我们呢可以用一个单位向量 n n n表示轴,一个 θ θ θ,表示角度,由于 n n n是单位向量,所以实际上它长度固定,用三个数据表示是冗余的,但是我们通过不能省去某个坐标,毕竟根据长度得到的需要判断正负,当然你可以选择某种方式去约定,当时这里有个更简单的方法: θ n θn θn,因为n长度为1,我们可以分离出 θ θ θ,这也就是指数映射,当然如果你学过李代数,你会有更深的理解。

四元数

四元数,也就是用 ( w , x , y , z ) (w,x,y,z) (w,x,y,z)来表示旋转,它当然也存储了轴 n n n和角度 θ θ θ,不过存储的方式比较独特:
( w , v ) = ( w , x , y , z ) = ( c o s ( θ / 2 ) , s i n ( θ / 2 ) n ) = ( ( c o s ( θ / 2 ) , s i n ( θ / 2 ) n x , s i n ( θ / 2 ) n y , s i n ( θ / 2 ) n z ) (w,v)=(w,x,y,z)=(cos(θ/2),sin(θ/2)n)=((cos(θ/2),sin(θ/2)n_x,sin(θ/2)n_y,sin(θ/2)n_z) (w,v)=(w,x,y,z)=(cos(θ/2),sin(θ/2)n)=((cos(θ/2),sin(θ/2)nx,sin(θ/2)ny,sin(θ/2)nz)

四元数数学基础
  1. 四元数求负:每个分量变负
  2. 单位四元数 ( 1 , 0 , 0 , 0 ) (1,0,0,0) (1,0,0,0) ( − 1 , 0 , 0 , 0 ) (-1,0,0,0) (1,0,0,0)(严格意义上不是),表无位移,虽然变换意义上相同,数学上不同
  3. 四元数大小:只说旋转的话——1(重要性质)
  4. 共轭和逆:只考虑旋转的话,由3可得 q ∗ = q − 1 q^*=q^{-1} q=q1
  5. 四元数乘法:哈密尔顿积: q 1 q 2 = [ w 1 , v 1 ] [ w 2 , v 2 ] = [ w 1 w 2 − v 1 ⋅ v 2 , w 1 v 2 + w 2 v 1 + v 1 ∗ v 2 ] q_1q_2=[w_1,v_1][w_2,v_2]=[w_1w_2-v_1·v_2,w_1v_2+w_2v_1+v_1*v_2] q1q2=[w1,v1][w2,v2]=[w1w2v1v2,w1v2+w2v1+v1v2]
  6. 乘法性质:和矩阵一毛一样,可结合不可交换,大小等于各自大小乘积,求导数顺序反过来的,都挺好推的
  7. 表示旋转:线代既视感:用 q q q四元数旋转向量 p p p p ‘ = q p q − 1 p^`=qpq^{-1} p=qpq1,多个旋转类比矩阵易得
  8. 四元数的差:其实更像商, d a = b da=b da=b,故 d = b a − 1 d=ba^{-1} d=ba1
  9. 四元数点积:同向量点积
  10. 四元数对数和指数: l o g [ c o s ( θ / 2 ) , s i n ( θ / 2 ) n ] = [ 0 , θ n ] log[cos(θ/2),sin(θ/2)n]=[0,θn] log[cos(θ/2),sin(θ/2)n]=[0,θn] e x p ( [ 0 , θ n ] ) = [ c o s ( θ / 2 ) , s i n ( θ / 2 ) n ] exp([0,θn])=[cos(θ/2),sin(θ/2)n] exp([0,θn])=[cos(θ/2),sin(θ/2)n]该定义的意义看定义就能直观理解一部分,但是另一部分是和插值有关的,看了11就能明白
  11. t : 0 − > 1 , q t : [ 1 , 0 ] − > q t:0->1,q^t:[1,0]->q t:0>1,qt:[1,0]>q,因为有 q t q^t qt插值,而 q t = e x p ( t l o g q ) q^t=exp(tlogq) qt=exp(tlogq)
  12. Slerp公式:旋转四元数都是单位长度,因而实际分布在四维超空间的超球面上,可以做球面线性插值。这里推荐大家自行推导下(之前的也都可以推,但是数学基础好的应该秒出就没说)图片挡答案大法在这里插入图片描述
    借用下书上的插图,书上这里做了vt的平行线,我推导的时候直接基向量分解了,能得到一个等价的结果,具体是书上的 s i n ( 1 − t ) w sin(1-t)w sin(1t)w用三角函数公式拆开来

在这里插入图片描述

四元数和复数

对于复数 a + b i a+bi a+bi,我们可以用一个矩阵表示它,即: a + b i = [ a b − b a ] (列向量版本,书上为行向量版本) a+bi= \left[ \begin {matrix} a & b \\ -b & a \\ \end{matrix} \right] \tag{列向量版本,书上为行向量版本} a+bi=[abba](列向量版本,书上为行向量版本)
那我们考察对于一个单位复数 c o s θ + i s i n θ cosθ+isinθ cosθ+isinθ,我们惊讶的发现它的矩阵居然是二维旋转矩阵那三维呢?哈密尔顿为我们拓展了复数域,我们需要三个虚数,一个实数(所以是四元数)具体感兴趣的可以看一下哈密尔顿方程

比较

欧拉角最易于人类理解,矩阵一般是标准结果和最终结果(如图形API),但是中间经常不使用它,四元数易于插值用的最多,轴角和指数映射由于直接存了角度,在需要获得角度的情况下使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值