2017-10-06 15 views
1

3Dプロジェクトに問題があります。目的を説明するのはかなり複雑ですので、私はそれを抽象的に最小限にしようとしています。 私はフルスクリーン(1920 x 1200)にするユニティプログラムのライブビデオストリームを持っています。 1人のユーザがスクリーンをクリックしてコーディネートを統一アプリに送る。カメラではなくレイキャスト方向を90度に設定する方法

送信COORDS:

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

受信機は、3Dがそれの座標を作るためにtrys壁やマークを配置する障害物を発見統一アプリケーションです。

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

関連する問題