今天我们来谈谈关于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度
转换
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));
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));
常用的函数
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
分享到:
相关推荐
该资源实现了 读取格式为 key string 的字典型xml.内含gif演示及 事例xml
[手游] Unity3D《最后一战》全套完整源代码 + 资源
转自AndrewFan - 博客园 看了之后觉得不错 特意分享一下
unity3D动作RPG手游完整源码.zip
unity3d中线性插值和四元数的运用,有完整代码
1、Unity拼图游戏 图片互换: if (Vector2.Distance(btn_Rect.anchoredPosition,null_Img.anchoredPosition)==bg_Layout.cellSize.x+bg_Layout.spacing.x) { print("与空图片相近,点击图片的按钮的图片和空图片的...
<br>使用方法:<br>=========<br><br>(1) 将 TestEncryDll.scx<br> TestEncryDll.sct<br> REG.DLL<br> 存放于同一目录下.<br> <br>(2) 启动VFP6后转到该目录,其指令和DOS指令相同,如 CD D:\pvfp98\ 。<br> 用 ? ...
文章Unity3D学习笔记05:四元数控制人物旋转的脚本代码
unity--期末大作业--3D汽车模拟驾驶工程文件 unity2019 包括所有素材模型背景图片音乐源代码等 其中有六个场景,三个UI场景三个地图场景 UI界面,交互,3D,场景转换效果 wasd控制汽车,空格停止,shift粒子加速,L...
Unity3D中使用uGUI实现3D旋转特效(简单,好用),只需要两个脚本文件
Unity3d特效粒子 可爱卡通 unity官方刀光特效 刀光特效 魔法光效 天气特效
unity3d---小地图
使用矩阵的旋转来做,使用一个临时变量保存正常的矩阵,调用函数:static function RotateAroundPivot (angle : float,
Unity3D 运行时 动态生成模型<三> 编辑模型 整改RTGizmo插件,代码整理更清楚流畅,删除不必要的功能
Unity、3D、特效、刀光、卡通、RPG、VFX、战斗、战斗光影、Unity3D、动作特效、Unity3D、Unity3D、Unity3D、Unity3D、Unity3D、Unity3D、Unity3D、Unity3D、Unity3D、Unity3D、Unity3D、Unity3D、Unity3D、Unity3D、...
2020最新Unity3D LitJson-0.16.0.DLL 集合,已编译好DLL,支持float类型。根据你的Unity3D的Net版本选择不同的LitJson版本。
spine-unity-3_5-beta2.unitypackage
unity 3D实现模型的缩放和5旋转功能
实现类似《英雄联盟》中选择皮肤时的Ui 3D滚动视图效果,包含Ugui 和Ngui的实现
Unity制作《王者荣耀》商业级手游视频教程,压缩包包含部分视频和百度网盘地址,适用于Unity开发王者荣耀游戏的初学者