1. 程式人生 > >unity矩陣運算,數學計算

unity矩陣運算,數學計算

1. 官方文件

Mathf   https://docs.unity3d.com/ScriptReference/Mathf.html

Matrix4x4 https://docs.unity3d.com/ScriptReference/Matrix4x4.html

Vector3  https://docs.unity3d.com/ScriptReference/Vector3.html

 

2, https://www.cnblogs.com/jiahuafu/p/5981578.html

void Start () {
         
        Vector3 pos = new Vector3(7,8,9);
        Quaternion q = Quaternion.identity;
        q.eulerAngles = new Vector3(0, 0, 0);
        Vector3 s = new Vector3(1,2,3);

        Matrix4x4 m1 = Matrix4x4.TRS(pos, q, s);

        Debug.Log(m1);

    }

1.00000 0.00000 0.00000 7.00000

0.00000 2.00000 0.00000 8.00000
0.00000 0.00000 3.00000 9.00000
0.00000 0.00000 0.00000 1.00000

 

1

q.eulerAngles = new Vector3(0, 90, 0);

 

0.00000 0.00000 3.00000 7.00000
0.00000 2.00000 0.00000 8.00000
-1.00000 0.00000 0.00000 9.00000
0.00000 0.00000 0.00000 1.00000

 

 

 

1

q.eulerAngles = new Vector3(0, 180, 0);

  

-1.00000 0.00000 0.00000 7.00000
0.00000 2.00000 0.00000 8.00000
0.00000 0.00000 -3.00000 9.00000
0.00000 0.00000 0.00000 1.00000

 

 

 

 

 

 

http://www.cnblogs.com/wywnet/p/3585075.html
 

Vector3: 

Unity3D中Vector3類定義(只寫有用的): 

屬性: 

x,y,z                表示一個空間向量。 

this                       用於訪問x,y,z三個資料使用陣列的方式訪問,比如[0][1][2] 

normalized            返回單位化向量後的值(只讀)。單位化向量是個很重要的概念,他常常是各種計算的基點,他保證了在不改變方向的前提下,使向量長度變為1。公式如下: 

                                                                

magnitude              返回向量長度值(只讀),這詞取得真怪,反正就是向量的模運算,得到向量的長度。公式就是x平方+y平方+z平方然後根號便是。這都不記得了趕緊回家面壁。 

sqrmagnitude         返回向量的平方長度(只讀)。上面那個不開根號就是了。 

 

方法: 

Scale(a:vector3,b:vector3):vertor3  縮放,返回a的每個座標乘以b的相對應的每個座標。注意他是靜態函式。 

Normalize() 向量化,注意magnitude向量長度會變為1. 

 

類特有的一些屬性(直接粘help的了): 

zero      Shorthand for writing Vector3(0, 0, 0) 

one       Shorthand for writing Vector3(1, 1, 1) 

forward   Shorthand for writing Vector3(0, 0, 1) 

up        Shorthand for writing Vector3(0, 1, 0) 

right     Shorthand for writing Vector3(1, 0, 0) 

 

Maxtrix4*4: 

矩陣也是3D圖形學一個重要的概念,在D3D裡用的很平凡,但是U3D裡好像都已經封裝到各個Object上去了,所以很容易忽視掉,但不能忽視它的存在。在3D世界裡,每個物體均有自身的世界矩陣,攝像機有攝像機矩陣,投影場景有projection矩陣,對頂點、向量、物體實施各種平移、旋轉、縮放都是通過矩陣來完成的。計算機3D物體的標準4×4矩陣是這樣定義的:(表示不出來矩陣大括號,請讀者就當左4行的[和右4行的]當成一對大括號) 

                  [ x,  y  ,z  ,0]    <-  物體的右方向向量 

                  [ x,  y  ,z  ,0]    <-  物體的上方向向量 

                  [ x,  y  ,z  ,0]    <-  物體的前方向向量 

                  [ x,  y  ,z  ,1]    <-  物體所在的座標 

注意:前三行的座標一定是互有90度的,(除非特殊情況,例如空間扭曲之類的=.=)因為他們是物體的三個座標軸。第四列的 0 0 0 1 是為了補齊4*4矩陣,為了計算方便而已。 

矩陣一樣有單位矩陣和0矩陣, 

[1 0 0] 

[0 1 0]   其他的我就不說了,在Unity裡頭是完全封裝的(見Transform) 

[0 0 1] 

 

Transform: 

這個就是U3D所封裝的矩陣運算了,用於縮放,平移,還有定位(這個囧,他把矩陣給放這用了,所有物體都可以用transform型別來存放)。Transform所實現的功能不過就是物體矩陣的運算罷了,具體如下: 

 

Variables 

position                    Vector3型別,物體位置,相對於世界座標系的值。就是矩陣的最後一行的值。 

localPosition             Vector3型別,物體相對於父元素的位置. 

eulerAngles              Vector3型別,旋轉後的尤拉角相對世界座標的值。簡單理解為各向量座標所轉動的值就好了。 

localEulerAngles      Vector3型別,相對父元素的尤拉角。 

right                        Vector3型別,表示x軸(U3裡紅色的軸)方向的單位向量。 

up                           Vector3型別,表示y軸(U3裡綠色的軸)方向的單位向量。 

forward                   Vector3型別,表示z軸(U3裡藍色的軸)方向的單位向量。 

rotation                   Quaternion型別(quatermion就是個四維數,比vector3多一個w變量表示旋轉角度的),世界座標旋轉。. 

localRotation           Quaternion型別,本地座標的旋轉度數(相對父元素)。 

localScale                Vector3型別,相對本地座標系縮放(就是矩陣的乘法) 

parent                      Transform型別,他的父元素。 

worldToLocalMatrix  Matrix4*4型別,把一個點從世界座標系的位置轉換為本地座標系位置。(終究得用矩陣,哈哈)只讀 

localToWorldMatrix  Matrix4*4型別,把一個點從本地座標系轉換為世界座標系。(只讀) 

root                          Transform型別,返回最上層的那個Transform,就是他父親的父親的父親的。。。(如果有的話) 

childCount                int型,你子元素的數量。。。 

lossyScale                Vector3型別,相對世界座標系縮放。 

 

Functions 

Translate (translation : Vector3, relativeTo : Space=Space.Self) : void   平移物體,space可以是Self和World,這個不用說了吧 

Rotate (eulerAngles : Vector3, relativeTo : Space = Space.Self) : void  繞尤拉角度的向量旋轉 

RotateAround (point : Vector3, axis :Vector3, angle : float) : void  點point按axis的軸旋轉angle度 

LookAt (target : Transform, worldUp :Vector3 ) : void 讓這個物體的z軸面向target物體 

TransformDirection (direction : Vector3) : Vector3  將direction從本地座標轉換為世界座標 

InverseTransformDirection (direction : Vector3): Vector3  將derection從世界座標轉換為本地座標 

TransformPoint (position :Vector3): Vector3  同理 

InverseTransformPoint (position : Vector3) : Vector3 

DetachChildren () : void    解除所有子物件 

Find (name : string) : Transform   按名字尋找並返回子物件 

IsChildOf (parent : Transform) : bool   看他是不是別人的子物件 

 

unity3D裡面的點乘和叉乘

 

在unity3D裡面。兩個向量的點乘所得到的是兩個向量的餘弦值,也就是-1 到1之間,0表示垂直,-1表示相反,1表示相同方向。

兩個向量的叉乘所得到的是兩個向量所組成的面的垂直向量,分兩個方向。

 

簡單的說,點乘判斷角度,叉乘判斷方向。

形象的說當一個敵人在你身後的時候,叉乘可以判斷你是往左轉還是往右轉更好的轉向敵人,點乘得到你當前的面朝向的方向和你到敵人的方向的所成的角度大小。