unity3d 四元数 相乘_unity 四元数相乘 - CSDN
  • Unity 四元数和向量相乘 原创 2016年12月08日 16:51:35 标签:unity3d position = rotation*Vector3(0.0, 0.0, -distance) + target.position; 这是相机环绕的一段代码,当时...

    Unity 四元数和向量相乘

    原创 2016年12月08日 16:51:35

    1. position = rotation*Vector3(0.0, 0.0, -distance) + target.position;  

    这是相机环绕的一段代码,当时无法理解这是怎么实现环绕的尴尬,上网查找了一些资料之后终于明白了,特来记录一下大笑

    Unity 里的rotation是四元数,四元数*向量   得到的是经过旋转后的向量,  例如 Quaternion.Euler(0,90,0) *  vector3(0 , 0 , -distance)  得到的是  (-distance,0,0)

    实际上就是把(0,0,-distance)绕着y轴旋转90度变成了 (-distance,0,0)   ,在与目标位置相加后就能围绕目标环绕了大笑

    yaonan123
    • yaonan123

      2017-09-15 23:07 1楼
    • 还记得四元数乘以向量的问题吗?position = rotation*Vector3(0.0, 0.0, -distance) + target.position;
      这样的到的positon是不固定的,改变distance的值,这样摄像机得位置就会发生变化,在开始的那一刹那,摄像机位置发生变化
    展开全文
  • 作用:四元数和向量相乘表示这个向量按照这个四元数进行旋转之后得到的新的向量。 比如:向量vector3(0,0,10),绕着Y轴旋转90度,得到新的向量是vector3(10,0,0)。 在unity中表示为: 运行结果为: 复合旋转...

    作用:四元数和向量相乘表示这个向量按照这个四元数进行旋转之后得到的新的向量。

    比如:向量vector3(0,0,10),绕着Y轴旋转90度,得到新的向量是vector3(10,0,0)。

    在unity中表示为:

    运行结果为:

    复合旋转就是四元数依次相乘,最后乘以向量

    多来几例:

     

    想了解其中的运算过程的可以往下看。

     

    将四元数的四个值分别计为:(w,x,y,z),unity中的四元数中的四个数字是(x,y,z,w),不影响下面的计算过程。

    绕任意轴旋转任意角度的四元数为:

    那么绕着Y轴旋转90度的四元数就是q = (√2/2 , 0 , √2/2 , 0)

    unity中这个Quaternion.Euler(0,90,0)打debug的话是(0,√2/2 , 0 , √2/2 ),因为排列顺序是(x,y,z,w),不影响下面的计算过程

     

    四元数乘以向量的运算规则为:q * v = (q) *( v) *( q−1);

    其中:

    q = (√2/2 , 0 , √2/2 , 0);

    v,将v向量扩充为四元数(0,v),也就是v = (0 , 0,0 , 10);

    q−1是四元数q的逆,求逆过程如下:

    • 共轭四元数:q*=(w,-x,-y,-z),也就是(√2/2 , 0 , -√2/2 , 0)
    • 四元数的模:N(q) = √(x^2 + y^2 + z^2 +w^2),即四元数到原点的距离,计算结果为1
    • 四元数的逆:q−1=q*/N(q),也就是q−1 = (√2/2 , 0 , -√2/2 , 0)

    q * v = q * v * q−1 = (√2/2 , 0 , √2/2 , 0) * (0 , 0,0 , 10)*(√2/2 , 0 , -√2/2 , 0);

    四元数乘法公式:

    按照上述计算公式: q * v = q * v * q−1

     (√2/2 , 0 , √2/2 , 0) * (0 , 0,0 , 10) = (0,5√2,0,5√2)

    (0,5√2,0,5√2) * (√2/2 , 0 , -√2/2 , 0)=(0,10,0,0);

     

    将最后得到的四元数(0,10,0,0)变为向量(0,newV),就是newV(10,0,0)。

    展开全文
  • Unity3D中的Quaternion(四元数

    万次阅读 2016-07-20 14:15:17
    Unity四元数的基本概念和几个常用函数的用法

        今天,我来总结一下Unity中的四元数得使用。我也是初学,就写的比较飘逸,难免有错误!

        四元数的概念

        四元数,这是一个图形学的概念,一般没怎么见过,图形学中比较常见的角位移的表示方法有“矩阵”、“欧拉角”、“四元数”这三种。可以说各有各的优点和不足,不同的场合用不同的方法。其中四元数的优点有:平滑插值、快速连接、角位移求逆、可以与矩阵形式快速转换、仅用四个数表示。不过,它也有一些缺点:比欧拉角多一个数表示、可能不合法(如:坏的输入数据或者浮点数累计都可能使四元数不合法,不过可以通过四元数标准化来解决这个问题)、晦涩难懂。

        那为啥四元数是四个数呢?其实还是有个小故事的。话说当时十九世纪的时候,爱尔兰的数学家Hamilton一直在研究如何将复数从2D扩展至3D,他一直以为扩展至3D应该有两个虚部(可是他错了,哈哈)。有一天他在路上突发奇想,我们搞搞三个虚部的试试!结果他就成功了,于是乎他就把答案刻在了Broome桥上。说到这里,也就明白了,四元数其实就是定义了一个有三个虚部的复数w+xi+yj+zk。记法[w,(x,y,z)]。

        好了,上面我们就基本清楚四元数的作用以及好处与坑了,下面开始正式讲讲Unity中我们如何使用一些常见的四元数操作。

        Unity中的四元数

        基本的旋转,我们可以通过Transform.Rotate来实现,但是当我们希望对旋转角度进行一些计算的时候,就要用到四元数Quaternion了。Quaternion的变量比较少也没什么可说的,大家一看都明白。唯一要说的就是xyzw的取值范围是[-1,1],物体并不是旋转一周就所有数值回归初始值,而是两周。
            初始值: (0,0,0,1)
            沿着y轴旋转:180°(0,1,0,0) 360°(0,0,0,-1)540°(0,-1,0,0) 720°(0,0,0,1)
            沿着x轴旋转:180°(-1,0,0,0) 360°(0,0,0,-1)540°(1,0,0,0) 720°(0,0,0,1)
            无旋转的写法是Quaternion.identify。

     在unity3d中, quaternion 的乘法操作 (operator  * ) 有两种操作:
         (1) quaternion * quaternion , 例如 q = t * p; 这是将一个点先进行t 操作旋转,然后进行p操作旋转.
         (2)  Quaternion * Vector3, 例如 p : Vector3, t : Quaternion , q : Quaternion;    q = t * p; 这是将点p 进性t 操作旋转;
         我进行的是第2种操作,即对一个向量进行旋转;
         首先 ,Quaternion 的基本数学方程为 : Q = cos (a/2) + i (x * sin(a/2)) + j (y * sin(a/2)) + k(z * sin(a/2))    (a 为旋转角度)
          Q.w = cos (angle / 2) 
          Q.x = axis.x * sin (angle / 2) 
          Q.y = axis.y * sin (angle / 2)  
          Q.z = axis.z * sin (angle / 2)

         我们只要有角度就可以给出四元数的四个部分值,例如我想要让点M=Vector3(o,p,q) 绕x轴顺时针旋转90度;那么对应的quaternion数值就应该为:
         Q : Quaternion;
         Q.x = 1 * sin(90度/2) = sin(45度) = 0.7071
         Q.y = 0;
         Q.z = 0;
         Q.w = cos(90度/2) = cos (45度) = 0.7071

         Q = (0.7071, 0 , 0 , 0.7071);
         m = Q * m;         (将点m 绕 x轴(1,0,0) 顺时针旋转了90度)


        下面我就按照Unity的API介绍下四元数相关的几个基本函数。

        一、LookRotation

        声明形式:public static Quaternion LookRotation ( Vector3 forward, Vector3 upwards=Vector3.up )

        这个功能很实用,传入的两个参数分别代表前方盯着的方向以及自己的上方向。它可以让一个GameObject转动脑袋盯着另一个物体。如:

        public Transform target;
        void Update() {
            Vector3 relativePos = target.position - transform.position;
            Quaternion rotation = Quaternion.LookRotation(relativePos);
            transform.rotation = rotation;
        }
        这段代码就可以让当前的object时时盯着target不放,当然,你也可以自定义up朝向,这里默认是Vector3.up。


        二、Angle

        声明形式:public static float Angle ( Quaternion a, Quaternion b )

        这个就比较简单了,它可以计算两个旋转之间的夹角。与Vector3.Angle()作用是一样的。


        三、Euler

        声明形式:public static Quaternion Euler ( float x, float y, float z )

            或者:    public static Quaternion Euler ( Vector3 euler )

        这个函数可以将一个欧拉形式的旋转转换成四元数形式的旋转。传入的参数分别是欧拉轴上的转动角度。


        四、Slerp

        声明形式:public static Quaternion Slerp ( Quaternion from, Quaternion to, float t )

        基本意思就是线性地从一个角度旋转到另一个角度,其中,旋转匀速增加t。

      附加内容:很多时候from 和to都不是固定的,而且上一个脚本也不能保证所有角度下的旋转速度一致。所以我写了这个脚本来保证可以应付大多数情况。

            Transform target;
            float rotateSpeed = 30.0f;

            Quaternion wantedRotation = Quaternion.FromToRotation(transform.position, target.position);
            float t = rotateSpeed/Quaternion.Angle(transform.rotation, wantedRotation)*Time.deltaTime;
            transform.rotation = Quaternion.Slerp(transform.rotation, target.rotation, t);

        这个脚本可以保证物体的旋转速度永远是rotateSpeed。如果自身坐标和目标之间的夹角是X度,我们想以s=30度每秒的速度旋转到目标的方向,则每秒旋转的角度的比例为s/X。 再乘以每次旋转的时间Time.deltaTime我们就得到了用来匀速旋转的t。


        五、FromToRotation

        声明形式:public static Quaternion FromToRotation ( Vector3 from, Vector3 to )

        它是得到从一个方向到另一个方向的旋转。就是转一个方向,就这么简单。


        六、identity

        这个不是一个函数,它是一个只读的变量。它代表世界坐标系或者父物体坐标系中的无旋转方位。


    两点了,累了,睡觉!

    展开全文
  • unity四元数和向量相乘可以变换旋转。四元数之间相乘类似矩阵之间相乘的效果。 矩阵相乘的顺序不可互换,只有特殊条件矩阵才可互换。四元数相乘类似,今天就因为这个问题掉进坑里了,记录一下   问题大致是,有...

    在unity中四元数和向量相乘可以变换旋转。四元数之间相乘类似矩阵之间相乘的效果。

    矩阵相乘的顺序不可互换,只有特殊条件矩阵才可互换。四元数相乘类似,今天就因为这个问题掉进坑里了,记录一下

     

    问题大致是,有一个cube,它会看向左边的板,用角轴旋转,但我想要y轴看向它

    Quaternion.AngleAxis(-90, Vector3.forward);

     

    以下代码就是没有注意相乘顺序导致的结果

    var quat1 = Quaternion.AngleAxis(-90, Vector3.forward);
    var quat2 = Quaternion.AngleAxis(Time.time * 180, referenceTransform.forward);
    transform.rotation = quat1 * quat2;

     

    修改后正确结果如下

    transform.rotation = quat2 * quat1;

     

     

    所以在处理四元数或者矩阵相乘操作时,注意顺序,并且避免xxx*=quat这样的操作,尽量用直观写法

     

    展开全文
  • Unity3D 四元数的理解

    2019-06-01 10:02:19
    环境:Unity2018.3 语言:C# 总起: 本文主要参考《3D数学基础:图形与游戏开发》这本书。 四元数的理解: ♦复数 首先我来考虑复数轴i,i的定义为i^2=-1。 按照旋转的角度来理解的话,从1变换到-1,1...
  • unity四元数的用法及意义

    千次阅读 2014-11-29 22:10:43
    根据两个向量计算出旋转量,计算出来的旋转量为从fromDirection旋转到toDirection的旋转量 static Quaternion FromToRotation(Vector3 fromDirection,Vector3 toDirection); static Quaternion ...
  • Unity技巧】四元数(Quaternion)和旋转

    万次阅读 多人点赞 2015-08-29 11:40:03
    大家应该都听过,有一种旋转的表示方法叫四元数。按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——矩阵旋转和欧拉旋转。矩阵旋转使用了一个4*4大小的矩阵来表示绕任意轴旋转的变换矩阵,而欧拉选择则是...
  • Unity中的四元数类详解【详解】

    千次阅读 2018-08-31 13:31:49
    一、简介 Quaternion又称四元数,由x,y,z和w这四个分量组成,是由爱尔兰数学家威廉·卢云·哈密顿在1843年发现的数学概念。...关于四元数的性质、与旋转的关系、球型线性插值的介绍,请阅读3D游戏与计算机图形学中...
  • Unity3D四元数

    千次阅读 2016-05-20 15:25:21
    四元数,对于我以前的经历来说,是一个新的数学概念,即不同于以前的算法。 **先介绍一下一些概念:** 超复数:简单的说,就是在以前复数的基础上又发现了新的数据表示方式或者说是新的空间表示,例如a+bj就是实数与...
  • Unity 四元数详解

    千次阅读 2016-03-22 09:15:48
    四元数介绍 旋转,应该是三种坐标变换——缩放、旋转和平移,中最复杂的一种了。大家应该都听过,有一种旋转的表示方法叫四元数。按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——矩阵旋转和...
  • Unity 3D——四元数的应用

    千次阅读 2014-08-21 14:02:53
    四元数用于旋转,确实很不好理解,但是,有一点好处是不会发生万向锁。 主要用法就是:  首先,获取你当前的Rotation的四元数和目标Rotation的四元数相乘即可。 来自前辈的示范:
  • 3D中四元数与三维向量的一些关系以及作用,不涉及深层次操作,Ogre爱好者以及对Unity3D等引擎有类似疑惑的可以一看
  • 版本:unity 5.4.1 语言:C#   2017年了,使用Unity也有一段时间了,略有心得吧,基本上要求一些功能可以拼拼凑凑地做出来,算是入门了吧。   不过很多游戏上使用的技术还没有接触过,比如protobuf、热更新、...
  • Unity--四元数(Quaternion)和旋转

    千次阅读 2019-03-10 20:38:24
    四元数介绍 旋转,应该是三种坐标变换——缩放、旋转和平移,中最复杂的一种了。大家应该都听过,有一种旋转的表示方法叫四元数。按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——矩阵旋转和欧拉旋转...
  • 四元数和向量相乘   Quaternion.Euler(x,y,z) 返回一个绕x轴旋转x度再绕y轴旋转y度再绕z轴旋转z度的Quaternion,因此Quaternion.Euler(0,90,0)返回一个绕y轴旋转90度的旋转操作. Quaternion作用于Vector3的右乘...
  • Unity--四元数详解

    2019-06-28 12:27:29
    Quaternion(四元数)用于计算Unity旋转。它们计算紧凑高效,不受万向节锁的困扰,并且可以很方便快速地进行球面插值。 Unity内部使用四元数来表示所有的旋转。 Quaternion是基于复数,并不容易直观地理解。 不过你...
  • 本文介绍了四元数以及如何在OpenGL中使用四元数表示旋转。 Quaternion 的定义 四元数一般定义如下: q=w+xi+yj+zk 其中 w,x,y,z是实数。同时,有: i*i=-1 j*j=-1 k*k=-1 四元数也可以表示为:...
  • Unity3d_四元数Quaternion

    千次阅读 2017-08-22 02:01:09
    如果想完全,详细的了解四元素,可以看清华妹子的文章 ... 其他人的博客好像也没有说很清楚 清华妹子的这个文章现在有12W的...反正unity3d里面的用法就是2个 第一个用法是:2个对象的面对面,敌人面对玩家,或者玩家瞄准敌
1 2 3 4 5 ... 20
收藏数 405
精华内容 162
关键字:

unity3d 四元数 相乘