読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

2Dと3Dの座標変換【Unity】

Unity

このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 5.1.0f3 Personal

はじめに

今回は2Dと3Dの座標変換のやり方です。

例えば、3Dオブジェクトの近くに2Dのラベルを表示したい場合に使えます。


f:id:kan_kikuchi:20150625080038p:plain


逆に2Dオブジェクトの近くに3Dオブジェクトを配置したい場合にも使えます。


カメラと座標

まず、2Dか3D表示かは、CameraのProjectionで決まります。

下の画像は、上が3Dオブジェクト用のカメラ、下がUI用の2Dカメラです。


f:id:kan_kikuchi:20150625084628j:plain


Projectionの設定内容は以下の通りで、

Perspective 透視投影。遠近感の有る(遠くに有るほど小さくなる)描画となる
Orthographic 平行投影。遠近感の無い(距離に関係無く、同一のサイズで描画される)描画となる


Perspectiveが3D、Orthographicが2Dとなります。


座標

次にCameraで扱える座標についてです。

Cameraは以下の3つの座標を使え、相互に変換するメソッドも用意されています。

  • ワールド座標
  • ビューポート座標
  • スクリーン座標



今回重要なのはビューポート座標とワールド座標で、例えば


カメラAに映る物体A

と同じ位置に

カメラBに映る物体B

を移動させる手順は以下のようになります。

  1. 物体AのカメラAにおけるビューポート座標を取得
  2. 取得したビューポート座標にカメラB上で表示するためのワールド座標を取得
  3. 取得したワールド座標に物体Bを移動


この他にZ軸の調整が必要になりますが、

3D→2Dでも、2D→3Dどちらの場合も同じやり方ですし、

別カメラの3D→3Dでも同じやり方が使えます。


3D→2D

3D→2D変換の例として、3DのCubeが移動したら、

それを2DのLabelが追っかけるスクリプトを作ってみました。


f:id:kan_kikuchi:20150625220502g:plain


スクリプトは以下の通りです。



Z座標を0にしている点に注意が必要です。


2D→3D

2D→3D変換の例として、2DのLabelが移動したら、

それを3DのCubeが追っかけるスクリプトを作ってみました。


f:id:kan_kikuchi:20150625220931g:plain


スクリプトは以下の通りです。



2D→3Dの時とはZ座標の調整位置が違う点に注意が必要です。