一、四元数

  四元数本质上是个高阶复数,可视为复数的扩展,表达式为y=a+bi+cj+dk。在说矩阵旋转的时候提到了它,当然四元数在Unity里面主要作用也在于此。在Unity编辑器中的Transform组件,包括这位置(Position)、旋转(Rotation)和缩放(Scale).Rotation就是一个四元数,但是不能直接对Quaterian.Rotation赋值。可以使用函数Quaterian.Eular(Vector3 angle)获取四元数,该函数返回的就是四元数。

  欧拉角表示为Quaterion.eulerAngles,欧拉角可以对其进行赋值,例如

  Quaterion.eulerAngles=new Vector3(0,30,0);

  四元数可以用来进行旋转,它的表达式为Quaterion.AngleAxis(float angle,Vector3 axis),调用这个函数可以对物体进行旋转,当然还需要调用函数Quaternion.Lerp()在旋转时进行插值计算,这些函数都是在编写逻辑时调用的。

  如果对于四元数理解的不够清楚,推荐阅读这篇文章Understanding Quaternion中文翻译  http://www.qiujiawei.com/understanding-quaternions/

二、欧拉角

  欧拉角也是用于旋转的,但是它有一个致命的缺点,就是万向节死锁,欧拉角旋转我们在Unity开发中通常使用的函数是transform.Rotate(Vector3 angle)

  万向节死锁就是在3D空间中某两个轴在旋转时重叠了,不论你如何旋转,三个轴就变成了两个轴。举个例子:

  transform.Rotate(new Vector3(0,0,40));

  transform.Rotate(new Vector3(0,90,0));

  transform.Rotate(new Vector3(80,0,0));

  我们只需要固定中间一句代码,即使y轴的旋转角度始终为90°,那么你会发现无论怎么样调整x轴和z轴的旋转角度,它们会总是在同一个平面上运动。万向节锁实际上并没有锁住任何一个旋转轴,知识在这种情况下会感觉丧失了一个维度。以上面的例子还说,尽管固定了第二个旋转轴的角度为90°,但我们原以为依靠改变其他两个州的旋转角度是可以得到任意旋转位置的(因为按照我们的理解,两个周应该控制两个空间维度),而事实是它被锁在一个平面上了,即只有一个维度了,缺失了一个维度。而只要第二个旋转轴不是正负90°,我们就可以依靠改变其他两个轴的旋转角度来的到任意旋转位置。

  从最简单的理解,还是用x,y,z的旋转顺序。当y轴的旋转角度为90°时,会得到下面的矩阵。

  

  

  在改变第一次和第三次的旋转角度时,同样的效果,不会改变第一行和第三列的数值,从而缺失了一个维度。究其出现的本质原因,是因为从欧拉角到旋转的映射并不是一个覆盖映射,即不同的欧拉角可以表示同一个旋转方向,而且并不是每一个旋转变化都可以用欧拉角来表示的。

3D数学基础(四)四元数和欧拉角的更多相关文章

  1. 3D数学基础:四元数与欧拉角之间的转换

    在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点.本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系: 单位四元数可视化为三维矢量加上第四 ...

  2. 3D数学基础:3D游戏动画中欧拉角与万向锁的理解

    首先来看一下什么是欧拉角(Euler angles)?构件在三维空间中的有限转动,可依次用三个相对转角表示,即进动角.章动角和自旋角,这三个转角统称为欧拉角.——引自百度百科莱昂哈德·欧拉用欧拉角来描 ...

  3. 3D数学基础(一)Unity坐标系

    Unity引擎时非常成熟的,引擎内部运用了很多的数学知识,他对开发者来说是不可见的,而且他已经封装好的算法也不是很全面.此外,要是使用引擎封装好的算法也要明白其实现的原理. 写过一些代码,也参考了一些 ...

  4. 四元数与欧拉角(RPY角)的相互转换

    RPY角与Z-Y-X欧拉角 描述坐标系{B}相对于参考坐标系{A}的姿态有两种方式.第一种是绕固定(参考)坐标轴旋转:假设开始两个坐标系重合,先将{B}绕{A}的X轴旋转$\gamma$,然后绕{A} ...

  5. eigen 中四元数、欧拉角、旋转矩阵、旋转向量

    一.旋转向量 1.0 初始化旋转向量:旋转角为alpha,旋转轴为(x,y,z) Eigen::AngleAxisd rotation_vector(alpha,Vector3d(x,y,z)) 1. ...

  6. 3D数学基础 KeyNote 1

    [计算几何复习要点] 1.向量加法的几何含意: a+b的释意为:a的尾连上b的头,新建一条从a的尾指向b的头的向量. 2.向量减法的几何含意: a-b的释意为:尾部相连,新建一个从b的头指向a的头的向 ...

  7. 3D数学基础_图形与游戏开发

    https://blog.csdn.net/popy007/article/list/2?t=1&  //向量计算相关文章 https://www.baidu.com/link?url=48C ...

  8. 3D数学基础(三)矩阵

    3D引擎中对于矩阵的使用非常多,介绍这些知识也是为了告诉开发者原理,更有助于开发者编写逻辑. (1)固定流水线 各种坐标系之间的转化是通过矩阵相乘得到的,这里面就涉及到了3D固定流水线.作为3D游戏开 ...

  9. 3D数学基础(二)向量

    向量的基本运算包括加法.减法.点乘.叉乘.单位化运算等,而在游戏开发中使用最为广泛的是减法.点乘.叉乘.单位化运算.向量是具有方向和长度的矢量,有2D.3D.4D等的.在游戏开发里面一般使用的是2D和 ...

随机推荐

  1. Vue-devtools 安装浏览器调试

    工欲善其事,必先利其器. 本文主要讲解Vue-devtools的安装和使用 安装方法有两个: 方法一:(前提条件需要FQ,省事省力省心方便快速) FQ =>谷歌商店 =>搜索 =>V ...

  2. Maven 插件打包部署项目

    clean install -Dmaven.test.skip=true:打包工具 clean package  

  3. Shell 脚本练习

    [第一个] #!/bin/bash#每个用户的总充值和消费以及剩余. cat yuanbao.txt |grep -v 2016 |awk '{print $3}' |awk '!a[$0]++' & ...

  4. 正则-关于一个结果不确定现象怪的研究(reg.test(‘-1’))

    先看下边代码 var value = '-1'; var reg = /^-{0,1}\d+$/g; debugger; if (reg.test(value)||reg2.test(value)) ...

  5. require 4种引入方式的区别

    以下四种引入方式的区别: 自己创建的包里面封装了一些方法,只是把aa文件夹放在了node_modules文件夹里,所以在引用时,不需要写上相对路径,也不能在网上下载 这是网上别人封装好了的包,下载好了 ...

  6. flex布局设置width无效

    子元素设置 : flex: 0 0 85px; 参数: flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto.后两个属性可选. 该属性有 ...

  7. vue v-if控制显隐,页面加载出现闪现 v-cloak

    <div id="divApp"> <div v-if="type === 'A'" v-cloak> A </div> & ...

  8. MySQL运用

    进入mysql 命令行: mysql -uroot -p查看所有数据库: show databases;创建数据库: create database niu charset utf8;删除数据库: d ...

  9. python学习小总结(列表、元组、字典、集合、字符串)

    ---恢复内容开始--- 一.列表(list) 1.添加 append():追加,在列表末尾添加元素. 列表名.append(添加的元素) extend():扩展,在列表末尾添加元素. 列表名.ext ...

  10. JS 函数参数 及 函数数组

    <script> function a(){ alert("a"); } function b(){ alert("b"); } var arr = ...