Webエンジニアが学ぶPico VR:Unityでの3D座標系と単位の基本
Pico VR開発を始めるにあたり、Web開発の経験をお持ちの皆様が最初に戸惑うことの一つに、3D空間の概念、特に「座標系」と「単位」があるかと思います。Webサイトのレイアウトでは、通常2Dの平面上でピクセルやemといった単位を用いて、画面の左上を原点として要素を配置します。しかし、VRの世界は奥行きを持つ3次元空間であり、座標の考え方や使用する単位が異なります。
この記事では、Pico VR開発の基礎として、Unityにおける3D空間の座標系と単位の基本概念を、Web開発での知識と比較しながら分かりやすく解説します。
3D空間の座標系とは
Web開発におけるブラウザのビューポートのように、3D空間にも基準となる座標系が存在します。これは、空間内のあらゆる点やオブジェクトの位置、向き、大きさを数値で表現するための規約です。主に以下の3軸で構成されます。
- X軸: 一般的に水平方向(左右)を表します。
- Y軸: 一般的に垂直方向(上下)を表します。
- Z軸: 奥行き方向(前後)を表します。
これらの軸がどのように配置されるかによって、「右手系」と「左手系」という二つの主要な座標系があります。
右手系と左手系
- 右手系: 右手の親指をX軸、人差し指をY軸、中指をZ軸の正の方向に向けると、それぞれの指が直交する関係です。ゲーム開発ではUnity、Unreal Engineなどが右手系を採用しています。PicoのVRデバイスもこの右手系の座標空間でユーザーの動きをトラッキングします。
- 左手系: 左手を使って同様に軸を示す座標系です。DirectXなどが採用しています。
Unityは右手系の座標系を採用しています。特に注意が必要なのは、Z軸の正の方向が「手前(カメラ方向)」ではなく「奥」を指す点です。これはWeb開発でCSSのz-index
が数値が大きいほど手前に表示されるのとは逆の感覚になる場合があります。
Unityにおける座標系
Unityには、いくつかの種類の座標系が存在し、それぞれ異なる基準でオブジェクトの位置や向きを表現します。
- ワールド座標 (World Space): 3Dシーン全体の原点(通常は(0, 0, 0))を基準とした座標系です。シーン内の全てのオブジェクトは、ワールド座標における位置、回転、スケールを持ちます。これは、いわばVR世界の「絶対座標」のようなものです。
- ローカル座標 (Local Space / Object Space): 各オブジェクト自身の中心を原点とした座標系です。オブジェクトの子要素は、親オブジェクトのローカル座標を基準に配置されます。オブジェクトの回転やスケールは、このローカル座標系に対して行われます。これは、Web開発で親要素を基準にした子要素の絶対配置(
position: absolute; top: 10px; left: 20px;
など)に似た考え方です。 - スクリーン座標 (Screen Space): デバイスの画面(モニターやVRヘッドセットのディスプレイ)を基準とした2D座標系です。通常、左下隅が(0, 0)で、右上隅が(Screen.width, Screen.height)となります。UI要素の配置などで使用されます。これはWeb開発のピクセル座標に近いです。
- ビューポート座標 (Viewport Space): カメラの表示範囲を基準とした2D座標系です。左下隅が(0, 0)、右上隅が(1, 1)となります。正規化された座標として、画面サイズに依存しない処理に利用できます。
VR開発では、特にワールド座標とローカル座標の理解が重要です。例えば、プレイヤーの頭(カメラ)はワールド座標で移動し、プレイヤーの手(コントローラーやハンドトラッキング)はプレイヤー自身(頭や体)のローカル座標や、ワールド座標で表現されることがあります。
Unityにおける単位
Web開発ではピクセル(px)、em、rem、%などが単位として使われますが、Unityの3D空間ではメートル(m)が基本単位となります。
- 1 Unity Unit = 1メートル
これは非常に重要な概念です。UnityのEditor上でオブジェクトを配置したり、スクリプトで位置を操作したりする際の「1」という数値は、基本的には「1メートル」を意味します。例えば、オブジェクトのX座標を1増やせば、ワールド座標系上で1メートル右に移動することになります。
現実世界のスケール感をVR空間で再現するためには、この単位の理解が不可欠です。家具のモデルであれば実寸に近いサイズ(メートル単位)で作成・配置する必要がありますし、部屋であれば数メートル四方の空間として設計する必要があります。
Web開発の知識を活かす
Web開発でレイアウトやアニメーションを実装する際に、要素の位置(left
, top
)、回転(transform: rotate()
)、スケール(transform: scale()
)などを指定することに慣れている方は多いでしょう。Unityでも、オブジェクトの位置、回転、スケールはTransform
コンポーネントを通じて操作します。
Transform
コンポーネントは、全てのGameObjectにデフォルトでアタッチされており、以下のプロパティを持ちます。
position
: ワールド座標での位置(Vector3型: x, y, z)rotation
: ワールド座標での回転(Quaternion型)localScale
: 親オブジェクトのローカル座標に対するローカルスケール(Vector3型: x, y, z)localPosition
: 親オブジェクトのローカル座標での位置(Vector3型)localRotation
: 親オブジェクトのローカル座標での回転(Quaternion型)
これらのプロパティをスクリプトから操作することで、オブジェクトを動かしたり、向きを変えたり、サイズを変更したりできます。
コード例:オブジェクトの移動
例えば、Web開発でJavaScriptを使って要素を移動させる場合を考えます。
// Web開発(JavaScript)
const element = document.getElementById('my-element');
const currentLeft = parseInt(element.style.left, 10) || 0;
element.style.left = `${currentLeft + 10}px`; // 右に10px移動
これをUnityのC#スクリプトで書くと、以下のようになります。
// Unity (C#)
using UnityEngine;
public class MoveObject : MonoBehaviour
{
// Update is called once per frame
void Update()
{
// 現在の位置を取得
Vector3 currentPosition = transform.position;
// X軸方向に毎フレーム0.01メートル移動
// Time.deltaTimeを掛けることでフレームレートに依存しない滑らかな動きに
currentPosition.x += 0.01f * Time.deltaTime;
// 新しい位置を設定
transform.position = currentPosition;
// あるいは、Translateメソッドを使うことも可能
// transform.Translate(Vector3.right * 0.01f * Time.deltaTime);
}
}
Web開発の経験がある方なら、DOM要素のプロパティを操作する感覚で、UnityのGameObjectのtransform
プロパティを操作できると理解すると、親しみやすいかもしれません。ただし、Webが2D平面での操作が中心なのに対し、UnityではX, Y, Zの3軸すべてを考慮する必要があります。
まとめ
Pico VR開発における3D空間の座標系と単位は、VR世界を構築する上で非常に基本的ながら重要な概念です。
- Unityは右手系の座標系を採用し、Z軸の正の方向は奥行きを指します。
- ワールド座標、ローカル座標といった異なる座標系を理解し、使い分けることが重要です。
- Unityの基本単位は1メートルであり、現実世界のスケール感を意識した開発が必要です。
- オブジェクトの位置、回転、スケールは
Transform
コンポーネントで管理され、Web開発における要素のプロパティ操作と類似した感覚でスクリプトから操作できます。
Web開発で培った論理的な思考やプログラミングのスキルは、Unityでのスクリプト開発においても大いに役立ちます。3D空間ならではの座標や単位の考え方に慣れることで、Pico VR開発の世界への第一歩を踏み出すことができるでしょう。
次の記事では、Unityでの基本的なオブジェクト操作や階層構造について解説する予定です。