http://blog.csdn.net/kfqcome/article/details/10729551

一 四元数

Quaternion中存放了x,y,z,w四个数据成员,可以用下标来进行访问,对应的下标分别是0,1,2,3。

主要介绍几个函数

<1> 根据两个向量计算出旋转量,计算出来的旋转量为从fromDirection旋转到toDirection的旋转量

static Quaternion FromToRotation(Vector3 fromDirection,Vector3 toDirection);

<2>

static Quaternion LookRotation(Vector3 forward);

static Quaternion LookRotation(Vector3 forward,Vector3 upwards);

使用指定的向前方向和向上方向来创建四元数

示例

[csharp] view
plain
 copy

  1. Vector3 vr = new Vector3(1,0,0);
  2. Quaternion q1 = Quaternion.LookRotation(vr);
  3. Debug.Log(q1);
  4. Vector3 vforwardp = new Vector3(0,0,1);
  5. Quaternion q2 = Quaternion.FromToRotation(vforwardp ,vr);
  6. Debug.Log(q2);

这里面q1和q2的值是相同的,q2的计算过程是计算向前向量(vforwardp )到当前向量vr的旋转量,而这就是LookRotation的计算方式。

而是LookRotation同时使用forward和upward两个参数的时候,就相当于指定了vz和vy两个向量,根据这两个向量可以直接算出对应的vx,然后再用这三个向量去set对应的3×3旋转矩阵的列向量即可获得一个旋转矩阵,再接着可以将其转换到四元数。

<3>

void SetLookRotation(Vector3 view);

void SetLookRotation(Vector3 view,Vector3 up);

也是根据指定的向前和向上向量创建四元数,本质计算过程和LookRotation一样,只不过LookRotation是Quaternion上的静态函数,而SetLookRotation则是Quaternion的成员函数。

<4>

static Quaternion RotateTowards(Quaternion from,Quaternion to, float maxDegreesDelta);

以maxDegreesDelta作为角度步长计算从from到to之间的旋转量

<5>

static Quaternion AngleAxis(float angle,Vector3 axis);

根据旋转轴和旋转角度算出四元数

<6>Quaternion.eulerAngles

存放四元数对应的三个轴向的欧拉角,分别是绕x轴、y轴、z轴旋转的角度

[csharp] view
plain
 copy

  1. Quaternion q3 = new Quaternion();
  2. q3.eulerAngles = new Vector3(10, 30, 20);
  3. Quaternion qx3 = Quaternion.AngleAxis(10,Vector3.right);
  4. Quaternion qy3 = Quaternion.AngleAxis(30,Vector3.up);
  5. Quaternion qz3 = Quaternion.AngleAxis(20,Vector3.forward);
  6. Quaternion qxyz3 = qz3*qy3*qx3;

上面的代码可以得到q3和qxyz3值一样。从这里可以看出unity中旋转顺序也是按先绕x轴旋转,然后y,最后z。unity中对向量应用旋转量使用的是向量右乘,即如下:

Vector3 newV = qxyz3*v=qz3*qy3*qx3*v;

二 旋转矩阵

unity中仅仅提供了一个4×4的矩阵类Matrix4x4,它可以包含位移T、旋转R和伸缩信息。矩阵中的元素都对应一个mxy的公有成员变量,因而要访问单个元素的话可以直接访问其成员。同时也提供了下标访问,如下

[csharp] view
plain
 copy

  1. public float this [int row, int column]
  2. {
  3. get
  4. {
  5. <span style="white-space:pre">  </span>    return this [row + column * 4];
  6. }
  7. set
  8. {
  9. <span style="white-space:pre">  </span>    this [row + column * 4] = value;
  10. }
  11. }
  12. public float this [int index]

三 四元数和旋转矩阵之间的转换

unity中没有提供直接的四元数到旋转矩阵的转换,但是使用它们的一些成员函数可以实现两者之间的转换。

1 四元数到旋转矩阵

使用Matrix4x4的成员函数SetTRS

void SetTRS(Vector3 pos,Quaternion q,Vector3 s);

示例

[csharp] view
plain
 copy

  1. Quaternion q = Quaternion.LookRotation(new Vector3(0,0.5,1));
  2. Matrix4x4 rot = new Matrix4x4();
  3. rot.SetTRS(new Vector3(0,0,0),q,new Vector3(1,1,1));

2 旋转矩阵到四元数

使用Quaternion类的LookRotation函数

static Quaternion LookRotation(Vector3 forward,Vector3 upwards);

示例(接上面):

[csharp] view
plain
 copy

  1. Matrix4x4 rot = new Matrix4x4();
  2. rot.SetTRS(new Vector3(0,0,0),q,new Vector3(1,1,1));
  3. Vector4 vy = rot.GetColumn(1);
  4. Vector4 vz = rot.GetColumn(2);
  5. Quaternion newQ = Quaternion.LookRotation(new Vector3(vz.x,vz.y,vz.z),new Vector3(vy.x,vy.y,vy.z));

这里的newQ与上面的q等值

四 其他

unity中可以将一个四元数q换算到一个旋转矩阵R,同时将这个q在Ogre中换算到另一个旋转矩阵R1,发现R和R1是相同的。

这说明虽然unity和Ogre采用的是不同的坐标系,但是对于四元数和旋转矩阵之间的换算是等价的。同时unity中四元数的计算公式也和《三维旋转基础》中的一样。

unity3d四元数和旋转矩阵的更多相关文章

  1. matlab练习程序(旋转矩阵、欧拉角、四元数互转)

    欧拉角转旋转矩阵公式: 旋转矩阵转欧拉角公式: 旋转矩阵转四元数公式,其中1+r11+r22+r33>0: 四元数转旋转矩阵公式,q0^2+q1^2+q2^2+q3^2=1: 欧拉角转四元数公式 ...

  2. matlab练习程序(求向量间的旋转矩阵与四元数)

    问题是这样,如果我们知道两个向量v1和v2,计算从v1转到v2的旋转矩阵和四元数,由于旋转矩阵和四元数可以互转,所以我们先计算四元数. 我们可以认为v1绕着向量u旋转θ​角度到v2,u垂直于v1-v2 ...

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

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

  4. matlab练习程序(对应点集配准的四元数法)

    这个算是ICP算法中的一个关键步骤,单独拿出来看一下. 算法流程如下: 1.首先得到同名点集P和X. 2.计算P和X的均值up和ux. 3.由P和X构造协方差矩阵sigma. 4.由协方差矩阵sigm ...

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

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

  6. 视觉SLAM中的数学基础 第二篇 四元数

    视觉SLAM中的数学基础 第二篇 四元数 什么是四元数 相比欧拉角,四元数(Quaternion)则是一种紧凑.易于迭代.又不会出现奇异值的表示方法.它在程序中广为使用,例如ROS和几个著名的SLAM ...

  7. 3D游戏与计算机图形学中的数学方法-四元数

    说实话关于四元数这一节真的是不好懂,因为里面涉及到好多数学知识,单说推出来的公式就有很多.不怕大家笑话,对于四元数的学习我足足花了两天的时间,包括整理出这篇文章.在前面一章我写到了“变换”,这也是总结 ...

  8. 四元数 Quaternion

    最近在重写自己游戏引擎的场景管理模块,重温了一下有关四元数的一些知识,在此做一下简单的笔记. 四元数可以用来准确地描述三维矢量的旋转,并且可以有效地表达多个旋转操作的叠加,因此在三维游戏引擎的场景管理 ...

  9. 四元数和旋转(Quaternion & rotation)

    四元数和旋转(Quaternion & rotation) 本篇文章主要讲述3D空间中的旋转和四元数之间的关系.其中会涉及到矩阵.向量运算,旋转矩阵,四元数,旋转的四元数表示,四元数表示的旋转 ...

随机推荐

  1. centos 7 官网安装 PostgreSQL

    https://www.postgresql.org/download/linux/redhat/

  2. 【python】python调用shell方法

    在python脚本中,有时候需要调用shell获取一下信息,下面介绍两种常用的调用方法. 第一种,os.system() 这个函数获取的是命令的执行状态,比如 >>> import ...

  3. centos或ubuntu下手动安装jdk8

    https://blog.csdn.net/pang_ping/article/details/80570011 https://blog.csdn.net/u012707739/article/de ...

  4. HTML5_CSS3仿Google Play垂直菜单

    在线演示 本地下载

  5. 20145239 Linux下常用的ls命令总结

    20145239 Linux下常用的ls命令总结 通过学习本周的教学视频和要求掌握的内容,发现ls命令被使用的次数非常多,但作为一个初学者,可能我只会ls或者顶多ls -l两种用法.但其实ls是一个非 ...

  6. java入门了解05

    1.模板模式 (一)需求:解决默写事情有固定模式,但有时内部会发生变化,此时就需要应用模板模式编写此过程 从而解决事情的流程依然可以别使用,这就是模板模式的好处(类似我们的个人简历模板) (二)步骤: ...

  7. 分享知识-快乐自己:SpringMVC 底层执行原理解析

    底层实现原理图: 观看底层代码: 1):打开 web.xml 文件  2):按住 Ctrl + 鼠标左键 进入底层查看源码   3):按住 Ctrl+o 找到对应的方法doDispatch   5): ...

  8. Java_泛型_01_T与?

    二.参考文档 1.JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别

  9. 杂文笔记《“去QE”时代下,QE如何破茧重生》

    杂文笔记<"去QE"时代下,QE如何破茧重生> "去QE"时代下,QE如何破茧重生 https://mp.weixin.qq.com/s?__biz ...

  10. javacv实现实时视频截图和录像服务easyCV

    本项目维护于github:https://github.com/eguid/easyCV 1.介绍 本项目基于javaCV1.4.x. 其中实现了 (1)实时视频截图服务(支持rtsp/rtmp/ht ...