旋转矩阵
坐标轴与参考坐标系(world)的投影计算,是向量构成的矩阵,计算矩阵的投影。
https://blog.youkuaiyun.com/weixin_45590473/article/details/122884112
欧拉角 Eular
https://www.zhihu.com/question/47736315/answer/236284413
https://www.zhihu.com/question/47736315?sort=created
欧拉角一般是指在三维空间通过指定与三个旋转轴相关联的三个角度来最小参数化SO(3)以表示任意方向的方法。
当然,通俗来说的话,欧拉角就是用来唯一的确定定点转动刚体位置的三个一组的独立角参量。
更通俗的话,就是从初始坐标出发,绕过初始坐标某一个轴(x、y、z)旋转a角度,然后再根据某一个不同轴旋转b角度,最后再根据一个轴(这个轴可以是与第一次旋转轴一样的被动参考轴)旋转c角度。
得到一个vector3的变量(a,b,c)。注意后两次旋转的参考坐标轴是自身已被旋转后的坐标轴。另外要注意不同的旋转顺序轴得到的结果不一样,所以欧拉角在不确定旋转顺序的情况下,只凭三个角参量
是不能确定最终结果的。这个轴顺序有很多种,大致有两类分为欧拉角和泰特布莱恩角,
欧拉角的顺序有:
- (x,y,x`)
- (x,z,x`)
- (y,x,y`)
- (y,z,y`)
- (z,x,z`)
- (z,y,z`)
泰特布莱恩角的顺序有:
- (x,y,z)
- (x,z,y)
- (y,x,z)
- (y,z,x)
- (z,x,y)
- (z,y,x)
Unity中欧拉角
https://blog.youkuaiyun.com/qq_15020543/article/details/82834885
https://blog.youkuaiyun.com/AndrewFan/article/details/62057519
要知道的一点就是,在unity中,Transform组件里的Rotation其实是四元数,只不过以欧拉角的形式展现在Inspector上,目的就是直观明了。
因此,给Rotation赋值的时候,也是要用四元数Quaternion来赋值。
在inspector的rotation中,x就是绕着x轴旋转。同理,y就是绕着y轴旋转,z就是绕着z轴旋转。
在这个demo中使用的unity api的Quaternion.Eular()
,就是给一个(x,y,z)的欧拉角参数,但返回值是一个四元数,可以直接赋值给rotation。
看api解释
Returns a rotation that rotates z degrees around the z axis, x degrees around the x axis, and y degrees around the y axis; applied in that order.
在Quaternion.Euler()方法的具体使用中,其参数(分别代表绕X轴、Y轴和Z轴旋转的角度)的旋转顺序是先Z轴、后X轴、再Y轴。这一点在使用该方法进行旋转操作时是需要特别注意的。
注意,这个旋转顺序是先绕Z轴旋转,再绕X轴旋转,最后绕Y轴旋转。
欧拉角万向节死锁
https://www.zhihu.com/question/47736315/answer/236284413
https://blog.youkuaiyun.com/AndrewFan/article/details/60981437#
https://blog.youkuaiyun.com/weixin_45590473/article/details/122884112
欧拉角有三个分别为yaw(偏航角)、pitch(俯仰角)、roll(翻滚角),代表着绕着Z/Y/X轴旋转的角度,相当于有三个独立变量(自由度)控制。
但是任何一个坐标轴旋转角度为90度时,就会有两个轴的旋转动作起到对总体旋转结果相同的效果,这就被称为“死锁“。
简单来说的话,就是当依次施加三个旋转时,第一个或第二个旋转可能导致第三个轴的方向与先前两个轴之一相同。这意味着已失去“自由度”,因为不能围绕唯一轴应用第三个旋转值。
四元数
https://blog.youkuaiyun.com/weixin_45590473/article/details/122884112
https://www.bilibili.com/video/BV1SW411y7W1?share_source=copy_web
四元数是存在3个虚部的复数。
比如 q= w + ix + jy + kz
,那么这个公式中ijk就是虚数单位。满足 i^2 = j^2 = k^2 = -1 且 i*j= k,j*i = -k
。
数学的美妙不在于形象的表达变换的逻辑,而在于抽象简单的给出表达式。四元数就是如此,四元数的三维表达晦涩难懂,但是四元数的表达式可以优雅的表达三维中的旋转操作,不但避免了欧拉角的死锁问题而且也避免了旋转矩阵的复杂计算。
在上面那个表达式中,四元数在Unity中就是表现为(x,y,z,w)
。
在Unity中,四元数(Quaternion)是一种用于表示三维空间中旋转的数学工具。四元数可以避免万向节锁(Gimbal Lock)的问题,并且相比欧拉角(Euler Angles)来说,在插值(interpolation)和组合旋转(combining rotations)方面表现更为优越。
一个四元数通常由四个部分组成,分别表示为:(x, y, z, w)
。其中,x
, y
, z
代表旋转的向量部分,而 w
代表旋转的角度部分(或称为标量部分)。
具体来说,每一位数在旋转中代表什么可以如下解释:
-
w(标量部分):
w
的值接近于1时,表示旋转角度接近于0度,即几乎没有旋转。w
的值接近于0时,表示旋转角度接近于180度,即一个较大的旋转。- 它的平方 (
w^2
) 加上向量部分(x^2 + y^2 + z^2
)的和应该等于1,这符合四元数的单位性质。
-
x, y, z(向量部分):
x
,y
,z
共同表示一个旋转轴和旋转角度。具体来说,向量(x, y, z)
表示旋转所围绕的轴,而旋转角度则通过w
和这个向量共同决定。- 可以想象一个单位向量
(x, y, z)
,其长度固定为1,它指向旋转的轴,而w
则表示围绕这个轴旋转的角度。
在Unity中,四元数常用于表示和操作旋转,例如:
- Quaternion.Euler(x, y, z):将欧拉角转换为四元数。
- Quaternion.identity:表示没有旋转的四元数,即
(0, 0, 0, 1)
。 - Quaternion.LookRotation(forward, upwards):根据给定的前方向量和上方向量创建一个四元数。
- Quaternion * Quaternion:通过四元数乘法组合旋转。
- Quaternion.Slerp(a, b, t):在四元数
a
和b
之间进行球形线性插值(Spherical Linear Interpolation),t
是插值参数。
通过理解四元数的组成,你可以更有效地在Unity中处理旋转和相关的数学运算。
优点:四元数旋转不受万向锁的影响。
局限性:单个四元数不能表示任何方向超过 180 度的旋转。
局限性:四元数的数字表示在直观上难以理解。
前面两者关系
https://blog.youkuaiyun.com/weixin_45590473/article/details/122884112
https://www.zhihu.com/question/47736315?sort=created
Unity:
https://blog.youkuaiyun.com/2401_82978699/article/details/143569763
https://docs.unity.cn/cn/2019.4/Manual/QuaternionAndEulerRotationsInUnity.html 注意这个官方案例中示范的错误举例。
主要注意一个是万向锁的局限,一个是性能插值计算速度的问题。