• Unity中,所有物体即使是空物体,也至少绑定Transform这个组件,这个组件有三个属性:position、rotation、scale,它们分别用于控制物体的平移、旋转和缩放三种变化,而其中最为复杂的一种就是旋转,它就对应于...

            在Unity中,所有物体即使是空物体,也至少绑定Transform这个组件,这个组件有三个属性:position、rotation、scale,它们分别用于控制物体的平移、旋转和缩放三种变化,而其中最为复杂的一种就是旋转,它就对应于transform组件中的rotation属性,这个属性的类型其实就是四元数


    引言:

            常用的控制旋转的方法有:矩阵旋转欧拉旋转,还有本篇要介绍的重点四元数,它也是实现旋转的方式之一。下面简单介绍一下前面的两种实现方式:

    1.矩阵旋转:使用一个4*4的矩阵来表示绕任意轴旋转时的变换矩阵,这个矩阵具有的特点:乘以一个向量的时候只改变向量的方向而不会改变向量的大小

    优点:旋转轴可以是任意向量;

    缺点:进行旋转其实我们只需要知道一个向量和一个角度,4个值的信息,而旋转变换矩阵使用了4*4=16个元素;

                变换过程增加乘法运算量,耗时;


    2.欧拉旋转:在旋转时,按照一定的顺序(例如:x、y、z,Unity中的顺序是z、x、y)每个轴旋转一定的角度,来变换坐标或者是向量,实际上欧拉旋转也可以理解为:一系列坐标旋转的组合;

    优点:只需使用3个值,即三个坐标轴的旋转角度;

    缺点:必须严格按照顺序进行旋转(顺序不同结果就不同);

               容易造成“万向节锁”现象,造成这个现象的原因是因为欧拉旋转是按顺序先后旋转坐标轴的,并非同时旋转,所以当旋转中某些坐标重合就会发生万向节锁,这时就会丢失一个方向上的选择能力,除非打破原来的旋转顺序或者三个坐标轴同时旋转;

               由于万向节锁的存在,欧拉旋转无法实现球面平滑插值;


    一、四元数:

            根据前面所述,我们知道了四元数是用于表示旋转的一种方式,而且transform中的rotation属性的数据类型就是四元数,那么四元数该如何表示呢?从本质上来讲,四元数就是一个高阶复数,也就是一个四维空间

            普通的低阶复数形式一般是:x = a + bi,其中a、b为实数,而i则是虚数单位,而且存在i^2 = -1这样的运算规律,用坐标表示时其实就是由实轴和虚轴构成的二维空间。

            说四元数是高阶复数,是因为它一般表示为:x = a + bi + cj + dk,其中i、j、k都是虚数单位,所以也都满足:i2=j2=k2=1。此外,这三个虚数单位还有以下特点:ij = k,jk = i,ki = j


    关于四元数的优缺点:

    优点:避免万向节锁现象;

               可绕任意过原点的向量旋转;

               可提供球面平滑插值;

    缺点:比欧拉旋转复杂,多了一个维度;

               不够直观;


    二、四元数与欧拉角:

            根据上述,我们可以这样表示一个四元数:q = w + xi + yj + zk,为了与三维旋转联系起来,可以简化表示为:q = ((x,y,z),w) = (v,w),其中v是一个向量,而w是个实数。此外,向量可以看做实部为0的四元数,而实数亦可以看做虚部为0的四元数

            四元数基本运算法则:(证明:http://www.cnblogs.com/yiyezhai/p/3176725.html

            


            假设我们想让点P绕单元向量u = (x,y,z)表示的旋转轴转θ角度,具体步骤:

    1.将点P坐标转换到四元数空间:P = (P,0);

    2.使用q=((x,y,z)sinθ2,cosθ2)    来执行这个旋转;

    3.旋转后的结果p'的坐标为:p=qpq1


    三、实际应用:

            上述讲解的是四元数的原理,但是在实际的使用中并没有那么复杂,我们只要调用Unity为我们提供的接口来修改旋转角度即可,例如为对象直接设置一个旋转值:

    float speed = 100.0f;
    float x;
    float z;
    
    void Update () {
      if(Input.GetMouseButton(0)){//鼠标按着左键移动 
        y = Input.GetAxis("Mouse X") * Time.deltaTime * speed;               
        x = Input.GetAxis("Mouse Y") * Time.deltaTime * speed; 
      }else{
        x = y = 0 ;
      }
      
      //旋转角度(增加)
      transform.Rotate(new Vector3(x,y,0));
      /**---------------其它旋转方式----------------**/
      //transform.Rotate(Vector3.up *Time.deltaTime * speed);//绕Y轴 旋转 
    
      //用于平滑旋转至自定义目标 
      pinghuaxuanzhuan();
    }
    
    
    //平滑旋转至自定义角度 
    
    void OnGUI(){
      if(GUI.Button(Rect(Screen.width - 110,10,100,50),"set Rotation")){
        //自定义角度
    
        targetRotation = Quaternion.Euler(45.0f,45.0f,45.0f);
        // 直接设置旋转角度 
        //transform.rotation = targetRotation;
    
        // 平滑旋转至目标角度 
        iszhuan = true;
      }
    }
    
    bool iszhuan= false;
    Quaternion targetRotation;
    
    void pinghuaxuanzhuan(){
      if(iszhuan){
        transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 3);
      }
    }
            就像上述的代码中,在实际应用中我们只需通过Quaternion.EulerQuaternion.Slerp来完成Rolation的赋值操作。

    展开全文
  • 学了那么久 其实对Unity欧拉角四元数并没有很深刻的认识…所以就此开篇稍微介绍一下 我们首先知道的是,在Unity中有两种方式表示旋转。一种是欧拉角,还有一种就是四元数,那其中的区别有哪些呢?我们先分别...

    学了那么久 其实对Unity的欧拉角和四元数并没有很深刻的认识…所以就此开篇稍微介绍一下

    • 我们首先知道的是,在Unity中有两种方式表示旋转。一种是欧拉角,还有一种就是四元数,那其中的区别有哪些呢?我们先分别介绍一下。

    一.欧拉角

    欧拉角最容易表示,用三个变量X,Y,Z可以直观的表示绕着某个轴的旋转角度。

    在Unity里就是Transform组件的Rotation里的X Y Z三个变量代表了欧拉角

    二.四元数

    四元数相比于欧拉角就比较复杂了,由四个变量组成(在Unity中称为X,Y,Z,W),但是这些变量的值不代表旋转角度,所以可能给你一个向量(0。7,0,0,0.7)你并不知道实际旋转的角度,当然四元数的详细解释需要数学方面的深入研究,有兴趣的可以自行查找有关资料

    • 因为在Unity没有可视化界面可以调整四元数(因为真的调了也不直观看到旋转的角度),所以我们只能用脚本来访问

    三.脚本中内容

    欧拉角如果在脚本中表示呢?
    是不是想到之前图中的那个Rotation,那你是不是自然而然的想到了通过transform.rotation访问呢?如果你是这样想的,那就错了!
    在Unity中transform.rotation代表的是四元数!附上官网证明!

    那到底如何表示欧拉角呢?其实表示很简单,并附上官网解释

    transform.eulerAngles =new Vector3(20,300,40);
    


    当我们以上述代码运行后会发现Rotation中的Y值是-60,那是因为面板上的Rotation中的X Y Z值范围是在(-180,180),对于代码中超出的部分会自动进行计算映射到范围内

    四元数的代码表示就是之前的transform.rotation,那你肯定会想欧拉角和四元数之前能否转换呢,知道其中一个的值,如果改变成对方呢?代码如下

    //欧拉角->四元数 
    //通过Quaternion.Euler() 传递一个Vector3向量的欧拉角
    transform.rotation = Quaternion.Euler(new Vector3(20, 300, 40));
    
    //四元数->欧拉角
    transform.rotation.eulerAngles;//对你没看错 直接可以转换获取
    

    三.区别

    欧拉角:
    • 优点:三个角度组成,直观,容易理解
    • 优点:可以进行从一个方向到另一个方向旋转大于180度的角度
    • 缺点:死锁问题——万向节死锁 万向节死锁介绍
    四元数
    • 优点:不存在万向节死锁问题
    • 优点:存储空间小,计算效率高
    • 缺点:单个四元数不能表示在任何方向上超过180度的旋转。
    • 缺点:数字表示不直观

    四.常用API

    • Quaternion.LookRotation() 使其转向某个方向

      函数传递的参数的一个Vector3的向量 这个向量表示的是要看向的向量,通常用目标的positon和自身的position进行相减求得此向量
    Vector3 pos = target.transform.position - transform.position;
    transform.rotation = Quaternion.LookRotation(pos);
    

    是不是觉得和transform.LookAt()效果很像…

    //和上面代码得到的效果相同
    transform.LookAt(target.transform);
    
    • Quaternion.Slerp() 平滑进行转动动画

      函数传递的参数分别是 当前GameObject的四元数、目标要转向的四元数 和 一个插值时间
      我们看个例子
    void LookAtTarget()
        {
            if (Input.GetKey(KeyCode.Space))
            {
                Vector3 dir = target.transform.position - transform.position;
                dir.y = 0;//不让Player有y轴上的倾角
                Quaternion target = Quaternion.LookRotation(dir);
                transform.rotation = Quaternion.Slerp(transform.rotation, target, Time.deltaTime);
            }
        }
    

    我们将上述的LookAtTarget()方法放到Update()函数中进行执行
    就可以看到平滑的转动

    • Quaternion.Lerp() 说实话个人用起来和Slerp()区别不大

      图中红线框出来的就是区别:使用Lerp()进行旋转的速度较快,但是在旋转角度较大的时候,效果会糟一点。

    • Quaternion.RotateTowards()

      传递两个四元数,和一个角度增量值,使第一个四元数逐渐趋近于第二个四元数并最终相等

    void Update()
        {
            float step = 3 * Time.deltaTime;
            transform.rotation = Quaternion.RotateTowards(transform.rotation,target.transform.rotation,step);
        }
    

    结果就是当前物体的四元数和目标的四元数相等

    • Transform.RotateAround()

      传递一个参照点point、绕哪个轴转axis和增量角度angle
    void Update()
        {
            float step = 3 * Time.deltaTime;
            transform.RotateAround(target.transform.position,Vector3.up,step);
        }
    

    五.总结

    差不多基础概念就这些了吧,如果要深入了解的话,建议还是看API,并且自己多动手尝试一下数据~

    展开全文
  • 旋转矩阵、欧拉角四元数理论及其转换关系author@jason_ql(lql0716) http://blog.csdn.net/lql07161、概述旋转矩阵、欧拉角四元数主要用于表示坐标系中的旋转关系,它们之间的转换关系可以减小一些算法的...

    旋转矩阵、欧拉角、四元数理论及其转换关系


    author@jason_ql(lql0716)
    http://blog.csdn.net/lql0716


    1、概述

    旋转矩阵、欧拉角、四元数主要用于表示坐标系中的旋转关系,它们之间的转换关系可以减小一些算法的复杂度。

    本文主要介绍了旋转矩阵、欧拉角、四元数的基本理论及其之间的转换关系。

    2、原理

    2.1 旋转矩阵

    • 对于两个三维点 p1(x1,y1,z1)p2(x2,y2,z2),由点 p1 经过旋转矩阵 R 旋转到 p2,则有:

    R=[r11r12r13r21r22r23r31r32r33]

    [x2y2z2]=R[x1y1z1]

    注:旋转矩阵为正交矩阵RRT=E

    • 绕x轴旋转:

    Rx(θ)=[1000cosθsinθ0sinθcosθ]

    • 绕y轴旋转:

    Ry(θ)=[cosθ0sinθ010sinθ0cosθ]

    • 绕z轴旋转:

    Rz(θ)=[cosθsinθ0sinθcosθ0001]

    • 任意旋转矩阵:
      任何一个旋转可以表示为依次绕着三个旋转轴旋三个角度的组合。这三个角度称为欧拉角
      三个轴可以指固定的世界坐标系轴,也可以指被旋转的物体坐标系的轴。三个旋转轴次序不同,会导致结果不同。

    Rx(θ1)Ry(θ2)Rz(θ)Ry(θ2)Rx(θ1)

    2.2 欧拉角

    • 欧拉角有两种:
      静态:即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态。
      动态:即绕物体坐标系三个轴的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态。
      使用动态欧拉角会出现万向锁现象;静态欧拉角不存在万向锁的问题。

    • 对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。参考系又称为实验室参考系,是静止不动的。而坐标系则固定于刚体,随着刚体的旋转而旋转。

    • 如图1,设定xyz-轴为参考系的参考轴。称xy-平面与XY-平面的相交为交点线,用英文字母(N)代表。zxz顺规的欧拉角可以静态地这样定义:

      α 是x-轴与交点线的夹角,
      β 是z-轴与Z-轴的夹角,
      γ 是交点线与X-轴的夹角。

    • 图1:
      此处输入图片的描述
      图中三个欧拉角分别为:(α,β,γ)
      蓝色的轴为:xyz
      红色的轴为:XYZ
      绿色的线为交线:N
      α[0,2π],β[0,π],γ[0,2π]

    • 很可惜地,对于夹角的顺序和标记,夹角的两个轴的指定,并没有任何常规。科学家对此从未达成共识。每当用到欧拉角时,我们必须明确的表示出夹角的顺序,指定其参考轴。

    • 实际上,有许多方法可以设定两个坐标系的相对取向。欧拉角方法只是其中的一种。此外,不同的作者会用不同组合的欧拉角来描述,或用不同的名字表示同样的欧拉角。因此,使用欧拉角前,必须先做好明确的定义。

    • 欧拉角的基本思想是将角位移分解为绕三个互相垂直轴的三个旋转组成的序列。所以,欧拉旋转的三个角,可以对应于三个旋转矩阵。
      Yaw(偏航):欧拉角向量的y轴
      Pitch(俯仰):欧拉角向量的x轴
      Roll(翻滚): 欧拉角向量的z轴

    • Unity3D中,欧拉旋转是按照ZYX的顺序旋转的。(不同的旋转顺序最终得到的结果是不一样的,要引起重视。给定一组欧拉角角度值,比如yaw=45度,pitch=30度,roll=60度,按照yaw-pitch-roll的顺序旋转和按照yaw-roll-pitch的顺序旋转,最终刚体的朝向是不同的!换言之,若刚体需要按照两种不同的旋转顺序旋转到相同的朝向,所需要的欧拉角角度值则是不同的!)

    • 欧拉角的缺点:

      1、 欧拉角的表示方式不唯一。给定某个起始朝向和目标朝向,即使给定yaw、pitch、roll的顺序,也可以通过不同的yaw/pitch/roll的角度组合来表示所需的旋转。这其实主要是由于万向锁(Gimbal Lock)引起的;

      2、欧拉角的插值比较难;

      3、计算旋转变换时,一般需要转换成旋转矩阵,这时候需要计算很多sin, cos,计算量较大;

    2.2.1 由欧拉角求旋转矩阵

    设三个轴x,y,z的欧拉角分别为θx,θy,θz,正弦值、余弦值分别为sx,cx,sy,cy,sz,cz那么旋转矩阵为:

    R(θx,θy,θz)=Rz(θz)Ry(θy)Rx(θx)=[cyczczsxsycxszsxsz+cxczsycyszcxcz+sxsyszcxsyszczszsycysxcxcy]

    2.2.2 由旋转矩阵求欧拉角

    R=[r11r12r13r21r22r23r31r32r33]=[cyczczsxsycxszsxsz+cxczsycyszcxcz+sxsyszcxsyszczszsycysxcxcy]

    解方程可得:

    θx=atan2(r32,r33)

    θy=atan2(r31,r322+r332)

    θz=atan2(r21,r11)

    注:atan2()为C++中的函数,atan2(y,x) 求的是y/x的反正切,其返回值为[-pi,+pi]之间的一个数。

    2.3 四元数

    四元数(Quaternions)是由爱尔兰数学家哈密顿(William Rowan Hamilton)在1843年提出。

    三维空间的任意旋转,都可以用绕三维空间的某个轴旋转过某个角度来表示,即所谓的Axis-Angle表示方法。这种表示方法里,Axis可用一个三维向量(x,y,z)来表示,θ可以用一个角度值来表示,直观来讲,一个四维向量(θ,x,y,z)就可以表示出三维空间任意的旋转。注意,这里的三维向量(x,y,z)只是用来表示axis的方向朝向,因此更紧凑的表示方式是用一个单位向量来表示方向axis,而用该三维向量的长度来表示角度值θ。这样以来,可以用一个三维向量(θx,θy,θz)就可以表示出三维空间任意的旋转,前提是其中(x,y,z)是单位向量。这就是旋转向量(Rotation Vector)的表示方式,OpenCV里大量使用的就是这种表示方法来表示旋转(见OpenCV相机标定部分的rvec)。

    • 单位向量(x,y,z)旋转θ角度后的四元数:

      (cosθ2,xsinθ2,ysinθ2,zsinθ2)

    • 对于三维坐标的旋转,可以通过四元数乘法直接操作,与旋转矩阵操作可以等价,但是表示方式更加紧凑,计算量也可以小一些。

    2.3.1 四元数基本概念

    • 四元数的复数定义:

      q=q0+q1i+q2j+q3k=[s,v]

      • 其中 q0,q1,q2,q3均为实数, s=q0,v=[q1,q2,q3]i2=j2=k2=1
      • 对于 i,j,k 本身的几何意义可以理解为一种旋转,其中 i 代表 x 轴与 y 轴相交平面中 x 轴正向向 y 轴正向的旋转, j 旋转代表 z 轴与 x 轴相交平面中 z 轴正向向 x 轴正向的旋转, k 旋转代表 y 轴与 z 轴相交平面中 y 轴正向向 z 轴正向的旋转, i,j,k 分别代表 i,j,k 的反向旋转。
    • 四元数的模

      |q|=q02+q12+q22+q32

    • 四元数的优点:

      • 非奇异表达(和欧拉角之类的表示相比)
      • 比矩阵更紧凑(更快速)
      • 单位四元数的对可以表示四维空间中的一个旋转
    • 四元数与群

      所有单位四元数的集合组成一个三维球S3和在乘法下的一个群(李群)。S3是行列式为1的实正交3x3正交矩阵的群SO(3,R)的双面覆盖,因为每两个单位四元数通过上述关系对应于一个转动。群S3和SU(2)同构,SU(2)是行列式为1的复酉2x2矩阵的群。

      A={q=q0+q1i+q2j+q3k|q0,q1,q2,q3},则A是一个环,并且是一个格,A中存在24个四元数,而它们是施莱夫利符号为{3,4,3}的正二十四胞体的顶点。

    • 四元数的运算:

      p1=[s1,v1]=(a1b1c1d1)T

      p2=[s2,v2]=(a2b2c2d2)T

      • 四元数的加法

      p1+p2=s1+s2+v1+v2=(a1+a2)+(b1+b2)i+(c1+c2)j+(d1+d2)k

      • 四元数的乘法

      p1p2=s1s2v1v2+s1v2+s2v1+v1×v2

      p1p2=(a1a2b1b2c1c2d1d2a1b2+b1a2+c1d2d1c2a1c2b1d2+c1a2+d1b2a1d2+b1c2c1b2+d1a2)

      注:四元数不满足交换律,故 p1p2p2p1,四元数的乘法不等同于外积。

      • 四元数的点积(内积)
        点积也叫欧几里得内积,四元数的点积等同于一个四维向量的点积。点积的值是p1,p2中相应元素的数值的乘积的和。

      p1p2=s1s2+v1v2=a1a2+b1b2+c1c2+d1d2

      • 四元数的外积Outer(p1,p2)

      • 四元数的偶积Even(p1,p2)

      • 四元数的叉积p1×p2

      p1×p2=p1p2p2p22

      p1×p2=v1×v2

      p1×p2=(c1d2c2d1)i+(b1d2b2d1)j+(b1c2b2c1)k

      • 四元数的共轭 q

      q=sv=[s,v]

      qq=q02+q12+q22+q32

      • 四元数的逆 q1

      qq1=q1q=1

      q1=q||q||2

      • 单位四元数
        单位四元数的共轭和逆相等 q1=q
    • 四元数乘法的性质:

      1、满足结合律
      2、不满足交换律
      3、乘积的模等于模的乘积
      4、乘积的逆等于各个四元数的逆以相反的顺序相乘

    2.3.2 四元数求旋转矩阵

    • 方法1:

      • 已知四元数

        q=q0+q1i+q2j+q3k=[s,v]

      • 利用Rodrigues公式可以由四元数求得旋转矩阵R:

        R=[12q222q322q1q22q0q32q1q3+2q0q22q1q2+2q0q312q122q322q2q32q0q12q1q32q0q22q2q3+2q0q112q122q22]

    • 方法2:

    • 亦可以将四元数转化为轴角 θ 与向量 (x,y,z),然后再计算旋转矩阵(这样需要多计算一个arccos,不划算)

      q=(θxyz)T

    • 利用Rodrigues公式可以由单位向量ω=(x,y,z)旋转θ角度后的四元数求得旋转矩阵R:

    R=eωθ=I+ω×sinθ+ω×2(1cosθ)=I+[0zyz0xyx0]sinθ+[y2z2xyxzxyx2z2yzxzyzx2y2](1cosθ)=[1zsinθysinθzsinθ1xsinθysinθxsinθ1]+[y2z2xyxzxyx2z2yzxzyzx2y2](1cosθ)=[1(y2+z2)(1cosθ)zsinθ+xy(1cosθ)ysinθ+xz(1cosθ)zsinθ+xy(1cosθ)1(x2+z2)(1cosθ)xsinθ+yz(1cosθ)ysinθ+xz(1cosθ)xsinθ+yz(1cosθ)1(x2+y2)(1cosθ)]=[cosθ+x2(1cosθ)zsinθ+xy(1cosθ)ysinθ+xz(1cosθ)zsinθ+xy(1cosθ)cosθ+y2(1cosθ)xsinθ+yz(1cosθ)ysinθ+xz(1cosθ)xsinθ+yz(1cosθ)cosθ+z2(1cosθ)]

    R=[cosθ+x2(1cosθ)zsinθ+xy(1cosθ)ysinθ+xz(1cosθ)zsinθ+xy(1cosθ)cosθ+y2(1cosθ)xsinθ+yz(1cosθ)ysinθ+xz(1cosθ)xsinθ+yz(1cosθ)cosθ+z2(1cosθ)]

    2.3.3 旋转矩阵求四元数

    • 情况1:

      q0=1+r11+r22+r332

      q1=r32r234q0

      q2=r13r314q0

      q3=r21r124q0

      其中要满足 q001+r11+r22+r33>0,即 1+tr(R)>0

    • 情况2:
      如果q0趋近于0,tr(R)趋近于-1,则求解四元数的过程为:

      • 2.1 如果max{r11,r22,r33}=r11

        t=1+r11r22r33

        q0=r32r23t

        q1=t/4

        q2=r13+r31t

        q3=r12+r21t

      • 2.2 如果max{r11,r22,r33}=r22

        t=1r11+r22r33

        q0=r13r31t

        q1=r12+r21t

        q2=t/4

        q3=r32+r23t

      • 2.3 如果max{r11,r22,r33}=r33

        t=1r11r22+r33

        q0=r21r12t

        q1=r13+r31t

        q2=r23r32t

        q3=t/4

    参考资料

    展开全文
  • 四元数转化成欧拉角 Vector3 v3=transform.rotation.eulerAngles; 欧拉角转换成四元数 Quaternion rotation = Quaternion.Euler(v3);

    四元数转化成欧拉角    Vector3 v3=transform.rotation.eulerAngles;

    欧拉角转换成四元数     Quaternion rotation = Quaternion.Euler(v3);

    展开全文
  • Unity3D中通过四元数得到欧拉角
    	void Start () {
            gameObject.transform.rotation = QuaternionToEular(-89.0f,50.0f,100.0f);
            
        }
    	
    	// Update is called once per frame
    	void Update () {
    	
    	}
        private Quaternion QuaternionToEular(float XX, float YY,float ZZ)
        {
            float X = XX /180* Mathf.PI;
            float Y = YY / 180 * Mathf.PI;
            float Z = ZZ / 180 * Mathf.PI;
            float x = Mathf.Cos(Y / 2) * Mathf.Sin(X / 2) * Mathf.Cos(Z/ 2) +Mathf.Sin(Y / 2) * Mathf.Cos(X / 2) * Mathf.Sin(Z/ 2);       
            float y = Mathf.Sin(Y / 2)*Mathf.Cos(X/ 2)*Mathf.Cos(Z / 2) -Mathf.Cos(Y / 2)*Mathf.Sin(X/ 2)*Mathf.Sin(Z/ 2);
            float z=  Mathf.Cos(Y / 2) * Mathf.Cos(X/ 2) * Mathf.Sin(Z/ 2)-Mathf.Sin(Y / 2) * Mathf.Sin(X/ 2) * Mathf.Cos(Z / 2);
            float w=Mathf.Cos(Y / 2)* Mathf.Cos(X / 2)* Mathf.Cos(Z/ 2) + Mathf.Sin(Y / 2)*Mathf.Sin(X / 2)*Mathf.Sin(Z / 2);
            Quaternion quataion = new Quaternion(x, y, z, w);
            return quataion;
        }
    }
    
    通过四元数得到欧拉角,最后结果


    计算过程中有一点点误差。但要注意万向锁。

    展开全文
  • 四元数转化成欧拉角 Vector3 v3=transform.rotation.eulerAngles; 欧拉角转换成四元数 Quaternion rotation = Quaternion.Euler(v3);
  • 四元数(Quaternion)和欧拉角(Eulerangle)这两个老朋友我们在游戏开发的时候会非常,非常频繁的使用他们。然而有时候我会混淆他们的定义以及用法,所以今天写一篇博客,来总结一下,夯实基础。 1.首先我们还是要...
  • Unity中有相应的api,单纯只是学习一下原理 Quaternion ToQuaternion(Vector3 v) { Quaternion q = new Quaternion(); float yaw = v.z * 0.5f * Mathf.Deg2Rad; float pitch = v.y * 0.5f * Mathf.Deg...
  • 当我们使用unity的时候,面对一个物体,一个不可避免的问题就是:控制物体...但是unity同时还具有Quaternion(四元数)的功能,所以这里就有必要介绍一下——欧拉角四元数(我的数学很渣,只是简单的为大家介绍一下),
  • 欧拉角 -> 四元数: Eigen::AngleAxisd rollAngle(roll, Eigen::Vector3d::UnitX()); Eigen::AngleAxisd pitchAngle(pitch, Eigen::Vector3d::UnitY()); Eigen::AngleAxisd yawAngle(yaw, Eigen::Vector3d::...
  • 3D计算机图形学】变换矩阵、欧拉角四元数 旋转矩阵、欧拉角四元数主要用于:向量的旋转、坐标系之间的转换、角位移计算、方位的平滑插值计算。 一、变换矩阵: 首先要区分旋转矩阵和变换矩阵: 旋转矩阵...
  • unity3d中的欧拉角

    2015-11-09 17:23:29
    1.欧拉角Vector3(x,y,z)代表的是旋转物体(标准旋转坐标轴x,y,z若旋转物体则取反),且是将物体从物体坐标系旋转惯性坐标系,旋转顺序为 z, y, x也就是roll pitch yaw。 2.欧拉角有别名和万向锁问题,不要随便增长...
  • 万向锁 一直困惑我很久,原因出在这里,我以为欧拉角旋转是以模型坐标(齐次坐标系)为旋转轴。问题就来了,无论旋转那个轴,其它两个轴也会相应的变化,下面看图: 根据上面的说明两个旋转面(圆圈)怎么会共面,...
  • 欧拉角四元数一、欧拉角1、什么是欧拉角2、欧拉角的优点3、欧拉角的缺点3.1 万向节死锁二、四元数1、什么是四元数2、基本运算2.1 与向量相乘2.2 与四元数相乘3、优点4、常用API 一、欧拉角 1、什么是欧拉角 ...
  • 1. Unity 3d中与欧拉角有关的API 以下一共讲述了5个相关的API,前4个通过给transform组件的属性赋值实现旋转,最后1个直接使用transform组件的方法实现旋转。值得注意的是,前2个方法(包含local关键字)可以实现基于...
1 2 3 4 5 ... 20
收藏数 783
精华内容 313