Pico VR開発スタートガイド

Webエンジニアが学ぶPico VR:Unityでの3D座標系と単位の基本

Tags: Pico VR, Unity, 3D座標系, 単位, Web開発, 基礎

Pico VR開発を始めるにあたり、Web開発の経験をお持ちの皆様が最初に戸惑うことの一つに、3D空間の概念、特に「座標系」と「単位」があるかと思います。Webサイトのレイアウトでは、通常2Dの平面上でピクセルやemといった単位を用いて、画面の左上を原点として要素を配置します。しかし、VRの世界は奥行きを持つ3次元空間であり、座標の考え方や使用する単位が異なります。

この記事では、Pico VR開発の基礎として、Unityにおける3D空間の座標系と単位の基本概念を、Web開発での知識と比較しながら分かりやすく解説します。

3D空間の座標系とは

Web開発におけるブラウザのビューポートのように、3D空間にも基準となる座標系が存在します。これは、空間内のあらゆる点やオブジェクトの位置、向き、大きさを数値で表現するための規約です。主に以下の3軸で構成されます。

これらの軸がどのように配置されるかによって、「右手系」と「左手系」という二つの主要な座標系があります。

右手系と左手系

Unityは右手系の座標系を採用しています。特に注意が必要なのは、Z軸の正の方向が「手前(カメラ方向)」ではなく「奥」を指す点です。これはWeb開発でCSSのz-indexが数値が大きいほど手前に表示されるのとは逆の感覚になる場合があります。

Unityにおける座標系

Unityには、いくつかの種類の座標系が存在し、それぞれ異なる基準でオブジェクトの位置や向きを表現します。

VR開発では、特にワールド座標とローカル座標の理解が重要です。例えば、プレイヤーの頭(カメラ)はワールド座標で移動し、プレイヤーの手(コントローラーやハンドトラッキング)はプレイヤー自身(頭や体)のローカル座標や、ワールド座標で表現されることがあります。

Unityにおける単位

Web開発ではピクセル(px)、em、rem、%などが単位として使われますが、Unityの3D空間ではメートル(m)が基本単位となります。

これは非常に重要な概念です。UnityのEditor上でオブジェクトを配置したり、スクリプトで位置を操作したりする際の「1」という数値は、基本的には「1メートル」を意味します。例えば、オブジェクトのX座標を1増やせば、ワールド座標系上で1メートル右に移動することになります。

現実世界のスケール感をVR空間で再現するためには、この単位の理解が不可欠です。家具のモデルであれば実寸に近いサイズ(メートル単位)で作成・配置する必要がありますし、部屋であれば数メートル四方の空間として設計する必要があります。

Web開発の知識を活かす

Web開発でレイアウトやアニメーションを実装する際に、要素の位置(left, top)、回転(transform: rotate())、スケール(transform: scale())などを指定することに慣れている方は多いでしょう。Unityでも、オブジェクトの位置、回転、スケールはTransformコンポーネントを通じて操作します。

Transformコンポーネントは、全てのGameObjectにデフォルトでアタッチされており、以下のプロパティを持ちます。

これらのプロパティをスクリプトから操作することで、オブジェクトを動かしたり、向きを変えたり、サイズを変更したりできます。

コード例:オブジェクトの移動

例えば、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世界を構築する上で非常に基本的ながら重要な概念です。

Web開発で培った論理的な思考やプログラミングのスキルは、Unityでのスクリプト開発においても大いに役立ちます。3D空間ならではの座標や単位の考え方に慣れることで、Pico VR開発の世界への第一歩を踏み出すことができるでしょう。

次の記事では、Unityでの基本的なオブジェクト操作や階層構造について解説する予定です。