乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Unity3D---詳解 Quaternion類之一

       雪柳花明 2016-09-06


      原地址來(lái)源:http://www.cnblogs.com/tgycoder/p/5103966.html

      一、簡(jiǎn)介

      Quaternion又稱四元數(shù),由x,y,z和w這四個(gè)分量組成,是由愛爾蘭數(shù)學(xué)家威廉·盧云·哈密頓在1843年發(fā)現(xiàn)的數(shù)學(xué)概念。四元數(shù)的乘法不符合交換律。從明確地角度而言,四元數(shù)是復(fù)數(shù)的不可交換延伸。如把四元數(shù)的集合考慮成多維實(shí)數(shù)空間的話,四元數(shù)就代表著一個(gè)四維空間,相對(duì)于復(fù)數(shù)為二維空間。

      四元數(shù)

      關(guān)于四元數(shù)的性質(zhì)、與旋轉(zhuǎn)的關(guān)系、球型線性插值的介紹,請(qǐng)閱讀3D游戲與計(jì)算機(jī)圖形學(xué)中的數(shù)學(xué)方法-四元數(shù),在此不多做介紹。下面主要介紹的是Unity中的四元數(shù)-Quaternion。

      在Unity中,用Quaternion來(lái)存儲(chǔ)和表示對(duì)象的旋轉(zhuǎn)角度。Quaternion的變換比較復(fù)雜,對(duì)于GameObject一般的旋轉(zhuǎn)及移動(dòng),可以用Transform中的相關(guān)方法實(shí)現(xiàn)。

      二、Quaternion類屬性

      eulerAngles-歐拉角

      定義

      public Vector3 eulerAngles{get;set;}

      如何改變一個(gè)游戲?qū)ο笮霓D(zhuǎn)狀態(tài),我們可以通過(guò)改變其Transform進(jìn)行歐拉角的變換次序,例如假設(shè)p(x,y,z)是游戲?qū)ο笊系囊粋€(gè)點(diǎn),繞x軸旋轉(zhuǎn)a角,繞y軸旋轉(zhuǎn)b角,繞z軸旋轉(zhuǎn)c角,這樣就可以得到旋轉(zhuǎn)之后的狀態(tài)p'(x',y',z')。Unity的實(shí)現(xiàn)過(guò)程是很簡(jiǎn)單的,一句代碼就可以搞定。但是具體的實(shí)現(xiàn)過(guò)程確實(shí)很復(fù)雜的,詳情請(qǐng)閱讀3D游戲與計(jì)算機(jī)圖形學(xué)中的數(shù)學(xué)方法-變換。

      下面給出一個(gè)例子,演示一下如何使用歐拉角。

      using UnityEngine;
      using System.Collections;

      public class EulerAngler_ts : MonoBehaviour {

      public Transform A, B;
      /// <summary>
      /// Quaternion.identity
      /// 同一性旋轉(zhuǎn)(只讀)。該四元數(shù),相當(dāng)于"無(wú)旋轉(zhuǎn)":這個(gè)物體完全對(duì)齊于世界或父軸。
      /// </summary>
      Quaternion rotations = Quaternion.identity;

      /// <summary>
      /// TVector3.zero
      /// 寫Vector3(0, 0, 0)的簡(jiǎn)碼。
      /// </summary>
      Vector3 eulerAngle = Vector3.zero;
      float speed = 10.0f;
      float tSpeed = 0.0f;
      // Use this for initialization
      void Start () {

      }

      // Update is called once per frame
      void Update () {
      tSpeed += speed * Time.deltaTime;
      //第一種方式:將Quaternion實(shí)例對(duì)象賦值給transform的rotation
      rotations.eulerAngles = new Vector3(0.0f, tSpeed, 0.0f);
      A.rotation = rotations;


      //第二種方式:將三位向量代表的歐拉角直接賦值給transform的eulerAngle
      B.eulerAngles = new Vector3(0.0f, tSpeed, 0.0f);
      }
      }

      三、Quaternion類實(shí)例方法

      1、SetFromToRotation方法-創(chuàng)建rotation實(shí)例

      1.1 函數(shù)原型

      public void SetFromToRotion(Vector3 fromDirection,Vector3 toDirection);

      可以創(chuàng)建一個(gè)從formDirection到toDirection的Quaternion實(shí)例。

      Quaternion q = Quaternion.identity;
      q.SetFromToRotation(v1,v2);
      transform.rotation = q;

      可以將GameObject對(duì)象進(jìn)行如下變換:首先將GameObject對(duì)象自身坐標(biāo)系的x,y,z軸方向和世界坐標(biāo)系的x,y,z軸方向一致,然后將GameObject對(duì)象自身坐標(biāo)系中向量V1指向的方向旋轉(zhuǎn)到V2方向。

      1.2 PS:不可以直接使用transform.rotation.SetFromToRotation(v1,v2)方式進(jìn)行設(shè)置,只能將實(shí)例化的Quaternion復(fù)制給transform.rotation。

      1.3 實(shí)例演示

      復(fù)制代碼
      using UnityEngine;
      using System.Collections;
      
      public class SetFromToDirection_ts : MonoBehaviour {
          public Transform A, B, C;
          Quaternion q = Quaternion.identity;
          // Use this for initialization
          void Start () {
          
          }
          
          // Update is called once per frame
          void Update () {
      
              q.SetFromToRotation(A.position, B.position);
              C.rotation = q;
              Debug.DrawLine(Vector3.zero, A.position, Color.red);
              Debug.DrawLine(Vector3.zero, B.position, Color.green);
              Debug.DrawLine(C.position, C.position + new Vector3(0.0f, 1.0f, 0.0f), Color.black);
              Debug.DrawLine(C.position, C.TransformPoint(Vector3.up * 1.5f), Color.yellow);
          }
      }
      復(fù)制代碼

      運(yùn)行結(jié)果如下圖所示:

      2、SetLookRotation方法-設(shè)置Quaternion實(shí)例的朝向

      2.1 函數(shù)原型

      public void SetLookRotation(Vector3 view);
      public void SetLookRotation(Vector3 view,Vector3 up);

      例如:

      Quaternion q = Quaternion.identity;
      q.SetLookRotation(v1,v2);
      transform.rotation = q;

      transform.forward方向與V1方向相同。

      transform.right垂直于由Vector3.zer0、V1和V2這3點(diǎn)構(gòu)成的平面。

      V2決定了transform.up的朝向,因?yàn)楫?dāng)transform.forward和transform.right方向確定后,transform.up的方向總會(huì)與V2的方向的夾角小于或等于90度。

      當(dāng)V1為Vector3.zero時(shí),方法失效。

      2.2 PS:同上,不要直接使用transform.rotation.SetLookRotation(v1,v2)的方式來(lái)實(shí)例化Quaternion對(duì)象。

      2.3 實(shí)例演示

      復(fù)制代碼
      using UnityEngine;
      using System.Collections;
      
      public class SetLookRotation_ts : MonoBehaviour {
      
          public Transform A, B, C;
          Quaternion q = Quaternion.identity;
          // Use this for initialization
          void Start()
          {
      
          }
      
          // Update is called once per frame
          void Update()
          {
      
              q.SetLookRotation(A.position, B.position);
              C.rotation = q;
              Debug.DrawLine(Vector3.zero, A.position, Color.red);
              Debug.DrawLine(Vector3.zero, B.position, Color.green);
              Debug.DrawLine(C.position, C.TransformPoint(Vector3.right * 1.5f), Color.black);
              Debug.DrawLine(C.position, C.TransformPoint(Vector3.forward * 1.5f), Color.yellow);
      
              Debug.Log("C.right與A的夾角: " + Vector3.Angle(C.right, A.position));
              Debug.Log("C.right與B的夾角: " + Vector3.Angle(C.right, B.position));
              Debug.Log("C.up與B的夾角: " + Vector3.Angle(C.up, B.position));
          }
      }
      復(fù)制代碼

      運(yùn)行結(jié)果

          

      3、ToAngleAxis方法

      3.1 函數(shù)原型

      public void ToAngleAxis(out float angle,out Vector3 axis);

      參數(shù)angle為旋轉(zhuǎn)角,參數(shù)axis為軸向量。

      該函數(shù)可以實(shí)現(xiàn)將GameObject對(duì)象的rotation從Quaternion.identity狀態(tài)變換到當(dāng)前狀態(tài),只需要將GameObject對(duì)象繞著axis軸(世界坐標(biāo)系)旋轉(zhuǎn)angle角度即可。

      3.2 實(shí)例演示

      復(fù)制代碼
      using UnityEngine;
      using System.Collections;
      
      public class ToAngleAxis_ts : MonoBehaviour {
          public Transform A, B;
          float angle;
          Vector3 axis = Vector3.zero;
          float xSpeed = 0.0f, ySpeed = 0.0f, zSpeed = 0.0f;
          // Use this for initialization
          void Start () {
          
          }
          
          // Update is called once per frame
          void Update () {
              xSpeed += 0.5f * Time.deltaTime;
              ySpeed += 1.0f * Time.deltaTime;
              zSpeed += 2.5f * Time.deltaTime;
              A.eulerAngles = new Vector3(xSpeed, ySpeed, zSpeed);
              //獲取A的rotation的旋轉(zhuǎn)軸和角度
              A.rotation.ToAngleAxis(out angle, out axis);
              //設(shè)置B的rotation,使得B的rotation和A相同
              B.rotation = Quaternion.AngleAxis(angle, axis);
          }
      }
      復(fù)制代碼

      ---------------------------------------------------------------------------------------------第二部分Unity3D - 詳解Quaternion類(二)------------------------------------------------------------------------------------------------

       

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多