Unity基礎-Transform

任何游戲對象在創建的時候都會附帶Transform組件,用于儲存并操控物體的位置、旋轉和縮放。

并且該組件是無法刪除的。

Transform面板一共包含3個屬性:

Position:位置

Rotation:旋轉

Scale:(縮放)

可修改對象的位置、旋轉方式、縮放數值

position;世界坐標系位置

localPosition;本地坐標系位置

縮放

localScale;自身縮放

lossyScale;全局縮放

旋轉

transform.rotation;世界坐標系旋轉

transform.localRotation;本地坐標系旋轉

transform.eulerAngles;世界坐標系旋轉

transform.localEulerAngles;本地坐標系旋轉

歐拉角

構件在三維空間中的有限轉動,可依次用三個相對轉角表示這三個轉角統稱為歐拉角。

unity中的歐拉角有兩種方式可以解釋:

1,當認為順序是yxz時(其實就是heading - pitch - bank),是傳統的歐拉角變換,也就是以物體自己的坐標系為軸的。

2,當認為順序是zxy時(roll - pitch - yaw),也是官方文檔的順序時,是以慣性坐標系為軸的。后者比較直觀一些,但其實兩者的實際效果是一樣的,只是理解不一樣。

歐拉角有兩種:

靜態:即繞世界坐標系三個軸的旋轉,由于物體旋轉過程中坐標軸保持靜止,所以稱為靜態。

動態:即繞物體坐標系三個軸的旋轉,由于物體旋轉過程中坐標軸隨著物體做相同的轉動,所以稱為動態。

使用動態歐拉角會出現萬向鎖現象;靜態歐拉角不存在萬向鎖的問題

正常狀態:三個獨立的旋轉軸

萬向鎖:一旦選擇±90°作為pitch角,就會導致第一次旋轉和第三次旋轉等價,整個旋轉表示系統被限制在只能繞豎直軸旋轉,丟失了一個表示維度。

萬向節死鎖會導致位置上連續變化,在數值表示上確是非連續的。給定的兩個關鍵幀之間無法平滑過渡。解決方法:可以使用四元數球面線性插值

四元數

愛爾蘭數學家William hamilton一直致力于尋找一種方法將復數2D擴展到3D他認為,新的復數應該有一個實部和兩個虛部。但是一直沒有成功。1843年,他在前往愛爾蘭學院演講的路上,突然意識到應該有三個虛部而不是兩個。他把這種新復數類型性質刻在了橋上,這就是四元數。

四元數使用四個數來表達方位,因此命名為四元數用三個數來表達3D方位,一定會導致萬向鎖的問題。一個四元數包含一個標量分量和一個3D向量分量。通常標量分量為w,向量分量為v或者分開的x,y,z.

記法:[w,v][w,(x,y,z)]四元數與復數:復數定義: a+bi, i是所謂的虛數,滿足 i的平方等于-1;a是實部,b是虛部。

四元數擴展了復數系統,使用了三個虛部i,j,k一個四元數[w,(x,y,z)]定義了復數 w+xi+yj+zk.很多標準復數的性質都能應用到四元數上。更重要的是,和復數來旋轉2D中的向量類似,四元數也能用來旋轉3D中的向量。

四元數是非常重要的工具類之一。在Unity中所有用到模型旋轉的,其底層都是由四元數實現的,它可以精確的計算模型旋轉的角度。Quaternion基于復數的表示并不容易被直觀地理解,因此沒有必要訪問或修改單個Quaternion組件(x,y,z,w)只需通過Transform的rotation來實現旋轉,或者構造新的旋轉,如在兩個旋轉間平滑地插值

eulerAngles屬性返回表示旋轉的歐拉角度。表示旋轉的角度,順序依次繞z軸旋轉euler.z度,繞x軸旋轉euler.x度,繞y軸旋轉euler.y度范例:創建一個旋轉,繞y軸,指定一個30度旋轉角

在unity3d中,用四元數來表示旋轉,四元數英文名叫quaternion . 比如 transform.rotation 就是一個四元數,其由四個部分組成

Quaternion = (xi + yj + zk + w ) = (x,y,z,w)

quaternion 中 (x,y,z) 跟旋轉軸有關, w 與繞旋轉軸旋轉的角度有關,因為它們都要經過代數運算才能得出旋轉軸和旋轉角度??


Unity3D 中 用quaternion 來對一個坐標點進行旋轉,我進行的是第2種操作,即對一個向量進行旋轉;

首先 ,Quaternion 的基本數學方程為 :

Q = cos (a/2) + i (x * sin(a/2)) + j (y * sin(a/2)) + k(z * sin(a/2)) ?? (a 為旋轉角度)


Q.w = cos (angle / 2)?

Q.x = axis.x * sin (angle / 2)?

Q.y = axis.y * sin (angle / 2) ?

Q.z = axis.z * sin (angle / 2)


我們只要有角度就可以給出四元數的四個部分值,例如我想要讓點M=Vector3(o,p,q) 繞x軸順時針旋轉90度;那么對應的quaternion數值就應該為:

Q : Quaternion;

Q.x = 1 * sin(90度/2) = sin(45度) = 0.7071

Q.y = 0;

Q.z = 0;

Q.w = cos(90度/2) = cos (45度) = 0.7071

Q = (0.7071, 0 , 0 , 0.7071);

m = Q * m;(將點m 繞 x軸(1,0,0) 順時針旋轉了90度)

示例:

using UnityEngine;

using System.Collections;

class EulerAnglesTest: MonoBehaviour?

{

??public Quaternion rotation = Quaternion.identity;

??public void Awake() { ??

?????rotation.eulerAngles = new Vector3(0, 30, 0);?

????transform.rotation = rotation;

?}

}

Translate

移動transform在translation的方向和距離。

Space.Self和Space.World

注意,vector.forward和tranform.forward區別

Debug.Log("****************************");

Debug.Log(Vector3.forward);

Debug.Log(Vector3.right);

Debug.Log(Vector3.up);

Debug.Log("****************************");

Debug.Log(transform.forward);

Debug.Log(transform.right);

Debug.Log(transform.up);

Rotate

Transform.Rotate 旋轉

Transform.RotateAround 圍繞旋轉

LookAt

盯著看

transform.LookAt(Transform target);

transform.LookAt(Vector3 worldPosition);

擴展

transform.LookAt(Transform target,Vector3 worldUp);

z軸指向目標后,y軸旋轉變換指向由worldUp向量暗示的方向。 如果省略worldUp參數,該函數將使用世界y軸。 worldUp只是一個提示矢量。

Find:通過名字查找子物體并返回它。如果沒有查找到子物體名字,將返回null。如果名字包含“/”字符它將向路徑一樣穿越層次。

GetChild():根據子節點的序列查找子物體。

Transform維護父子關系

Transform.root 根

Transform.parent 父級

Transform.childCount 子物體數

Transform.SetParent();設置父節點

Transform.DetachChildren 分離子物體

坐標系變換

TransformPoint:變換位置從物體坐標到世界坐標

InverseTransformPoint:變換位置從世界坐標到自身坐標

TransformDirection:將一個方向從局部坐標變換到世界坐標方向。

InverseTransformDirection:將一個方向從世界坐標變換到局部坐標方向。

(擴展)矩陣(Matrix)

一個標準的4x4變換矩陣。

一個變換矩陣可以執行任意的線形3D變換(例如,平移,旋轉,縮放,切變等等)

并且透視變換使用齊次坐標。腳本中很少使用矩陣:最常用Vector3,Quaternion,而且Transform類的功能更簡單。

單純的矩陣用于特殊情況,如設置非標準相機投影在Unity中,Matrix4x4被Transform,Camera,Material和GL幾個函數使用。

worldToLocalMatrix:矩陣變換的點從世界坐標轉為自身坐標(只讀)。

localToWorldMatrix:矩陣變換的點從自身坐標轉為世界坐標(只讀)。


Debug.Log(tran

sform.position);

Debug.Log(transform.localPosition);

Vector4 vec = new Vector4(transform.localPosition.x,transform.localPosition.y,transform.localPosition.z,1);

Debug.Log((transform.parent.localToWorldMatrix*vec));

Vector4 vec2=new Vector4(transform.position.x,transform.position.y,transform.position.z,1);?

Debug.Log(transform.parent.worldToLocalMatrix*vec2);

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容