Unity基礎(chǔ)-Transform

任何游戲?qū)ο笤趧?chuàng)建的時(shí)候都會(huì)附帶Transform組件,用于儲(chǔ)存并操控物體的位置咽块、旋轉(zhuǎn)和縮放。

并且該組件是無(wú)法刪除的侈沪。

Transform面板一共包含3個(gè)屬性:

Position:位置

Rotation:旋轉(zhuǎn)

Scale:(縮放)

可修改對(duì)象的位置、旋轉(zhuǎn)方式瘦馍、縮放數(shù)值

position应役;世界坐標(biāo)系位置

localPosition情组;本地坐標(biāo)系位置

縮放

localScale箩祥;自身縮放

lossyScale;全局縮放

旋轉(zhuǎn)

transform.rotation袍祖;世界坐標(biāo)系旋轉(zhuǎn)

transform.localRotation;本地坐標(biāo)系旋轉(zhuǎn)

transform.eulerAngles捐凭;世界坐標(biāo)系旋轉(zhuǎn)

transform.localEulerAngles寺滚;本地坐標(biāo)系旋轉(zhuǎn)

歐拉角

構(gòu)件在三維空間中的有限轉(zhuǎn)動(dòng)柑营,可依次用三個(gè)相對(duì)轉(zhuǎn)角表示這三個(gè)轉(zhuǎn)角統(tǒng)稱為歐拉角村视。

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

1,當(dāng)認(rèn)為順序是yxz時(shí)(其實(shí)就是heading - pitch - bank),是傳統(tǒng)的歐拉角變換奶赔,也就是以物體自己的坐標(biāo)系為軸的。

2,當(dāng)認(rèn)為順序是zxy時(shí)(roll - pitch - yaw)站刑,也是官方文檔的順序時(shí)鼻百,是以慣性坐標(biāo)系為軸的摆尝。后者比較直觀一些,但其實(shí)兩者的實(shí)際效果是一樣的堕汞,只是理解不一樣晃琳。

歐拉角有兩種:

靜態(tài):即繞世界坐標(biāo)系三個(gè)軸的旋轉(zhuǎn)讯检,由于物體旋轉(zhuǎn)過(guò)程中坐標(biāo)軸保持靜止卫旱,所以稱為靜態(tài)。

動(dòng)態(tài):即繞物體坐標(biāo)系三個(gè)軸的旋轉(zhuǎn)投放,由于物體旋轉(zhuǎn)過(guò)程中坐標(biāo)軸隨著物體做相同的轉(zhuǎn)動(dòng),所以稱為動(dòng)態(tài)跪呈。

使用動(dòng)態(tài)歐拉角會(huì)出現(xiàn)萬(wàn)向鎖現(xiàn)象取逾;靜態(tài)歐拉角不存在萬(wàn)向鎖的問(wèn)題

正常狀態(tài):三個(gè)獨(dú)立的旋轉(zhuǎn)軸

萬(wàn)向鎖:一旦選擇±90°作為pitch角耗绿,就會(huì)導(dǎo)致第一次旋轉(zhuǎn)和第三次旋轉(zhuǎn)等價(jià)砾隅,整個(gè)旋轉(zhuǎn)表示系統(tǒng)被限制在只能繞豎直軸旋轉(zhuǎn),丟失了一個(gè)表示維度究反。

萬(wàn)向節(jié)死鎖會(huì)導(dǎo)致位置上連續(xù)變化儒洛,在數(shù)值表示上確是非連續(xù)的精耐。給定的兩個(gè)關(guān)鍵幀之間無(wú)法平滑過(guò)渡琅锻。解決方法:可以使用四元數(shù)球面線性插值

四元數(shù)

愛(ài)爾蘭數(shù)學(xué)家William hamilton一直致力于尋找一種方法將復(fù)數(shù)2D擴(kuò)展到3D他認(rèn)為,新的復(fù)數(shù)應(yīng)該有一個(gè)實(shí)部和兩個(gè)虛部惊完。但是一直沒(méi)有成功。1843年小槐,他在前往愛(ài)爾蘭學(xué)院演講的路上荷辕,突然意識(shí)到應(yīng)該有三個(gè)虛部而不是兩個(gè)件豌。他把這種新復(fù)數(shù)類型性質(zhì)刻在了橋上,這就是四元數(shù)苟径。

四元數(shù)使用四個(gè)數(shù)來(lái)表達(dá)方位躬审,因此命名為四元數(shù)用三個(gè)數(shù)來(lái)表達(dá)3D方位蟆盐,一定會(huì)導(dǎo)致萬(wàn)向鎖的問(wèn)題承边。一個(gè)四元數(shù)包含一個(gè)標(biāo)量分量和一個(gè)3D向量分量石挂。通常標(biāo)量分量為w,向量分量為v或者分開(kāi)的x,y,z.

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

四元數(shù)擴(kuò)展了復(fù)數(shù)系統(tǒng),使用了三個(gè)虛部i,j,k一個(gè)四元數(shù)[w,(x,y,z)]定義了復(fù)數(shù) w+xi+yj+zk.很多標(biāo)準(zhǔn)復(fù)數(shù)的性質(zhì)都能應(yīng)用到四元數(shù)上琼懊。更重要的是,和復(fù)數(shù)來(lái)旋轉(zhuǎn)2D中的向量類似哼丈,四元數(shù)也能用來(lái)旋轉(zhuǎn)3D中的向量。

四元數(shù)是非常重要的工具類之一醉旦。在Unity中所有用到模型旋轉(zhuǎn)的,其底層都是由四元數(shù)實(shí)現(xiàn)的咙崎,它可以精確的計(jì)算模型旋轉(zhuǎn)的角度。Quaternion基于復(fù)數(shù)的表示并不容易被直觀地理解褪猛,因此沒(méi)有必要訪問(wèn)或修改單個(gè)Quaternion組件(x,y,z,w)只需通過(guò)Transform的rotation來(lái)實(shí)現(xiàn)旋轉(zhuǎn)羹饰,或者構(gòu)造新的旋轉(zhuǎn)伊滋,如在兩個(gè)旋轉(zhuǎn)間平滑地插值

eulerAngles屬性返回表示旋轉(zhuǎn)的歐拉角度。表示旋轉(zhuǎn)的角度昼浦,順序依次繞z軸旋轉(zhuǎn)euler.z度筒主,繞x軸旋轉(zhuǎn)euler.x度,繞y軸旋轉(zhuǎn)euler.y度范例:創(chuàng)建一個(gè)旋轉(zhuǎn)乌妙,繞y軸,指定一個(gè)30度旋轉(zhuǎn)角

在unity3d中,用四元數(shù)來(lái)表示旋轉(zhuǎn),四元數(shù)英文名叫quaternion . 比如 transform.rotation 就是一個(gè)四元數(shù),其由四個(gè)部分組成

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

quaternion 中 (x,y,z) 跟旋轉(zhuǎn)軸有關(guān), w 與繞旋轉(zhuǎn)軸旋轉(zhuǎn)的角度有關(guān),因?yàn)樗鼈兌家?jīng)過(guò)代數(shù)運(yùn)算才能得出旋轉(zhuǎn)軸和旋轉(zhuǎn)角度??


Unity3D 中 用quaternion 來(lái)對(duì)一個(gè)坐標(biāo)點(diǎn)進(jìn)行旋轉(zhuǎn),我進(jìn)行的是第2種操作,即對(duì)一個(gè)向量進(jìn)行旋轉(zhuǎn);

首先 ,Quaternion 的基本數(shù)學(xué)方程為 :

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


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)


我們只要有角度就可以給出四元數(shù)的四個(gè)部分值,例如我想要讓點(diǎn)M=Vector3(o,p,q) 繞x軸順時(shí)針旋轉(zhuǎn)90度;那么對(duì)應(yīng)的quaternion數(shù)值就應(yīng)該為:

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;(將點(diǎn)m 繞 x軸(1,0,0) 順時(shí)針旋轉(zhuǎn)了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

移動(dòng)transform在translation的方向和距離虐沥。

Space.Self和Space.World

注意泽艘,vector.forward和tranform.forward區(qū)別

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 旋轉(zhuǎn)

Transform.RotateAround 圍繞旋轉(zhuǎn)

LookAt

盯著看

transform.LookAt(Transform target);

transform.LookAt(Vector3 worldPosition);

擴(kuò)展

transform.LookAt(Transform target,Vector3 worldUp);

z軸指向目標(biāo)后,y軸旋轉(zhuǎn)變換指向由worldUp向量暗示的方向匹涮。 如果省略worldUp參數(shù),該函數(shù)將使用世界y軸秋秤。 worldUp只是一個(gè)提示矢量脚翘。

Find:通過(guò)名字查找子物體并返回它灼卢。如果沒(méi)有查找到子物體名字来农,將返回null。如果名字包含“/”字符它將向路徑一樣穿越層次涩咖。

GetChild():根據(jù)子節(jié)點(diǎn)的序列查找子物體繁莹。

Transform維護(hù)父子關(guān)系

Transform.root 根

Transform.parent 父級(jí)

Transform.childCount 子物體數(shù)

Transform.SetParent();設(shè)置父節(jié)點(diǎn)

Transform.DetachChildren 分離子物體

坐標(biāo)系變換

TransformPoint:變換位置從物體坐標(biāo)到世界坐標(biāo)

InverseTransformPoint:變換位置從世界坐標(biāo)到自身坐標(biāo)

TransformDirection:將一個(gè)方向從局部坐標(biāo)變換到世界坐標(biāo)方向。

InverseTransformDirection:將一個(gè)方向從世界坐標(biāo)變換到局部坐標(biāo)方向咨演。

(擴(kuò)展)矩陣(Matrix)

一個(gè)標(biāo)準(zhǔn)的4x4變換矩陣。

一個(gè)變換矩陣可以執(zhí)行任意的線形3D變換(例如,平移拍嵌,旋轉(zhuǎn)循诉,縮放,切變等等)

并且透視變換使用齊次坐標(biāo)茄猫。腳本中很少使用矩陣:最常用Vector3,Quaternion划纽,而且Transform類的功能更簡(jiǎn)單。

單純的矩陣用于特殊情況,如設(shè)置非標(biāo)準(zhǔn)相機(jī)投影在Unity中蹋绽,Matrix4x4被Transform,Camera卸耘,Material和GL幾個(gè)函數(shù)使用。

worldToLocalMatrix:矩陣變換的點(diǎn)從世界坐標(biāo)轉(zhuǎn)為自身坐標(biāo)(只讀)侈百。

localToWorldMatrix:矩陣變換的點(diǎn)從自身坐標(biāo)轉(zhuǎn)為世界坐標(biāo)(只讀)翰铡。


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);

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市例证,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌织咧,老刑警劉巖漠秋,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異庆锦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)绿渣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)中符,“玉大人,你說(shuō)我怎么就攤上這事右莱。” “怎么了慢蜓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵郭膛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我则剃,道長(zhǎng),這世上最難降的妖魔是什么调煎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任己肮,我火速辦了婚禮,結(jié)果婚禮上谎僻,老公的妹妹穿的比我還像新娘。我一直安慰自己艘绍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布需了。 她就那樣靜靜地躺著般甲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敷存。 梳的紋絲不亂的頭發(fā)上堪伍,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天觅闽,我揣著相機(jī)與錄音,去河邊找鬼蛉拙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛孕锄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宦芦,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼轴脐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了大咱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤气破,失蹤者是張志新(化名)和其女友劉穎聊浅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體旷痕,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡顽冶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绞呈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡佃声,死狀恐怖倘要,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤志鹃,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布曹铃,位于F島的核電站缰趋,受9級(jí)特大地震影響铛只,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜淳玩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谋竖。 院中可真熱鬧承匣,春花似錦蓖乘、人聲如沸韧骗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至岗宣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耗式,已是汗流浹背趁猴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留儡司,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓让蕾,卻偏偏與公主長(zhǎng)得像浪规,于是被迫代替她去往敵國(guó)和親探孝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容