图形学知识基础:三维变换,旋转(欧拉角旋转与万向锁,绕任意轴旋转,四元...

图形学知识基础:三维变换,旋转(欧拉⾓旋转与万向锁,绕
钢芯铝绞线任意轴旋转,四元数)
三维变换
与上⼀篇⽂章中的⼆维变换类似,我们可以使⽤⼀个 3*3 的矩阵来表⽰⼀个三维的线性变换:
四季养生论文并且矩阵  的  ,  和  即为  变化后的值,  ,  和  即为  变化后的值,  ,  和  即为  变化后的值。
仿射变换的公式为:
同样的,我们可以通过引⼊齐次坐标来表⽰仿射变换,公式为:
例如缩放s倍的矩阵为:
旋转变换
相⽐其他变换,旋转变换相对的要复杂⼀些。⾸先我们要确定我们的坐标系是左⼿坐标系还是右⼿坐标系,这会影响到x,y,z三个轴的相对关系,本⽂我们使⽤右⼿坐标系来进⾏相关的运算。右⼿坐标系如下图,右⼿四指弯曲的⽅向代表x轴到y轴的⽅向,⼤拇指⽅向代表z轴⽅向。
我们先来看看在三维空间中绕x,y,z三个轴中的某个轴逆时针旋转  ⾓度的矩阵是如何的
绕x轴旋转,则可以看作是在yz平⾯的⼆维旋转,x轴的(1,0,0)不变,y轴(0,1,0)变为(0,cos,sin),z轴的(0,0,1)变为(0,-sin,cos),因此对应的矩阵为:
绕y轴旋转,则可以看作是在xz平⾯的⼆维旋转,y轴的(0,1,0)不变,x轴(1,0,0)变为(cos,0,-sin),z轴的(0,0,1)变为(sin,0,cos),因此对应的矩阵为:
绕z轴旋转,则可以看作是在xy平⾯的⼆维旋转,z轴的(0,0,1)不变,x轴(1,0,0)变为(cos,sin,0),y轴的(0,1,0)变为(-sin,cos,0),因此对应的矩阵为:
的结合使⽤
两者结合使⽤
对于如下表达式我们应该如何理解
通过上⼀篇提到的复合变换,上⾯式⼦表达的应该是先绕x轴旋转,然后再绕y轴旋转。假设原先物体的x轴⽅向为(1,0,0),y轴⽅向为(0,1,0),z轴⽅向为(0,0,1),我们先将其绕x轴逆时针旋转  度,即  操作。此时物体⾃⾝的y轴(0,1,0)会跟着x轴的旋转变为(0,cos,sin),记作 。那么我们再做  操作时,旋转的y轴是原先的 y=(0,1,0) 还是 =(0,cos,sin) ?这是两种完全不⼀样的情况,如下图
垂直向上较长的那根绿线为 y ,⽽较短的绿线即为 ,我们来看看绕它们旋转的情况分别是怎样的(左图为绕y旋转,右图为绕旋转)
答案是:再做  操作时,旋转的y轴就是原先的 y=(0,1,0),即上左图的情况。因为  的旋转矩阵是根据 y=(0,1,0)的情况计算出来了,因此使⽤该矩阵计算时,⽆论物体属于⼀个什么⾓度,计算出来的结果都是根据 y=(0,1,0)这个轴进⾏逆时针旋转的结果(注:(0,0,0)为物体的中⼼点)。
我们可以称x轴⽅向为(1,0,0),y轴⽅向为(0,1,0),z轴⽅向为(0,0,1)的三个轴为世界坐标轴,它们不根据物体的旋转⽽改变。⽽会根据物体⾃⾝的坐标轴会根据物体的旋转⽽改变,例如上诉中的,我们可以称之为模型坐标轴。(⾃⼰按照unity常⽤的说法瞎定义了,懂原理就好。)
因此上诉的两个旋转操作都是按照世界坐标轴来进⾏的,这种我们称之为外旋,表达式  ,我们可以称之为 x-y外旋 操作。那么内旋就是使⽤模型坐标轴来做旋转操作咯,那么如果我想要实现先绕x轴旋转 度,在绕旋转后的模型坐标轴的y轴()旋转
(即 x-y内旋 操作),那么应该怎么计算呢?
⾸先,第⼀步是绕x轴旋转,此时物体还没发⽣旋转,因此模型坐标的x轴等于世界坐标的x轴,因此我们依旧可以使⽤  矩阵。接着我们要绕 =(0,cos,sin) 旋转,这⾥我们需要将其进⾏拆解(类似于上⼀篇中⼆维空间绕空间中任意⼀点旋转那样,拆解成先把任意点移到原点,然后旋转,然后再把改点移回去),先把  绕世界坐标的x轴旋转 度,使其与世界坐标的y轴重叠,然后使⽤  矩阵进⾏旋转  ⾓度,最后再绕世界坐标的x轴旋转,是旋转轴回到(0,cos,sin)⽅向。
因此 x-y内旋操作即为:
1. 绕世界坐标x轴旋转度,对应矩阵
2. 绕世界坐标x轴旋转度,对应矩阵
3. 绕世界坐标y轴旋转度,对应矩阵
4. 绕世界坐标x轴旋转度,对应矩阵
可以发现第⼀第⼆步可以抵消,因此x-y内旋操作等价于先绕世界坐标y轴旋转度再绕世界坐标x轴旋转度,即 x-y内旋 等于 y-x外旋。
上诉过程⽤矩阵来表达的话,我们知道绕世界坐标x轴旋转度即为绕世界坐标x轴旋转度的逆变换,因此其矩阵即为的逆矩阵,为,因此矩阵如下
同理也可得出 x-z内旋等于z-x外旋,z-y内旋等于y-z内旋等等。
三者结合使⽤
知道上⾯这些原理后,我们再进⼀步,来理解下⾯表达式
同样的,上⾯式⼦可以称之为 x-y-z外旋 操作,即先绕世界坐标的x轴旋转度,然后在绕世界坐标的y轴旋转度,最后绕世界坐标的z轴旋转度。带⼊可得:
那么它是否和前⾯⼀样 x-y-z外旋 等于 z-y-x内旋 呢?答案是肯定的,我们来看下推导。
z-y-x内旋,重点在于如何把z-y操作后模型坐标x轴移动到世界坐标的x轴上,通过前⾯我们知道 z-y 内旋等于 y-z 外旋,因此旋转后的模型坐标x轴即执⾏了 操作,此时的模型坐标x轴,我们标记为。因此若我们要使得变回与世界坐标的x重叠,只需要执⾏⼀下相反的操作即可,即把先绕z轴旋转度,然后在绕y轴旋转度,对应矩阵为。
因此z-y-x内旋可以分解为如下⼏步骤:
1. 先将其分解为 y-z外旋 + x内旋
2. 做y-z外旋,对应矩阵
3. 做y-z外旋的逆操作,是到世界坐标x轴上,对应矩阵
4. 绕世界坐标x轴旋转,对应矩阵
5. 把归位,即再做⼀次y-z外旋操作,对应矩阵
连起来可得公式为:
可得结论:所有外旋操作等于与其操作顺序相反的内旋操作。
排列组合
我们⼀共可以得到以下六种排列组合。不同的组合得到值是不⼀样的,因为  等。
x-y-z外旋(等价于z-y-x内旋)
x-z-y外旋(等价于y-z-x内旋)
y-x-z外旋(等价于z-x-y内旋)
y-z-x外旋(等价于x-z-y内旋)
食品价格连续上涨z-x-y外旋(等价于y-x-z内旋)
sprtz-y-x外旋(等价于x-y-z内旋)
上⾯的这些旋转⽅式也就是我们常⽤的欧拉⾓旋转。
对于上⾯这些排列组合,很多会解释为每个轴对应的层级关系,例如x-y-z外旋,转动x后,y和z在之
石油信息
后的计算⽤的还是世界坐标轴,就好像x的转动和yz没有关系。y和z之间也是⼀样,转动y后,z还是⽤世界坐标轴计算,不会因为y的改变⽽改变。这个就很像所谓的层级关系,即z为最⽗层,x为最⼦层,y在中间层,当⼦层转动的时候,不会影响到⽗层。反过来也⼀样,x-y-z外旋等于z-y-x内旋,⽗层的z转动会影响y和x(内旋⽤的模型坐标轴)。
万向锁(Gimbal Lock)
简单来说上诉六个组合的操作,只要把中间那个操作的旋转⾓度设为90度的整数倍,就会触发万向锁。
我们可以从内旋的⾓度很好理解,以z-y-x的内旋为例⼦,当我们做第⼀步操作时,即绕模型坐标的z轴旋转度,⽆论怎么旋转,z轴都不会改变且等于世界坐标的z轴,但是模型坐标的x,y轴会跟着旋转变换。此时我们再做第⼆步操作,即绕模型坐标的y轴逆时针旋转  度,当  时,我们会发现此时的x轴会和做第⼀步操作时的z轴(同时也是世界坐标的z轴)处于同⼀条直线,⽅向相反。那么当我们再做第三步操作时,即绕x轴旋转,那就等于在绕世界坐标的z轴旋转,就等同于第⼀步操作,只不过⽅向相反。这就是万向锁了,即欧拉⾓有两个⾓的旋转都在绕同⼀个轴在旋转。
接着我们来从数学的⾓度分析⼀下:假设我们使⽤x-y-z外旋,对应的矩阵即为  :
此时我们把的值设为90,可得下⾯矩阵:
即:
最终得到:
即⽆论我们的和取何值, 永远等于 。
怎么理解 永远等于 呢?当我们做⼀次绕世界坐标y轴逆时针旋转90度时,此时(1,0,0)即会变为(0,0,1),即 等于  (=90的效果)。⽽永远等于就说明之后的z轴不会发⽣改变,什么情况下不会改变呢?那就是绕着世界坐标轴的z轴做旋转,即我们修改和的值会发现,只绕着世界坐标轴的z轴在旋转。
总结:每个内旋组合,将第⼆个轴的旋转⾓度设为90度或其整数倍时,就会触发万向锁,此时⽆论第⼀个轴或第三个轴的旋转⾓度为多少,都是在绕第⼀个轴所对应的世界坐标轴做旋转,从⽽失去了⼀个⽅向(第三个轴)的旋转能⼒。
绕任意轴旋转
前⾯我们说提到的是欧拉⾓旋转,若我们想要计算绕某个轴旋转,应该如何计算呢?
绕xy平⾯上过原点的轴旋转
我们先从简单的来,假如有个轴,它在xy平⾯上,并且经过原点,那么绕该轴做逆时针旋转应该如何来解?⾸先因为这个轴在xy平⾯且经过原点,因此通过绕z轴旋转某个⾓度(设  度)即可将该轴转到原y轴的⽅向上,然后绕该轴的逆时针旋转即是原先绕y轴逆时针旋转,旋转完成后再绕z轴旋转 - 度即可。这点和我们前⾯讲欧拉⾓旋转时是⼀样的,使⽤公式表达即为:
合并得
上诉矩阵即为三维空间中,绕xy平⾯上过原点的任意轴逆时针旋转  度的矩阵,其中  为该轴与y轴的夹⾓。
当然了,我们⼀般会给定的是⼀个轴(x,y,z)这样,⽽不是⼀个轴与某个向量的夹⾓,那么假设在xy平⾯上的某个轴为(x,y,0),那么绕这个轴旋转度的矩阵应该是多少呢?
同样的,我们设(x,y,0)与y轴的夹⾓为度,那么可得:  与
,看着很⿇烦是不是,那么假设我们的(x,y,0)是单位向量呢?那么
,即 ,, 所以我们第⼀步先把给定的轴的向量转换为单位向量。
新台网接着我们将它们带⼊到上⾯的矩阵中可得:
再根据矩阵的加法定则,把 sin , cos,和常量 来个质壁分离,可得:
再根据矩阵和常数的乘法,我们可以把sin 和 cos 提取出来,可得到:
因为前⾯说过,转为了单位向量,所以:  和  ,进⼀步的简化为:
可以发现,上⾯中间的那个矩阵,和最左边的那个矩阵很相似,其实就是单位矩阵减去左边的那个矩阵:
换下位置可以得到:
单位矩阵我们标记为  ,⽽  其实就是 向量
和其转置  的积(该例⼦中,z=0):
结论:若我们要绕xy平⾯上的某个轴 A=(x,y,0) 旋转度(其中A为单位向量),其公式为:

本文发布于:2024-09-22 10:28:40,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/532092.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:旋转   矩阵   操作   世界坐标   对应   内旋
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议