1. 程式人生 > >ScreenToViewportPoint,WorldToViewportPoint,ViewportToWorldPoint的運用,實現一個簡單的對三維中物體的拖拽移動效果

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

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

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

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

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

相關推薦

ScreenToViewportPointWorldToViewportPointViewportToWorldPoint運用實現一個簡單物體移動效果

  眾所周知,我們手機或者手機螢幕上的座標是一個二維平面的的座標值,而且這個座標是一畫素為單位的,也就是說這個是會根據你用的裝置的不同,你手機或者電腦上的座標的長寬最大值也就不同。   之前不太瞭解標題上三個方法的用法,走了不少彎路,然後下來仔細研究了一下,感覺還是挺有收穫的。   簡單說一下,我們在Unit

機房收費系統之細化篇(跨日期下機MDI窗體的運用MDI主窗體與子窗體的互動)

      最近在細化機房收費系統時,發現在下機窗體出現了很多消費時間為負值的情況,有時還會彈出Bug,仔細一看原來是跨日期的消費時間問題,那麼如何設定跨日期的下機呢?在機房收費系統中的MDI 窗體如何運用呢?下面就這兩個問題進行梳理分享。 一、跨日期的下機 核

類方法實現:用python實現一個簡單的單詞本添加/查找/刪除單詞。

end code div keys style 成功 move print utf 1.實現一個簡單的單詞本,功能: ①添加單詞,當所添加的單詞已存在時,讓用戶知道 ②查找單詞,當查找的單詞不存在時,讓用戶知道 ③刪除單詞,當刪除的單詞不存在時,讓用戶知道 以上

【人工智慧】用Python實現一個簡單的人臉識別原來我和這個明星如此相似

近幾年來,興起了一股人工智慧熱潮,讓人們見到了AI的能力和強大,比如影象識別,語音識別,機器翻譯,無人駕駛等等。總體來說,AI的門檻還是比較高,不僅要學會使用框架實現,更重要的是,需要有一定的數學基礎,如線性代數,矩陣,微積分等。 幸慶的是,國內外許多大神都已經給我們造好“輪子”,我們可以直接來使用某些模型

【人工智能】用Python實現一個簡單的人臉識別原來我和這個明星如此相似

數值 但是 智能 深度學習 lib python 數學 三方 python實現 近幾年來,興起了一股人工智能熱潮,讓人們見到了AI的能力和強大,比如圖像識別,語音識別,機器翻譯,無人駕駛等等。總體來說,AI的門檻還是比較高,不僅要學會使用框架實現,更重要的是,需要有一定的數

【很有趣】用Python實現一個簡單的人臉識別原來我和這個明星如此相似

近幾年來,興起了一股人工智慧熱潮,讓人們見到了AI的能力和強大,比如影象識別,語音識別,機器翻譯,無人駕駛等等。總體來說,AI的門檻還是比較高,不僅要學會使用框架實現,更重要的是,需要有一定的數學基礎,如線性代數,矩陣,微積分等。 幸慶的是,國內外許多大神都已經給我們造好“輪子”,我們可

在不使用JavaScript內建的parseInt()函式的前提下利用map和reduce操作實現一個string2int()函式

在不使用JavaScript內建的parseInt()函式的前提下,利用map和reduce操作實現一個string2int()函式 題目出自廖雪峰老師的JavaScript教程: 把一個字串13579先變成Array——[1, 3, 5, 7, 9],再利用reduce()就可以寫出一

利用jQuery UI為CMS網站實現佈局效果秒殺table佈局

1 實現效果     對於使用過CMS系統製作網站的人應該都清楚,製作網站過程有一個重要的步驟就是製作頁面佈局。目前,實現頁面佈局有兩種方式:table與div。這兩種方式各有其優劣之處。     Table:     優勢:使用簡單,使用表格進行佈局順理成章,概念和效果圖

springmvc在處理請求過程出現異常資訊交由異常處理器進行處理自定義異常處理器可以實現一個系統的異常處理邏輯。為了區別不同的異常通常根據異常型別自定義異常類這裡我們建立一個自定義系統異常如果controller、service、dao丟擲此類異常說明是系統預期處理的異常資訊。

springmvc在處理請求過程中出現異常資訊交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。 1.1 異常處理思路 系統中異常包括兩類:預期異常和執行時異常RuntimeException,前者通過捕獲異常從而獲取異常資訊,後者主要通過規範程式碼開發、測試通過手段減少執

springmvc在處理請求過程出現異常信息交由異常處理器進行處理自定義異常處理器可以實現一個系統的異常處理邏輯。為了區別不同的異常通常根據異常類型自定義異常類這裏我們創建一個自定義系統異常如果controller、service、dao拋出此類異常說明是系統預期處理的異常信息。

ansi req -type this spring 進行 name ext code springmvc在處理請求過程中出現異常信息交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。 1.1 異常處理思路 系統中異常包括兩類:預期異常和運行時異常Ru

Html+javascript實現一個簡單的計算器可繼續計算

先展示出計算器的大致樣子 <body> <div id="main"> <table frame="box" rules="all"> <tr> <td colspan="5" ><input

Swing 實現一個簡單窗體程式並打成可執行jar包

1. 前言 在做App自動化測試時,需要經常獲取裝置資訊,Apk的包名,啟動activity等,每次都用命令列獲取很是麻煩,於是想到做一個窗體程式,只需要點幾個按鈕,就可以獲得所需資訊。最終介面如下: 2.佈局思路 這裡不對窗體具體功能做介紹,說一

python實現Kmeans文字聚類通過PCA降維和Matplotlib顯示聚類3d影象

首先感謝Eastmount寫的內容http://blog.csdn.net/Eastmount/article/details/50545937。點選開啟連結 在此基礎上,主要實現以下改進及結果 1.替換使用sklearn.feature_extraction.text.T

不要使用JavaScript內建的parseInt()函式利用map和reduce操作實現一個string2int()函式:

#js練習第一天 不要使用JavaScript內建的parseInt()函式,利用map和reduce操作實現一個string2int()函式: 練習:把一個字串"13579"轉換成13579,並且不使用parseInt和Number函式 ```javascrpt 'us

JS學習筆記1——不要使用JavaScript內建的parseInt()和Number()函式利用map和reduce操作實現一個string2int()函式

map/reduce練習題:不要使用JavaScript內建的parseInt()和Number()函式,利用map和reduce操作實現一個string2int()函式。 分析:把一個字串"13579"先變成Array——[1, 3, 5, 7, 9],再利用reduce

android硬編碼h264資料並使用rtp推送資料流實現一個簡單的直播-MediaCodec(一)

  寫在前面:我並非專業做流媒體的coder,對流媒體行業無比崇拜,只是做了幾年安卓車載ROM,對安卓AV開發算是略懂。本篇部落格是我對MediaCodec編解碼和rtp推流的一次嘗試,希望能給有需要的朋友一些細微的幫助,不喜勿噴,如果有不對的地方希望大神指正共

淺談Java的Condition條件佇列手摸手帶你實現一個阻塞佇列!

條件佇列是什麼?可能很多人和我一樣答不出來,不過今天終於搞清楚了! 什麼是條件佇列 條件佇列:當某個執行緒呼叫了wait方法,或者通過Condition物件呼叫了await相關方法,執行緒就會進入阻塞狀態,並加入到對應條件佇列中。 在等待喚醒機制相關文章中我們提到了條件佇列,即當物件獲取到同步鎖之後,如果呼叫

git原理學習記錄:從基本指令到背後原理實現一個簡單的git

![好傢伙~](https://mmbiz.qpic.cn/mmbiz_png/4Kicia369ptWEyMJ0dqdcg0vJWFgGtWp9ibU3Myf8YEQtxib3LqX7zeGlErrQ367ycRIPP1QibUiccCgnkf1l8b9gqdw/0?wx_fmt=png) 一開始我還擔心

洗禮靈魂修煉python(3)--從一個簡單的print代碼揭露編碼問題運行原理和語法習慣

比較 編譯 windows 機器 函數 容易 打印字符 出現 無法 前期工作已經準備好後,可以打開IDE編輯器了,你可以選擇python自帶的IDLE,也可以選擇第三方的,這裏我使用pycharm——一個專門為python而生的編譯器 第一個python代碼當然是所有開發語

矩形移動四個角動改變大小

http enter pos 變化 tails per posit ems sca 原創是https://blog.csdn.net/liujava621/article/details/30495103,我這裏做了修改,侵權刪。 上幹貨:這裏首先要註意操作四個角的時候,框