ScreenToViewportPoint,WorldToViewportPoint,ViewportToWorldPoint的運用,實現一個簡單的對三維中物體的拖拽移動效果

來源:互聯網
上載者:User

標籤:camera   簡單   osi   csharp   arp   target   世界   它的   view   

  眾所周知,我們手機或者手機螢幕上的座標是一個二維平面的的座標值,而且這個座標是一像素為單位的,也就是說這個是會根據你用的裝置的不同,你手機或者電腦上的座標的長寬最大值也就不同。

  之前不太瞭解標題上三個方法的用法,走了不少彎路,然後下來仔細研究了一下,感覺還是挺有收穫的。

  簡單說一下,我們在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:

  有什麼不合理的地方歡迎指正。

ScreenToViewportPoint,WorldToViewportPoint,ViewportToWorldPoint的運用,實現一個簡單的對三維中物體的拖拽移動效果

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.