2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

Unity3D---詳解 Quaternion類之一

 雪柳花明 2016-09-06


原地址來源:http://www.cnblogs.com/tgycoder/p/5103966.html

一、簡介

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

四元數(shù)

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

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

二、Quaternion類屬性

eulerAngles-歐拉角

定義

public Vector3 eulerAngles{get;set;}

如何改變一個游戲?qū)ο笮霓D(zhuǎn)狀態(tài),我們可以通過改變其Transform進(jìn)行歐拉角的變換次序,例如假設(shè)p(x,y,z)是游戲?qū)ο笊系囊粋€點(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)過程是很簡單的,一句代碼就可以搞定。但是具體的實(shí)現(xiàn)過程確實(shí)很復(fù)雜的,詳情請閱讀3D游戲與計算機(jī)圖形學(xué)中的數(shù)學(xué)方法-變換。

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

using UnityEngine;
using System.Collections;

public class EulerAngler_ts : MonoBehaviour {

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

/// <summary>
/// TVector3.zero
/// 寫Vector3(0, 0, 0)的簡碼。
/// </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í)例對象賦值給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)建一個從formDirection到toDirection的Quaternion實(shí)例。

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

可以將GameObject對象進(jìn)行如下變換:首先將GameObject對象自身坐標(biāo)系的x,y,z軸方向和世界坐標(biāo)系的x,y,z軸方向一致,然后將GameObject對象自身坐標(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的朝向,因為當(dāng)transform.forward和transform.right方向確定后,transform.up的方向總會與V2的方向的夾角小于或等于90度。

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

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

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對象的rotation從Quaternion.identity狀態(tài)變換到當(dāng)前狀態(tài),只需要將GameObject對象繞著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類(二)------------------------------------------------------------------------------------------------

 

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多