`vector3.angle(vector3 from,vector3 to)`使用的認知

vector3.Angle(vector3 from,vector3 to)

這個方法的意圖是求from向量與to向量之間的夾角,並且此夾角的大小爲兩者之間的銳角,所以,不管什麼情況,這個函數返回的值都不可能大於180;
使用這個函數進行控制主角旋轉時可以很簡單地實現旋轉到指定的位置。但是 有一個問題,在以下的代碼中,這個函數求得的值,總是在預料之外抖動,如此導致了遊戲物體的旋轉不可控值;

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {
    //此腳本用來設計主角的行走、動畫播放等
    private Animator anim;
    private float maxBlend = 5.6f;//最大混合度
    public float moveSpeed = 6;//平滑起步速率
    public float angleSpeed = 5;//旋轉阻尼
    // Use this for initialization
    void Start() {
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update() {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        if (Mathf.Abs(h) > 0.1f || Mathf.Abs(v) > 0.1f)
        {
            //速度的混合要慢慢地從小變化到大,這樣纔會呈現出慢慢起跑的感覺,不至於顯得突兀
            float newSpeed= Mathf.Lerp(anim.GetFloat("Speed"), maxBlend, Time.deltaTime * moveSpeed);
            anim.SetFloat("Speed", newSpeed);
            //接下來控制動畫的旋轉
            print("h:" + h);
            print("v:" + v);
            Vector3 taget = new Vector3(h, 0, v);
            Vector3 now = transform.forward;
            float angle = Vector3.Angle(now, taget);
            print("angle:" + angle);
            if (angle < 30)//因爲這個角度總是不自覺的有一個跳動,即使目的方向與當前方向實際是處於同一個方向的,也會發生跳動,所以用此方法來屏蔽掉不必要的跳動
            {
                angle = 0;
            }
            transform.Rotate(Vector3.up * angle);
        }
        else
        {
            anim.SetFloat("Speed", 0);
        }

    }
}

執行結果爲:
這裏寫圖片描述
這個便是執行結果,可以發現,當只有v值變化,h值沒有變化,此時要按邏輯來說,目的旋轉方向與當前遊戲物體的方向是一致的,求得的角度值應該爲0。但事實上角度值卻爲0.1701,即有一個抖動值,我猜想該抖動值應該是由於角色在移動時,自身的晃動導致的,因爲我勾選了applay root motion,所以動畫移動的位移都會作用到transform組建中,導致了晃動。故而,我添加了一種方法來忽略這種晃動

if (angle < 30)//因爲這個角度總是不自覺的有一個跳動,即使目的方向與當前方向實際是處於同一個方向的,也會發生跳動,所以用此方法來屏蔽掉不必要的跳動
            {
                angle = 0;
            }

就是這個。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章