博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity手游之路<四>3d旋转-四元数,欧拉角和变幻矩阵
阅读量:7248 次
发布时间:2019-06-29

本文共 1836 字,大约阅读时间需要 6 分钟。

http://blog.csdn.net/janeky/article/details/17272625

今天我们来谈谈关于Unity中的旋转。主要有三种方式。变换矩阵,四元数和欧拉角。

定义

  • 变换矩阵

可以执行任意的3d变换(平移,旋转,缩放,切边)并且透视变换使用齐次坐标。一般比较少用到。Unity中提供了一个Matrix4x4矩阵类

  • 四元数

“四元数是最简单的超复数。 复数是由实数加上元素 i 组成,其中i^2 = -1。 相似地,四元数都是由实数加上三个元素 i、j、k 组成,而且它们有如下的关系: i^2 = j^2 = k^2 = ijk = -1 , 每个四元数都是 1、i、j 和 k 的线性组合,即是四元数一般可表示为a + bi + cj + dk,其中a、b、c 、d是实数”。这些概念很难懂吧。只要先记得Unity中的Quaternion有4个组件(x,y,z,w)

  • 欧拉角

“用来确定定点转动刚体位置的3个一组独立角参量,由章动角θ、旋进角(即进动角)ψ和自转角j组成”

在Unity中,Quaternion.eulerAngles 返回旋转的角度,绕z轴旋转euler.z角度,绕x轴旋转euler.x度,绕y轴旋转euler.y度
转换

  • 1.四元数到变换矩阵
[csharp] 
 
  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.变换矩阵到四元数
[csharp] 
 
  1. Matrix4x4 rot = new Matrix4x4();    
  2. rot.SetTRS(new Vector3(0,0,0),q,new Vector3(1,1,1));    
  3.             
  4. Vector4 vy = rot.GetColumn(1);    
  5. Vector4 vz = rot.GetColumn(2);    
  6.             
  7. Quaternion newQ = Quaternion.LookRotation(new Vector3(vz.x,vz.y,vz.z),new Vector3(vy.x,vy.y,vy.z));    

 

常用的函数
function ToAngleAxis (out angle : float, out axis : Vector3) : void
绕axis轴旋转angle,创建一个旋转
static function Angle (a : Quaternion, b : Quaternion) : float
返回a和b两者之间的角度。
var eulerAngles : Vector3
返回表示旋转的欧拉角度。表示旋转的角度,绕z轴旋转euler.z度,绕x轴旋转euler.x度,绕y轴旋转euler.y度(这样的顺序)。
function SetFromToRotation (fromDirection : Vector3, toDirection : Vector3) : void
把物体的fromDirection旋转到toDirection
function SetLookRotation (view : Vector3, up : Vector3 = Vector3.up) : void
建立一个旋转使z轴朝向view y轴朝向up
static function Slerp (from : Quaternion, to : Quaternion, t : float) : Quaternion
从from 转换到to,移动距离为t
static function Lerp (a : Quaternion, b : Quaternion, t : float) : Quaternion
跟Slerp相似,且比Slerp快,.但是如果旋转角度相距很远则会看起来很差
比较

  • 变换矩阵

可以做各种复杂的变换,但是学习曲线比较大,使用的内存也比较多,因为存储的数据量比较大。

  • 欧拉角

简单理解,尤其是对美术和策划的同事。运算速度和消耗内存比较少。可能存在万向锁的问题(两个轴的旋转重合)

  • 四元数

避免了万向锁的问题。理解起来不是那么直接。

有任何问题欢迎一起探讨ken@iamcoding.com

你可能感兴趣的文章
Java笔试题(二)解释servlet、Filter和listener
查看>>
Git SSL公钥密钥生成
查看>>
怎样去思考问题 解决问题 zkc学长的福利
查看>>
第二十课:运算放大器抽象
查看>>
samtools和bcftools使用说明
查看>>
OC中使用 static 、 extern、 const使用
查看>>
Code Chef January Challenge 2019题解
查看>>
洛谷P3527 [POI2011]MET-Meteors(整体二分)
查看>>
extjs 点击链接到另一个页面 并激活另一个页面的指定tab
查看>>
JAVA Shallow heap & Retained heap
查看>>
2018"百度之星"程序设计大赛 - 资格赛
查看>>
DGUT_FLY退役贴 && FunCfans毕业总结-竞赛篇
查看>>
[]斯特林数
查看>>
麻省理工学院公开课:经典力学
查看>>
一点声明
查看>>
【百度人脸识别开发套件】开放人脸识别APP及SDK,加速二次开发进程
查看>>
2017京东笔试总结
查看>>
人生真是圆的,从BASIC开始的程序人生,又回到了BASIC,难道。。。。。
查看>>
JavaScript基础语法
查看>>
习题6-4 使用函数输出指定范围内的Fibonacci数
查看>>