2019-05-04 21:55:40 wangjianxin97 阅读数 1236
  • Unity3D入门精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4729 人正在学习 去看看 张刚

学了那么久 其实对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,并且自己多动手尝试一下数据~

2017-10-20 22:58:50 q764424567 阅读数 172
  • Unity3D入门精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4729 人正在学习 去看看 张刚

[数学] 欧拉角、四元数

[数学] 欧拉角、四元数

方位、方向、角位移:
  • 方位:描述的是物体的朝向。要确定一个方位(orientation),却至少需要需要三个参数。
  • 方向:“方向”和“方位”并不完全一样。向量有“方向”但没有“方位”,因为让向量自转,但向量却不会有任何变化。只要用两个数字(例如:极坐标),就能用参数表示一个方向(direction)。
  • 角位移:我们描述物体位置时并不是绝对坐标,而是描述相对于给定参考点的位移。同样,描述物体方位时,也不能使用绝对量。方位是通过与相对已知方位(通常称为"单位"方位或"源"方位)的旋转来描述的。旋转的量称作角位移。在数学上描述方位就等价于描述角位移。
欧拉角:

欧拉角是描述方位的一种方法。

  • 什么是欧拉角:
    欧拉角将方位(角位移)分解为绕三个互相垂直轴的旋转。任意三个轴和任意顺序都可以,但最有意义的是使用笛卡尔坐标系并按一定顺序所组成的旋转序列。
    最常用的约定是所谓的"heading-pitch-bank"约定。它的基本思想是让物体开始于"标准"方位–就是物体坐标轴和惯性坐标轴对齐。在标准方位上,让物体作heading、pitch、bank旋转,最后物体到达我们想要描述的方位。

    首先,heading为绕y轴的旋转量,向右旋转为正:


    heading

    经过heading旋转,pitch为绕x轴的旋转量,注意是物体坐标系的x轴,不是原惯性坐标系的x轴:


    pitch

    经过了heading和pitch,bank为绕z轴的旋转量,注意是物体坐标系的z轴


    bank

    roll-pitch-yaw
    heading-pitch-bank也叫做roll-pitch-yaw,roll等价于bank,yaw基本上等价于heading。注意,它的顺序和heading-pitch-bank的顺序相反,这只是语义上的。


    roll-pitch-yaw

    注:1、旋转可以以不同的顺序进行。2、决定每个旋转的正方向时不一定必须遵守左手或右手法则。

  • 欧拉角的优点:
    欧拉角仅使用三个数来表达方位,并且这三个数都是角度。这使欧拉角具有一些独特的优点:
    1、欧拉角对我们来说很容易使用。2、最简洁的表达方式。3、任意三个数都是合法的。

  • 欧拉角的缺点:

    1. 给定方位的表达方式不唯一。
      • 在将一个角度加上360度的倍数时,并不会改变方位。
      • 还有一种情况,由三个角度不互相独立而导致的。例如,pitch135度等价于heading180度,pitch45度,然后bank180度。为了保证任意方位都只有独一无二的表示,必须限制角度的范围。一种常用的技术是将heading和bank限制在+180度到-180度之间,pitch限制在+90度到-90度之间。
      • 万向锁:
        欧拉角最著名的别名问题是这样的:先heading45度再pitch90度,这与先pitch90度再bank45度是等价的。事实上,一旦选择+(-)90度为pitch角,就被限制在只能绕竖直轴旋转。这种现象,角度为+(-)90度的第二次旋转使得第一次和第三次旋转的旋转轴相同,称作万向锁。为了消除限制欧拉角的这种别名现象,规定万向锁情况下由heading完成绕竖直轴的全部旋转。换句话说,在限制欧拉角中,如果pitch为+(-)90度,则bank为0。
    2. 两个角度间求插值非常困难。

      • 如果没有使用限制欧拉角,方位A的heading为720度,方位B的heading为45度,heading值只相差45度,但简单的插值会在错误的方向上绕将近两周。
      • 设A的heading为-170度,B的heading为170度。这两个值只相差20度,但插值操作又一次发生了错误,旋转是沿 "长弧"绕了340度而不是更短的20度。

        解决这类问题的方法是将插值的"差"角度折到-180度到180度之间,以找到最短弧。

四元数:

四元数通过使用四个数来表示方位。可以避免万向节死锁这样的问题。

  • 四元数记法:
    一个四元数包含一个标量和一个3D向量,经常记标量分量为w,记向量分量为单一的v 或分开的x、y、z。

  • 四元数与复数:
    复数对(a, b)定义了数a+bi,i是虚数,满足i^2 = -1,a称作实部,b称作虚部。任意实数k都能表示为复数k + 0i。
    复数集存在于一个2D平面上,可以认为这个平面有两个轴:实轴和虚轴。这样,就能将复数(x, y)解释为2D向量。用这种方法解释复数,可以表达平面中的旋转:


    旋转后的复数p’能用复数乘法计算出来:
    p = x + yi
    q = cosθ + i sinθ
    p’ = pq = (x + yi)(cosθ + i sinθ) = (xcosθ - ysinθ) + (xsinθ + ycosθ)i
    这和用2x2旋转矩阵达到的效果是一样的。

    四元数扩展了复数系统,它使用三个虚部i, j, k。它们的关系如下:


    一个四元数[w, (x, y, z)]定义了复数 w+xi+yj+zk,很多标准复数的性质都能应用到四元数上。更重要的是,和复数能用来旋转2D中的向量类似,四元数也能用来旋转3D中的向量。

  • 四元数和轴-角对:
    欧拉证明了一个旋转序列等价于单个旋转。因此,3D中的任意角位移都能表示为绕单一轴的单一旋转。这种描述方位的形式称作轴-角描述法。

    设n为旋转轴,将n定义为单位长度。根据左手或右手法则, n的方向定义了哪边将被认为是旋转"正"方向。设θ为绕轴旋转的量,因此,轴-角对(n , θ)定义了一个角位移:绕 n 指定的轴旋转θ角。

    四元数能被解释为角位移的轴-角对方式。然而, n和θ不是直接存储在四元数的四个数中。公式列出了四元数中的数和 n,θ的关系,两种四元数加法都被使用了。


    n,θ 的关系

  • 负四元数:
    四元数能求负,做法很直接,将每个分量都变负:


    q 和-q 代表的实际角位移是相同的。如果我们将θ加上360度的倍数,不会改变q代表的角位移,但它使q的四个分量都变负了。因此,3D中的任意角位移都有两种不同的四元数表示方法,它们互相为负。

  • 单位四元数:
    几何上,存在两个"单位"四元数,它们代表没有角位移,[1, 0]和[-1, 0](注意粗体0,它们代表零向量)。
    当θ是360度的偶数倍时,cos(θ/2)=1;θ是360度的奇数倍时,cos( θ /2)=-1。在两种情况下,都有sin(θ/2)=0,所以 n 的值无关紧要。它的意义在于:
    当旋转角θ是360度的整数倍时,方位并没有改变,并且旋转轴也是无关紧要的。

    数学上,实际只有一个单位四元数:[1, 0]。用任意四元数 q 乘以单位四元数[1, 0],结果仍是 q 。任意四元数 q 乘以另一个"几何单位"[1, 0]时得到-q 。几何上,因为 q 和-q 代表的角位移相同,可认为结果是相同的。但在数学上, q 和-q 不相等,所以[1, 0]并不是"真正"的单位四元数。

  • 四元数的模:
    和复数一样,四元数也有模。


    四元数的模

    让我们看看它的几何意义,代入 θ 和 n ,可得到:


    n 为单位向量,所以:


    由三角公式sin2x + cos2x = 1,可得:


    如果用四元数来表示方位,我们仅使用符合这个规则的 单位四元数

  • 四元数共轭和逆:
    四元数的共轭记作 q*,可通过让四元数的向量部分变负来获得:


    四元数的逆记作 q ^-1,定义为四元数的共轭除以它的模:


    一个四元数 q 乘以它的逆 q ^-1,即可得到单位四元数[1, 0]。

    因为我们只使用单位四元数,所以四元数的逆和共轭是相等的。
    q 和 q* 代表相反的角位移。很容易验证这种说法,使 v 变负,也就是使旋转轴反向,它颠倒了我们所认为的旋转正方向。因此, q 绕轴旋转θ角,而 q* 沿相反的方向旋转相同的角度。

  • 四元数乘法:
    四元数能根据复数乘法解释来相乘,使用分配律即可:



    四元数乘法满足结合律,但不满足交换律

    四元数乘积的模等于模的乘积:


    它保证了两个单位四元数相乘的结果还是单位四元数。

    四元数乘积的逆等于各个四元数的逆以相反的顺序相乘:



    现在来看四元数一个非常有用的性质。"扩展"一个标准3D点(x, y, z)到四元数空间,通过定义四元数p=[0, (x, y, z)]即可。设q为旋转四元数形式[cos(θ/2), nsin(θ/2)],n为旋转轴,单位向量,θ为旋转角。则执行下面的乘法可以使3D点p绕n旋转:


    考虑多次旋转的情况,将点p用一个四元数a旋转然后再用另一个四元数b旋转:


    可以看到,先进行a旋转再进行b旋转,等价于ba代表的单一旋转。
    因此四元数乘法能用来连接多次旋转,这和矩阵乘法的效果一样。

  • 四元数的"差":
    "差"被定义为一个方位到另一个方位的角位移。即给定方位a和b,能够计算从a旋转到b的角位移d:
    ad=b
    两边同时左乘a^-1:


    现在我们有了求得代表一个方位到另一个方位角位移的四元数的方法。
    两个四元数之间的角度"差"更类似于"除"。

  • 四元数点乘:
    四元数也有点乘运算,它的记法、定义和向量点乘非常类似:


    和向量点乘一样,其结果是标量。对于单位四元数a和b,有-1 ≤ a . b ≤ 1。
    四元数点乘的几何解释类似于向量点乘的几何解释,四元数点乘 a · b 的绝对值越大,a和b代表的角位移越"相似"。

  • 四元数的对数、指数和标量乘运算:
    我们先定义α = θ/2。 n为单位向量。
    q = [cosα nsinα] = [cosα xsinα ysinα zsinα]

    q 的对数:log q = log([cosα nsinα]) ≡ [ 0 αn ]

    q 的指数:exp p = exp([ 0 αn ]) = [cosα n sinα]
    根据定义,exp p 总是返回单位四元数。

    与标量类似,四元数指数运算为对数运算的逆运算: exp(log q) = q

    四元数能与一个标量相乘:k q = k[w v ] = [kw kv ] = k[w (x y z)] = [kw kx ky kz]

  • 四元数求幂:
    已知对一个非零标量a,a^0 = 1, a^1 = a,当t从0变到1时,a^t从1到a。四元数求幂有类似的结论:当t从0变到1, q^t从[1, 0]到 q 。

    四元数 q 代表一个角位移,现在想要得到代表1/3这个角位移的四元数,可以这样计算: q^1/3。 q^2代表的角位移是 q 的两倍。

    假设q代表绕x轴顺时针旋转30度,那么q^2代表绕x轴顺时针旋转60度, q^-1/3代表绕x轴逆时针旋转10度。

    注意,四元数表达角位移时使用最短圆弧,不能"绕圈"。比如,对上述例子,q^4不是预期的绕x轴顺时针旋转240度,而是逆时针80度。所以(q^4)^1/2不是 q^2,一般,指数运算的代数公式,如(a^s)^t = a^(st),对四元数都不适用。

    公式:q^t = exp( t log q )

  • 四元数插值 – "slerp":
    slerp是球面线性插值的缩写(Spherical Linear Interpolation)。它可以在两个四元数间平滑插值。避免了欧拉角插值的所有问题。
    slerp有三个操作数。首先是两个四元数,将在它们两个间插值。开始和结束四元数设为q0和q1。插值参数设为t,t在0到1之间变化。slerp函数:slerp( q0, q1, t),将返回 q0到 q1之间的插值方位。

    理论上四元数插值的运算:


    也可以用此公式:


    ω是两个四元数的夹角,可以用四元数的点乘得到ω的cos值。

2016-11-27 22:54:25 niuge8905 阅读数 1158
  • Unity3D入门精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4729 人正在学习 去看看 张刚
	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;
    }
}
通过四元数得到欧拉角,最后结果


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

2016-06-14 02:49:21 woaini454186694 阅读数 2844
  • Unity3D入门精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4729 人正在学习 去看看 张刚

【3D计算机图形学】变换矩阵、欧拉角、四元数


旋转矩阵、欧拉角、四元数主要用于:向量的旋转、坐标系之间的转换、角位移计算、方位的平滑插值计算。


一、变换矩阵:

首先要区分旋转矩阵和变换矩阵:

旋转矩阵:向量绕某一个轴旋转,用3x3的矩阵表示。

变换矩阵:向量的移动、旋转、缩放,用4x4的矩阵表示。

这里额外补充一个知识,就是三维坐标变换是用4x4矩阵(采用齐次坐标)而不是3x3矩阵的原因是:统一平移和缩放(本来是向量加法来描述)为矩阵乘法的形式来计算。所以旋转矩阵也扩展为4x4矩阵,这样一来,平移矩阵、缩放矩阵、旋转矩阵可以相乘最后结果为一个唯一的变换矩阵。

可以参考下面这篇文章,解释的很清楚:

http://www.tuicool.com/articles/jMzuIfA


旋转矩阵的推导过程网上有很多,这里不再赘述。可以参考如下文章:

http://blog.csdn.net/ningyaliuhebei/article/details/7481679

http://blog.chinaunix.net/uid-25296429-id-5133776.html


二、欧拉角:

欧拉角的基本思想是将角位移分解为绕三个互相垂直轴的三个旋转组成的序列。所以,欧拉旋转的三个角,可以对应于三个旋转矩阵。

Yaw(偏航):欧拉角向量的y轴
Pitch(俯仰):欧拉角向量的x轴
Roll(翻滚): 欧拉角向量的z轴

Unity3D中,欧拉旋转是按照ZYX的顺序旋转的。(不同的旋转顺序最终得到的结果是不一样的,要引起重视)


三、四元数:

四元数的定义:

一个四元数可以表示为q = w + xi + yj + zk,现在就来回答这样一个简单的式子是怎么和三维旋转结合在一起的。为了方便,我们下面使用q = ((x, y, z),w) = (v, w),其中v是向量,w是实数,这样的式子来表示一个四元数。

我们先来看问题的答案。我们可以使用一个四元数q=((x,y,z)sinθ2, cosθ2) 来执行一个旋转。具体来说,如果我们想要把空间的一个点P绕着单位向量轴u = (x, y, z)表示的旋转轴旋转θ角度,我们首先把点P扩展到四元数空间,即四元数p = (P, 0)。那么,旋转后新的点对应的四元数(当然这个计算而得的四元数的实部为0,虚部系数就是新的坐标)为:

p′=qpq−1

其中,q=(cosθ2, (x,y,z)sinθ2) ,q−1=q∗N(q)

当然,四元数不仅可以用来方便的进行向量旋转计算,还能够用于平滑插值计算等。


四元数更多的介绍参看下面的链接;

http://www.cnblogs.com/mengdd/archive/2013/08/05/3238223.html


四、旋转矩阵、欧拉角、四元数比较:

下面的总结来源于网络:http://blog.csdn.net/pizi0475/article/details/6278526

任务/性质

旋转矩阵

欧拉角

四元数

在坐标系间(物体和惯性)旋转点

不能(必须转换到矩阵)

不能(必须转换到矩阵)

连接或增量旋转

能,但经常比四元数慢,小心矩阵蠕变的情况

不能

能,比矩阵快

插值

基本上不能

能,但可能遭遇万向锁或其他问题

Slerp提供了平滑插值

易用程度

在内存或文件中存储

9个数

3个数

4个数

对给定方位的表达方式是否唯一

不是,对同一方位有无数多种方法

不是,有两种方法,它们互相为互

可能导致非法

矩阵蠕变

任意三个数都能构成合法的欧拉角

可能会出现误差积累,从而产生非法的四元数

不同的方位表示方法适用于不同的情况。下面是我们对合理选择格式的一些建议:

欧拉角最容易使用。当需要为世界中的物体指定方位时,欧拉角能大大的简化人机交互,

包括直接的键盘输入方位、在代码中指定方位(如为渲染设定摄像机)、在调试中测试。这个优点不应该被忽视,不要以”优化”为名义而牺牲易用性,除非你去顶这种优化的确有效果。

如果需要在坐标系之间转换响亮,那么就选择矩阵形式。当然,这并不意味着你就不能用其他格式来保存方位,并在需要的时候转换到矩阵格式。另一种方法是用欧拉角作为方位的”主拷贝”但同时维护一个旋转矩阵,当欧拉角发生改变时矩阵也要同时进行更新。

当需要大量保存方位数据(如:动画)时,就使用欧拉角或四元数。欧拉角将少占用25%的内存,但它在转换到矩阵时要稍微慢一些。如果动画数据需要嵌套坐标系之间的连接,四元数可能是最好的选择。

平滑的插值只能用四元数完成。如果你用其他形式,也可以先转换到四元数然后再插值,插值完毕后再转换回原来的形式。


五、欧拉角与四元数的转换:

参看下面一篇文章,讲的比较通俗易懂:

http://www.cnblogs.com/wqj1212/archive/2010/11/21/1883033.html


六、Unity3D中变换矩阵(平移、缩放、旋转)、欧拉角、四元数有关的类和相互之间的转换:

Quaternion:四元数类。

Matrix4x4:变换矩阵类。

Vector3:欧拉角用此表示就可以了。


四元数转欧拉角:

public Quaternion rotation = Quaternion.identity;
print(rotation.eulerAngles.x);
print(rotation.eulerAngles.y);
print(rotation.eulerAngles.z);


欧拉角转四元数:

public Quaternion rotation = Quaternion.Euler(0, 30, 0);//Euler方法即通过一个Vector3的欧拉角返回一个四元数

四元数转变换矩阵:

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)); 


2019-05-18 17:16:19 zhoudonghao4381 阅读数 82
  • Unity3D入门精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4729 人正在学习 去看看 张刚

U3D 欧拉角和四元数的关系

1.两者相互转换:
四元数转化成欧拉角 Vector3 v3=transform.rotation.eulerAngles;
欧拉角转换成四元数 Quaternion rotation = Quaternion.Euler(v3);

2.四元数乘以一个向量:
作用:四元数和向量相乘表示这个向量按照这个四元数进行旋转之后得到的新的向量。
比如:向量vector3(0,0,10),绕着Y轴旋转90度,得到新的向量是vector3(10,0,0)。

在unity中表示为:
在这里插入图片描述
结果为:
在这里插入图片描述

没有更多推荐了,返回首页