zoukankan      html  css  js  c++  java
  • [原]Unity手游之路 四 3d旋转-四元数,欧拉角和变幻矩阵

    今天我们来谈谈关于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.四元数到变换矩阵
    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.变换矩阵到四元数
    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快,.但是如果旋转角度相距很远则会看起来很差

    比较

    • 变换矩阵

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

    • 欧拉角

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

    • 四元数

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

  • 相关阅读:
    三次请求(读-改-读)引出nibernate 一级缓存
    算法竞赛入门经典第一、二章摘记
    uva 10905 Children's Game
    uva 11205 The broken pedometer
    uva 10160 Servicing stations
    uva 208 Firetruck
    uva 167 The Sultan's Successors
    zoj 1016 Parencodings
    uva 307 Sticks
    uva 216 Getting in Line
  • 原文地址:https://www.cnblogs.com/java20131201/p/3470448.html
Copyright © 2011-2022 走看看