1. 程式人生 > >Unity3D學習筆記(五):坐標系、向量、3D數學

Unity3D學習筆記(五):坐標系、向量、3D數學

幾何 學習筆記 縮放 png 加載 改變 object 物理 銷毀

Unity復習

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Question : MonoBehaviour {
    int a = 100;
    Transform target;
    #region Question
    // 1、有哪些事件函數
    // Awake Start Update FixedUpdate LateUpdate OnEnable OnDisable OnDestroy OnGUI
    // OnCollisionEnter(Collision col) OnCollisionStay(Collision col) OnCollisionExit(Collision col)
    
// OnTriggerEnter(Collider o) OnTriggerStay(Collider o) OnTriggerExit(Collider o) // 2、如何查找場景中遊戲物體 // GameObject obj = GameObject.Find("ObjName/ChildObjName") // 3、將自己設置為 找到的那個遊戲物體的 父物體 // obj.transform.parent = transform; // 4、掛載腳本的必要條件 // 繼承MonoBehaviour 、所有的代碼無錯誤、文件名和類名一致、不能是抽象類
// 5、物體的移動、旋轉 // 改變位置的移動 // 1)、往世界的前方移動 // transform.position += Vector3.forward; // 2)、往自身的前方移動 // transform.position += transform.forward; // API移動 // 1)、往世界的前方移動 // transform.Translate(Vector3.forward, Space.World); // 2)、往自身的前方移動 // transform.Translate(transform.forward, Space.World);
// transform.Translate(Vector3.forward, Space.Self); // 使物體旋轉 (自身) // 改變歐拉角的形式 來旋轉 // 世界的Y軸轉 // transform.eulerAngles += Vector3.up; // 自身的Y軸轉 // transform.eulerAngles += transform.up; // API // 世界的Y軸轉 // transform.Rotate(Vector3.up, Space.World) // 自身的Y軸轉 // transform.Rotate(transform.up, Space.World) // transform.Rotate(Vector3.up) // 使物體旋轉 (繞其他物體) // GameObjet obj; (被繞的遊戲物體) // 繞Y軸轉(世界的) // transform.RotateAround(obj.transform.position, Vector3.up, 1); // 繞Y軸轉(被繞的遊戲物體) // transform.RotateAround(obj.transform.position, obj.transform.up, 1); // 6、如何生成、銷毀遊戲物體? // 生成(需要有預制體) BulletPrefab // public GameObject bulletPrefab; // 引用資源中的預制體 // Transform spawnTrans; // 生成的位置及方位 // Instantiate(bulletPrefab, spawnTrans.position /*位置 Vector3*/, Quaternion.identity /*spawnTrans.rotation*/ /*方位 Quaternion*/) // 銷毀 // 不要循環調用 // 銷毀當前的腳本組件 // 銷毀的時機: 在 Update 之後,渲染之前 // Destroy(this); // 銷毀當前的遊戲物體 // Destroy(gameObject); // 5秒以後銷毀 當前腳本組件 // Destroy(this, 5); // 7、物體之間發生碰撞的必要條件 // 1)、雙方都必須有碰撞器 2)、至少有一個非休眠的剛體 3)、如果一方是運動學剛體,另一個必須是非運動學剛體 // 觸發的事件函數 雙方的 // OnCollisionEnter(Collision col) OnCollisionStay(Collision col) OnCollisionExit(Collision col) // 如果勾選了 IsTrigger 會? 在所有的 Collider上 // 會變成觸發器,不會再有碰撞效果了 // 什麽情況下會觸發 觸發器 // 1)雙方都有碰撞器,至少有一方勾選了IsTrigger 2)、至少有一個有剛體 // 觸發的事件函數 雙方的 // OnTriggerEnter(Collider o) OnTriggerStay(Collider o) OnTriggerExit(Collider o) #endregion // Use this for initialization void Start () { Destroy(this); a = 200; } // Update is called once per frame void Update () { } }

發生碰撞(觸發)的必要條件

技術分享圖片

3D數學 3D數學:利用數學的方式解決計算機幾何的問題。 坐標系: 一維坐標系(線性坐標系):線性變化 二維坐標系(笛卡爾2D坐標系):笛卡爾發明的 坐標點的分量,代表坐標點距離軸的距離(相當於軸的偏移量) 三維坐標系 標量:只有大小 矢量:大小和方向,坐標系(向量),物理學(力) 向量: 概念:有大小有方向的矢量放在坐標系中就可以稱之為向量。 特點:沒有位置的概念,放在哪都是這個向量(僅表示方向和大小,可以平行移動)。 兩個坐標系相加無意義 兩個坐標系相減:A(3,1) - B(2,0) = c(3-2,1-0) = c(1,1) 坐標大寫,向量小寫 數學計算:各分量分別相減 幾何意義:得到的是一個新的向量,這個向量由B點指向A點,大小是A點和B點之間的距離。 向量方向:從減數指向被減數 坐標和向量相加:A(1,1) + b(1,1) = C(2,2) 數學計算:各分量分別相加 幾何意義:得到的是一個新的坐標位置,由A坐標點,沿著b向量的方向,移動b向量的長度的距離,得到的新坐標。 A坐標,沿著b向量的方向,移動b向量的長度,得到C坐標 向量和向量相加有意義 向量和向量相加:a(1,1) + b(2,1) = c(3,2) 數學計算:各分量分別相加 幾何意義:得到的是一個新的向量,讓ab向量首尾相連,得到c向量,從a向量的起點指向b向量的終點。 向量相加,平形四邊形的對角線 坐標:transform,position 向量:new Vector3(0,0,1)或Vector3.forward 技術分享圖片 向量和向量相減:a(1,1) - b(1,-1) = c(0,2) 數學計算:各分量分別相減 幾何意義:得到的是一個新的向量,讓ab向量起點重合,得到c向量,從減數向量的終點指向被減數向量的終點。 已知入射光線l,和法向量n,求反射光線r。r = l + 2n 向量和標量相乘:a(1,1) * 2 = c(2,2) 數學計算:標量分別乘以各分量 幾何意義:得到的是一個新的向量,讓原向量在原有方向的基礎上,讓原向量進行了標量倍數的縮放。 勾股定理:直角三角形中,斜邊的平方等於兩條直角邊的平方和。 向量的各分量有什麽幾何意義:描述這個向量在各個軸向上的投影的長度 向量的模(模長):向量的長度,向量的各分量的平方和再開方 零向量(0,0,0):長度為0,方向任意(模長為零,沒有方向) 單位向量:模長為1的向量叫單位向量。 用單位向量表示方向,用標量表示速度,用標量的縮放可以控制速度。 向量的標準化:把一個非單位向量變成一個單位向量 讓這個向量的各分量分別除以模長(根號2=1.414 根號3=1.732 根號5=2.236) 不是單位向量的向量讓各分量分別除以這個向量的模長,就變成了原有方向不變的單位向量。 我們把不是單位向量的向量變成單位向量的過程叫向量的標準化。 向量的標準化後的模長為1 復雜寫法 技術分享圖片

簡單寫法,用normalized函數

技術分享圖片

作業1:Normalized和normalized區別 共同點:實現規範化,讓一個向量保持相同的方向,但它的長度為1.0,如果這個向量太小而不能被規範化,一個零向量將會被返回。 不同點: Vector3.normalized的特點是改變當前向量,也就是當前向量長度是1 Vector3.Normalized的特點是當前向量是不改變的並且返回一個新的規範化的向量; magnitude:取標準化後的模長 技術分享圖片 負向量:讓一個向量* -1,得到一個新的向量,新的向量和原向量互為負向量(成對出現)。 向量和向量的乘法: 點乘(內積) 叉乘(外積) transform.Translate(Vector3 dir , Space space):同理適用於transform.Rotate() 1、當第一個參數是Vector3.forward的時候,第二個參數如果不填或者填self,結果是沿著自身的前方移動;如果填world,結果是沿著世界的前方移動 2、當第一個參數是Transform算出來的時候,第二個參數必須填world,否則就亂了 這樣寫會轉兩次方向 技術分享圖片 作業2:做一個第一人稱視角漫遊,加個攝像機 Unity場景切換 同步加載(當前場景會卡主)和異步加載(加載新的場景,不阻塞當前場景的運行) 新建兩個場景 技術分享圖片 1、把需要切換的場景全部添加到Build Setting 2、添加命名空間using UnityEngine.SceneManagement;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;   // 場景管理
public class MenuControl : MonoBehaviour {
    public float w = 100;
    public float h = 50;
       // Use this for initialization
       void Start () {
              
       }
       
       // Update is called once per frame
       void Update () {
              
       }
    void OnGUI()
    {
        //  w h    Sceen.Width Sceen.Height       x =  (Screen.width - w)/2    y = (Screen.height - h)/2
        float x = (Screen.width - w) / 2;
        float y = (Screen.height - h) / 2;
        if (GUI.Button(new Rect(x, y, w, h), "開 始 遊 戲"))
        {
            // 切換到 遊戲場景    同步加載(當前場景會卡主)   異步加載(不會阻塞當前場景的運行)
            SceneManager.LoadScene("GameScene");//可以添加Build Setting裏的字符串
        }
        if(GUI.Button(new Rect(x, y + 2 * h, w, h), "退 出 遊 戲"))
        {
            Application.Quit();  // 退出遊戲 發布以後才有作用 編輯器狀態無效
        }
    }
}

Unity3D學習筆記(五):坐標系、向量、3D數學