unity3d四元数和旋转矩阵
一 四元数
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);
使用指定的向前方向和向上方向来创建四元数
示例
Vector3 vr = new Vector3(1,0,0);
Quaternion q1 = Quaternion.LookRotation(vr);
Debug.Log(q1);Vector3 vforwardp = new Vector3(0,0,1);
Quaternion q2 = Quaternion.FromToRotation(vforwardp ,vr);
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轴旋转的角度
Quaternion q3 = new Quaternion();
q3.eulerAngles = new Vector3(10, 30, 20);
Quaternion qx3 = Quaternion.AngleAxis(10,Vector3.right);
Quaternion qy3 = Quaternion.AngleAxis(30,Vector3.up);
Quaternion qz3 = Quaternion.AngleAxis(20,Vector3.forward);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的公有成员变量,因而要访问单个元素的话可以直接访问其成员。同时也提供了下标访问,如下
public float this [int row, int column]
{get{
return this [row + column * 4];}set{
this [row + column * 4] = value;}
}
public float this [int index]
三 四元数和旋转矩阵之间的转换
unity中没有提供直接的四元数到旋转矩阵的转换,但是使用它们的一些成员函数可以实现两者之间的转换。
1 四元数到旋转矩阵
使用Matrix4x4的成员函数SetTRS
void SetTRS(Vector3 pos,Quaternion q,Vector3 s);
示例
Quaternion q = Quaternion.LookRotation(new Vector3(0,0.5,1));
Matrix4x4 rot = new Matrix4x4();
rot.SetTRS(new Vector3(0,0,0),q,new Vector3(1,1,1));
2 旋转矩阵到四元数
使用Quaternion类的LookRotation函数
static Quaternion LookRotation(Vector3 forward,Vector3 upwards);
示例(接上面):
Matrix4x4 rot = new Matrix4x4();
rot.SetTRS(new Vector3(0,0,0),q,new Vector3(1,1,1));Vector4 vy = rot.GetColumn(1);
Vector4 vz = rot.GetColumn(2);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四元数和旋转矩阵相关推荐
- python中将四元数转换为旋转矩阵
在制作bundlefusion时,想测试TUM数据集,并且将groundtruth写入到数据集中,TUM中给定的groundtruth中的旋转是使用四元数表示的,而bundlefusion中需要SE3 ...
- 【机器人】四元数与旋转矩阵的转换关系
导语:最近在搭建电机与机械臂的联合仿真,闲暇之余顺便看了一下姿态轨迹规划的文章,对姿态的插补有点感兴趣,发现用四元数表示姿态然后来进行姿态的插补非常方便,且不会出现奇异.这里对四元数与常规的旋转矩阵的 ...
- matlab和eigen在旋转向量,欧拉角,四元数,旋转矩阵转换的对比(一 旋转矩阵转其他)
1. 参考: eigen安装:clion使用Eigen_gxt_kt的博客-CSDN博客_clion eigen matlab 角度转四元数_四元数的两种写法与转换_女王丁丁的博客-CSDN博客 机械 ...
- 【游戏课】技术片段之——四元数与旋转矩阵的关系
什么是四元数 四元数将三维空间的旋转拓展到思维空间,在旋转和方向的变化方面,优于欧拉角和变换矩阵.因为四元数把三维空间中的绕三个轴向的旋转变换为四维空间中绕一个轴向的旋转,从而使其比欧拉角的直接插值能 ...
- 欧拉角、四元数和旋转矩阵
旋转变换 旋转变换最为直观的表示方法是"轴-角":绕着某一个过原点轴,旋转某一角度. 轴可以用一个单位长度的点[w1,w2,w3][w_1,w_2,w_3][w1,w2,w3 ...
- 四元数转旋转矩阵公式推导
容易知以下公式成立: ∂Rp∂p=R\frac{\partial R p}{\partial p}=R∂p∂Rp=R 上面公式用四元数表示如下: ∂(q⊗p⊗q∗)∂p=R\frac{\partia ...
- Eigen 欧拉角的说明,及四元数和旋转矩阵的变换
本文说明eulerAngles(0, 1, 2),和eulerAngles(2, 1, 0)的差异,并顺便将欧拉角.旋转矩阵.四元数一块的联系写了一下,也结合了一些有趣的博客内容. 1. 欧拉角旋转方 ...
- 欧拉角,轴角,四元数与旋转矩阵详解
入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删. 目录 一.欧拉角 1.静态定义 2.欧拉角的表示 3.欧拉角表示的优缺点 4.欧拉角的万向节死 ...
- 旋转矩阵、欧拉角、四元数理论及其转换关系
旋转矩阵.欧拉角.四元数理论及其转换关系 author@jason_ql(lql0716) http://blog.csdn.net/lql0716 1.概述 旋转矩阵.欧拉角.四元数主要用于表示坐标 ...
最新文章
- mysql100个优化技巧_MySQL 调优/优化的 100 个建议
- Java多线程编写简易飞机大战(一)
- DEDECMS模块插件制作举例-模块生成向导
- Serverless 风起云涌,为什么阿里,微软,AWS 却开始折腾 OAM?
- oracle排序使用,很多中函数,不同的效果
- Java双等号,Equals(),HashCode()小结
- Scala.js:将Scala编译为JavaScript的编译器
- Javascript面向对象二
- 对软件测试团队“核心价值”的思考
- vue-router路由的使用
- 从SVN上拉取代码到本地进行开发
- ES6之你应该知道的知识(一)
- 如何让网站被百度快速收录
- 亚马逊AWS EC212个月免费计划及连接问题
- 屏蔽ctrl/shift + R/F5
- linux下安装matlab运行环境
- sdk是什么_动态贴纸在美颜sdk中起着什么作用
- 算法 —— 排序 —— 优先队列
- java所定义的版本中不包括_java试题模拟出题
- 【项目实战】Java从单体到微服务打造房产销售平台(一) - 整体概述