免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
【新提醒】【再次認(rèn)識我們熟悉的Transform之位移】
 本帖最后由 RaymondChan 于 2018-2-6 21:15 編輯

注:本文屬于基礎(chǔ)系列,高手可以略過哦

1. 寫在前面

你有沒有過類似這樣子的疑惑?
1.明明我只拖動了一個物體z軸,為何檢視面板上其余兩個軸的值也發(fā)生變化了?檢視面板上顯示的不就是本地坐標(biāo)嘛,總不會是世界坐標(biāo)?那也不對呀!
2.使用transform.localPosition移動一個物體,我們只是想讓一個物體往它的z軸方向移動,為何實際運行時卻不是,而是不知道往哪個方向移動了,這是什么鬼?

如果你已經(jīng)想明白這些疑惑,那么請設(shè)想以下情形:
新建一個Cube,將其Rotation的Y值改為300,為其添加腳本,在Update中分別執(zhí)行以下語句時,先想一想各自會怎么移動?然后對比一下后面的結(jié)果(可以注意下上方的Global與Local的切換)。如果你依然有疑惑,我覺得咱們可以繼續(xù)往下看。
1 transform.Translate(Vector3.forward* Time.deltaTime);
2 transform.Translate(transform.forward * Time.deltaTime);
3 transform.position += Vector3.forward * Time.deltaTime;
4 transform.localPosition += Vector3.forward * Time.deltaTime;
5 transform.position += transform.forward * Time.deltaTime;
6 transform.localPosition+= transform.forward * Time.deltaTime;
7 Vector3 objVector3=transform.InverseTransformDirection(Vector3.forward);
transform.Translate(objVector3*Time.deltaTime);

實際結(jié)果如下:
1   transform.Translate(Vector3.forward * Time.deltaTime);


2  transform.Translate(transform.forward * Time.deltaTime);



3  transform.position += Vector3.forward * Time.deltaTime;



4 transform.localPosition += Vector3.forward * Time.deltaTime;



5 transform.position += transform.forward * Time.deltaTime;



6  transform.localPosition += transform.forward * Time.deltaTime;



7  Vector3 objVector3=transform.InverseTransformDirection(Vector3.forward);
    transform.Translate(objVector3*Time.deltaTime);





2. Unity坐標(biāo)系基礎(chǔ)


如果對上面的內(nèi)容有疑惑,我們可能先需要重新了解一下Unity的坐標(biāo)系。在Unity中常用的坐標(biāo)系有全局坐標(biāo)系、局部坐標(biāo)系、相機坐標(biāo)系、屏幕坐標(biāo)系,我們今天主要涉及的是全局坐標(biāo)系與局部坐標(biāo)系。

全局坐標(biāo)系
全局坐標(biāo)系是用來描述游戲場景內(nèi)所有物體位置和方向的基準(zhǔn),我們一般也叫它世界坐標(biāo)系。在Unity場景中創(chuàng)建的物體都是以全局坐標(biāo)系中的坐標(biāo)原點來確定各自位置的。所以,全局坐標(biāo)系是基準(zhǔn),我們可以使用世界坐標(biāo)來保存一個物體的確切位置。

局部坐標(biāo)系      
每個物體都有其獨立的物體坐標(biāo)系,并且隨物體進行相同的移動或者旋轉(zhuǎn),也可以叫做模型坐標(biāo)系或物體坐標(biāo)系。模型Mesh保存的頂點坐標(biāo)均為局部坐標(biāo)系下的坐標(biāo)。Unity工具欄上的Global/Local按鈕可以切換顯示全局坐標(biāo)系和局部坐標(biāo)系。這里要注意了,當(dāng)切換到Local的時候,顯示的是物體自身的坐標(biāo)系,是自身的坐標(biāo)系,是自身的坐標(biāo)系,是自身的坐標(biāo)系,重要的事多說幾遍。

3. Transform中容易混淆的幾個問題

transform.position與transform.localPostion(rotation同理)
transform.position 是物體的世界坐標(biāo),也就是相對世界坐標(biāo)系原點的位置;
transform.localPosition 這個大家一般理解為本地坐標(biāo),而一般問題也就出在“本地”這兩個字的理解上,這個“本地”不是物體的自身的坐標(biāo)系(這個local不是工具欄上Global/Local中的Local),而是指父物體的坐標(biāo)系,當(dāng)沒有父物體時,就是世界坐標(biāo)系,換句話說如果這個物體有父物體,那么localPosition就是該物體的相對父物體的自身坐標(biāo)系原點的位置,如果沒有父物體,那么localPosition就會等于position。
給大家畫個圖方便大家理解一下。為了便于觀察,我們使用二維坐標(biāo)系來演示,如下圖,A物體的position為(2,3),B物體的position為(5,4),如果A物體是B物體的父物體,那么B物體的localPosition就是以A點為原點的相對坐標(biāo)(5-2,4-3)即(3,1)




vector3.forward與transform.forward(up、right同理)
vector3.forward 這個值大家看到forward很容易將它與世界坐標(biāo)聯(lián)系起來,但它就只是一個三維向量,forward只是一個記法而已,官方表述是shorthand,它的值永遠(yuǎn)都是(0, 0, 1),與世界坐標(biāo)沒有任何關(guān)系,你將它用在世界坐標(biāo)(position)里,它就代表著世界坐標(biāo)的(0,0,1),你將它用在本地坐標(biāo)上(localPosition),那么它就代表著本地坐標(biāo)中的(0,0,1),這一點要記住,否則很容易搞錯;
transform.forward 這也是一個三維向量,方向是該物體的自身坐標(biāo)系的z軸方向,長度是世界坐標(biāo)系中的1,由于這個向量的方向是該物體自身z軸方向,所以這個三維向量的值是會變化的,是基于世界坐標(biāo)系計算得到的值。

Transform在檢視面板上的顯示的值



這里的Position是localPosition的值,是在父物體的坐標(biāo)系下的值,也就是相對父物體原點的位置。這與工具欄上的Local是不一樣的。所以才會出現(xiàn)直接拖拽物體的z軸,而檢視面板中不一定是z的值在變化。

Translate是指定坐標(biāo)系的
public void Translate(Vector3 translation, Space relativeTo = Space.Self);
public void Translate(Vector3 translation, Transform relativeTo);
Translate方法具有多個重載方法,當(dāng)我們不指定坐標(biāo)系時,默認(rèn)是按自身坐標(biāo)系進行位移,我們也可以指定為世界坐標(biāo)系,當(dāng)然也可以指定為其他任意物體自身的坐標(biāo)系。所以當(dāng)我們使用默認(rèn)坐標(biāo)系時,要記住這是物體自身的坐標(biāo)系。



4. 對1中7種移動的分析

1transform.Translate(Vector3.forward* Time.deltaTime);
Translate方法具有多個重載方法,可以指定坐標(biāo)系,當(dāng)只給出一個三維向量參數(shù)時,默認(rèn)按自身的局部坐標(biāo)系移動,所以雖然是Vector3.forward即(0,0,1),但是在自身坐標(biāo)系中表示就是此時物體的transform.forward,因此我們看到的是物體沿著自身坐標(biāo)系的z軸移動
2transform.Translate(transform.forward * Time.deltaTime);
由于物體已經(jīng)經(jīng)過旋轉(zhuǎn)了,局部坐標(biāo)系也發(fā)生了旋轉(zhuǎn),而transform.forward是基于世界坐標(biāo)系的表示,因此此時仍然按transform.forward移動的話,實際上是相當(dāng)于世界中兩倍的transform.forward與Vector3.forward的夾角上移動(。。。有點沒說清楚,但是這種移動一般不需要,是錯誤的)
3transform.position += Vector3.forward * Time.deltaTime;
transform.position的值是物體在全局坐標(biāo)系中的位置,因此在這個位置上加上(0, 0, 1)也就是按全局坐標(biāo)系的z軸移動
4transform.localPosition += Vector3.forward * Time.deltaTime;
transform.localPosition的值是物體在父物體的局部坐標(biāo)系中的位置點,而這個局部坐標(biāo)系的原點就是父物體的位置,在這里沒有父物體,所以localPosition所使用的坐標(biāo)系等同于全局坐標(biāo)系,所以也是按全局坐標(biāo)系的z軸移動
5transform.position += transform.forward * Time.deltaTime;
雖然transform.forward表示的是物體自身的z軸方向,但它是基于世界坐標(biāo)系表示的,所以與position是匹配的,因此是沿著物體自身的z軸移動
6transform.localPosition+= transform.forward * Time.deltaTime;
由于沒有父物體,效果同5
7Vector3 objVector3=transform.InverseTransformDirection(Vector3.forward);
transform.Translate(objVector3*Time.deltaTime);
這里先將全局坐標(biāo)系的(0,0,1)三維向量轉(zhuǎn)換為局部坐標(biāo)系的三維向量,然后再使用Translate讓其按照局部坐標(biāo)系進行移動,效果就相當(dāng)于沿著全局坐標(biāo)系的z軸移動了。

5. 再次思考


我們加點改變,在上述的Cube下新建一個子物體cube,與父物體拉開一段距離,進行一點任意旋轉(zhuǎn),只對子物體同樣執(zhí)行以上語句,子物體cube都會怎么移動?
這里我就不再贅述啦,大家可以自己嘗試哦。如果這個依然可以想明白,那么到這里基本上就OK啦。




6. 小結(jié)


帶著大家回顧了下Unity中的全局坐標(biāo)系與局部坐標(biāo)系,分析了幾種容易混淆的問題以及幾種移動的方式,希望可以給大家?guī)硪稽c幫助。

工程文件(Unity 2017.3.0f3):
鏈接:https://pan.baidu.com/s/1bqiT9FL 密碼:xd11




本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Unity使用transform.Translate()移動子物體時遇到的小問題
unity 移動物體到指定位置的四種方法
Unity3D—Transform
Unity網(wǎng)絡(luò)通信(三)同步物體
Unity3D研究院之腳本實現(xiàn)模型的平移與旋轉(zhuǎn)(六) | 雨松MOMO程序研究院
Unity3d
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服