眾所周知,我們手機或者手機屏幕上的坐標是一個二維平面的的坐標值,而且這個坐標是一像素為單位的,也就是說這個是會根據你用的設備的不同,你手機或者電腦上的坐標的長寬最大值也就不同。
之前不太了解標題上三個方法的用法,走了不少彎路,然后下來仔細研究了一下,感覺還是挺有收獲的。
簡單說一下,我們在Unity中屏幕坐標是以坐下為原點,向兩邊延伸,右上為終點,假定現在我們的分辨率是1920x1080的話,那么簡單,四個角對應的值大家可能都能猜到,(假定為橫屏)坐下(0,0),右下(1920,0),左上(1080,0),右上(1920,1085)。讓后這就是我們屏幕的坐標,在unity中鼠標超出的話,會顯示為負值,這個可取可以用log語句打印出來看看,前面都是鋪墊,接下來重點來了,注意了。。。
1.如果我們運用第一個方法Camera.main.ScreenToViewportPoint()的話,那么,就可以將我們不容分辨率屏幕上的點都轉換為一個想x,y值在(0,1)之間的數值,當然和上面一樣如果你傳進來的這個鼠標的位置超出屏幕范圍對應的視口坐標(暫且這么稱呼)也會變為負值,只不過不想分標率那么多情況,這個簡單想一下就能明白,下面是這個例子的第一個轉換代碼:
//將屏幕坐標轉換為視口坐標 Vector3 pos1 = Camera.main.ScreenToViewportPoint (Input.mousePosition);
2.將三維中物體的位置轉換為視口坐標位置,存放在一個三維向量中,這里了的三維中中物體坐標轉換為視口坐標大致是這樣的,假如你這個物體在game下能看見的話,那么它的想x,y就在(0,1)之間,若超出我們視野范圍則為大於一小於零的值,這是沒什么問題的,然后就是z的值,因為物體可能離相機的遠近不同,這個值變化比較大,我這里將物體在三維場景中坐標轉換為視口坐標的原因主要想獲取他離攝像機的距離,也就是z的值,
//將三維物體的世界坐標轉換為視口坐標 Vector3 pos2=Camera.main.WorldToViewportPoint(target.position);
3.將1,2中獲取的信息組合成一個新的向量,然后作為4中的參數
//賦值給一個新的變量 Vector3 pos=new Vector3(pos1.x,pos1.y,pos2.z);
4.將視口坐標轉換為三維坐標傳遞回給物體的position,功能實現完成
//將合成的視口坐標轉換為世界坐標賦值給物體 target.position=Camera.main.ViewportToWorldPoint(pos);
接下來是演示的一個gif:
有什么不合理的地方歡迎指正。