マウス操作とスクリーン座標 (3/4)
作成:2014-09-15 09:52
更新:2014-09-15 09:52
更新:2014-09-15 09:52
■スクリーン座標をワールド座標に変換する
mousePositionで得られたマウスポインタの位置をシーン内で利用するためには、スクリーン座標として取り出した位置を、シーン内の3次元空間の位置に変換しなければいけません。
シーン内の3次元空間は「ワールド座標」と呼ばれます。表示されているシーンは、「どこから見たものなのか」によって表示される場所が違います。ですから、スクリーン座標をワールド座標に変換するためには、「どのカメラから見たシーンなのか」を考えて処理しないといけません。
カメラは、Cameraというクラスとして用意されています。Main Cameraは、Camera内の「main」というプロパティにインスタンスが用意されています。この中の「ScreenToWordlPoint」というメソッドを使うことで、そのカメラから見た3次元空間内のワールド座標に変換することができます。
mousePositionから得られたVector3を引数にして呼び出すと、Main Cameraから見たワールド座標に変換されます。このとき重要になるのが、スクリーン座標のVector3の「z」値です。
mousePositionの値は、スクリーン座標ですからxとyの値しか設定されていません。zは、ワールド座標に変換した時の「カメラからの距離」として使われます。3次元空間は奥行きがありますから、2次元の座標から変換する際には「どれぐらい離れているか」という第3の値が必要なのです。
下に、利用例を挙げておきましょう。シーン内をクリックすると、その地点にCubeが移動します。Input.mousePositionの値を取得し、zの値を適当に設定してからScreenToWorldPointで座標変換する。そして得られたVector3にCubeのpositionを変更すれば、「クリック地点に移動」が実現できます。
シーン内の3次元空間は「ワールド座標」と呼ばれます。表示されているシーンは、「どこから見たものなのか」によって表示される場所が違います。ですから、スクリーン座標をワールド座標に変換するためには、「どのカメラから見たシーンなのか」を考えて処理しないといけません。
カメラは、Cameraというクラスとして用意されています。Main Cameraは、Camera内の「main」というプロパティにインスタンスが用意されています。この中の「ScreenToWordlPoint」というメソッドを使うことで、そのカメラから見た3次元空間内のワールド座標に変換することができます。
Vector3 変数 = Camera.main.ScreenToWorldPoint( 変換するVector3 );
mousePositionから得られたVector3を引数にして呼び出すと、Main Cameraから見たワールド座標に変換されます。このとき重要になるのが、スクリーン座標のVector3の「z」値です。
mousePositionの値は、スクリーン座標ですからxとyの値しか設定されていません。zは、ワールド座標に変換した時の「カメラからの距離」として使われます。3次元空間は奥行きがありますから、2次元の座標から変換する際には「どれぐらい離れているか」という第3の値が必要なのです。
下に、利用例を挙げておきましょう。シーン内をクリックすると、その地点にCubeが移動します。Input.mousePositionの値を取得し、zの値を適当に設定してからScreenToWorldPointで座標変換する。そして得られたVector3にCubeのpositionを変更すれば、「クリック地点に移動」が実現できます。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
void Update () { transform.Rotate(1,1,1); if (Input.GetMouseButtonDown(0)){ Vector3 pos = Input.mousePosition; pos.z = 5; // カメラからの距離 Vector3 pos2 = Camera.main.ScreenToWorldPoint(pos); Debug.Log(pos); transform.position = pos2; } }
※関連コンテンツ