Unity如何實現在球表面移動並朝向一目標點(一)


在球面上運動並始終朝向球面上一點,就好像在人地球上始終朝向北極的原理一樣。
首先我們在球面上運動,UP方向必須要設置好,我們可以獲得物體在球面上運動是所在的點(即鼠標點擊位置),求出這個位置在球面上的法線向量,即是UP方向。

然后我們通過找到該點所在的切面,從中找到朝向目標點的切線,這條切線就是我們所需要的正方向。通過叉乘我們能獲得物體、目標點、球心共同組成的切面的法線,將該發現與之前的球面上的法線進行叉乘運算可求得(對叉乘不理解的小伙伴可以查詢“向量叉乘”)
最后我們在改變方向上給物體一個父級的空對象,用於確定UP軸方向,而物體本身用來確定水平方向(以自身坐標系來看),以防止改變正方向時UP方向偏移或者改變UP方向是正方向偏移。
代碼如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveOnSphere : MonoBehaviour {
    public GameObject sphere;
    public GameObject target;
	// Use this for initialization
    
	void Start () {
        if (sphere == null)
		{
            Debug.Log("球為空");
            return;
		}       
	}	
	// Update is called once per frame
	void Update () {
        if (Input.GetMouseButton(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, 1000, 1 << 8))//8層,球的層級
            {          
				//膠囊體在一個父級空對象下
                transform.parent.position = hit.point;
				
                //計算球上一點的法線向量
                Vector3 normal = transform.position-sphere.transform.position;
				
				//球心到目標點的向量
                Vector3 SphereToTarget = target.transform.position - sphere.transform.position;
				
				//計算次法線的向量(即與切線和法線所在平面垂直的向量)
                Vector3 binormal = Vector3.Cross(normal,SphereToTarget).normalized;
				
				//計算出指向目標物的切線向量
                Vector3 tangent = Vector3.Cross(binormal,normal);
				
				//計算父級的前方向和目標切線的角度
                float angle = Vector3.Angle(transform.parent.forward,tangent);
				
				//膠囊體旋轉相反的角度對准目標物體
                transform.localEulerAngles = new Vector3(0,-angle,0);
				
				//將UP向量朝向法線
                transform.parent.up = normal;
                
            }
        }
	}
}
在朝向問題經檢驗有些BUG,在下一章會詳細闡述並修改!!見諒
下一章文章已發出,鏈接: http://blog.csdn.net/yibo798757741/article/details/78196554

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com