2017-10-06 43 views
1

我的3D項目出現問題。描述目的是相當複雜的,所以我儘量把它抽象到最低限度。 我有一個現場的統一計劃,我把它帶到全屏(1920 x 1200)的視頻流。一位用戶點擊屏幕將協調發送到統一應用程序。如何將Raycast方向設置爲90度而不是通過相機

發送座標:

// relative coord 
float x = mouse_x/1920.0f; 
float y = mouse_y/1200.0f; 

接收機是統一的應用程序,這改掉,使它的一個三維座標,並發現牆壁或障礙物放置的標記。

1. Attempt 
// 1268 x 720 receiver viewport size 
Ray ray = Camera.main.ScreenPointToRay(new Vector3(Position.x * 1268.0f, Position.y * 720.0f, 0)); 

2. Attempt 

// * 1268 not necessary 
Vector3 far = Camera.main.ViewportToWorldPoint(new Vector3(fix.Position.x, fix.Position.y, 1)); 

Vector3 near = Camera.main.ViewportToWorldPoint(new Vector3(fix.Position.x, fix.Position.y, 0)); 

Vector3 dir = far - near; 
dir.Normalize(); 

Ray ray = new Ray(near, dir); 

RaycastHit hitInfo; 

if(Physics.Raycast(ray, out hitInfo)) 
{ 
// place mark 
} 

enter image description here

兩個嘗試結果以同樣的方式。如果座標位於中心附近,那麼它也位於接收器的中心。但是它越走越邊緣,它將離它應該的位置越來越遠。圖片顯示了我的想法。紅圈是當前的行爲,綠色是我期待的。我寧願從屏幕到牆壁有90度的光線,而不是通過凸輪。 我真的不知道該怎麼辦。提前感謝您的幫助。

+0

視口是不是*物理空間*實體,使圖你是混亂的。您需要指定一個*投影平面*距離,它是從相機位置到平面的垂直距離。你想要光線開始 – meowgoesthedog

回答

1

你說得對,你確實發生了什麼事情。

這是我使用Debug.DrawRay的測試。 enter image description here

藍光是此代碼的輸出。

Debug.DrawRay(Camera.main.transform.position, Camera.main.transform.forward * 100f, Color.red); 

這裏是紅色的繪圖,就像你做的一樣。

var viewportPointRay = Camera.main.ViewportPointToRay(viewportTouchPos); 
Debug.DrawRay(viewportPointRay.origin, viewportPointRay.direction * 3f, Color.blue); 

我期待着一個真正簡單的答案,但我無法找到一個答案。我確實發現了一個做你想做的事的技巧。

var ray = new Ray(viewportPointRay.origin, Camera.main.transform.forward); 
Debug.DrawRay(ray.origin, ray.direction, Color.green); 

結果 enter image description here

相關問題