Skip to content

✍️ 필사 모드: AR/VR & 空間(くうかん)コンピューティング開発完全ガイド2025: Unity、WebXR、Apple Vision Pro、Meta Quest

日本語
0%
정확도 0%
💡 왼쪽 원문을 읽으면서 오른쪽에 따라 써보세요. Tab 키로 힌트를 받을 수 있습니다.

XRの時代: コンピューティングの第三次革命

1984年のMacintoshはグラフィカル・ユーザー・インターフェースを大衆化(たいしゅうか)しました。2007年のiPhoneはマルチタッチ・モバイル・コンピューティング時代を開きました。そして2024年、Apple Vision Proは「空間(くうかん)コンピューティング(Spatial Computing)」という新しいパラダイムを本格的(ほんかくてき)に開始(かいし)しました。

2026年現在、私たちはコンピューティングの第三次(だいさんじ)大転換(だいてんかん)の真っ只中(まっただなか)にいます。Meta Quest 3は499ドルでミックスド・リアリティを大衆化し、Apple Vision Proは8Kマイクロ(Micro)OLEDとR1チップで超低遅延(ちょうていちえん)passthroughを実現(じつげん)しました。

このガイドはAR、VR、MR、XR用語の区分(くぶん)から始まり、主要(しゅよう)ハードウェア、主要開発プラットフォーム(Unity、Unreal、WebXR、visionOS、Meta XR SDK)、入力方式(コントローラ、ハンドトラッキング、視線(しせん))、空間マッピング、性能最適化、乗り物酔い防止、そして未来(みらい)のトレンドまでを扱います。

XR開発は「VRゲームを作ること」ではありません。空間の中に存在するインターフェースを設計する仕事です。

用語整理: AR対VR対MR対XR

用語定義(ていぎ)
VR (Virtual Reality)完全な仮想世界への没入(ぼつにゅう)Meta Quest 3 VRモード
AR (Augmented Reality)現実の上にデジタル情報をオーバーレイPokemon GO
MR (Mixed Reality)デジタルと現実が相互作用HoloLens、Vision Pro
XR (Extended Reality)VR+AR+MRの総称業界標準
Spatial Computing空間自体がインターフェースApple Vision Proマーケティング

開発者(かいはつしゃ)の観点(かんてん)から最も重要な区分は閉じたVR対passthroughのMRです。

ハードウェア風景: 2026年のデバイス

Meta Quest 3 / 3S / Pro

  • Quest 3 (499ドル): 4K+ディスプレイ、Snapdragon XR2 Gen 2、カラーpassthrough、ハンドトラッキング
  • Quest 3S (299ドル): Quest 3のアーキテクチャにQuest 2のディスプレイ、エントリー価格
  • Quest Pro: 視線追跡(ついせき)+表情(ひょうじょう)追跡、企業向け

Meta Questは2026年基準でXR市場(しじょう)シェア1位です。

Apple Vision Pro

  • Vision Pro (3,499ドル): デュアル4KマイクロOLED、M2 + R1チップ、12ms motion-to-photon、視線+ハンド入力
  • visionOS: SwiftUI + RealityKit + ARKit基盤
  • 位置付(いちづ)け: プレミアム生産性(せいさんせい)デバイス

PSVR2

  • PSVR2 (549ドル + PS5必要): OLED 4K、HDR、ヘッドセットハプティック、視線追跡
  • ターゲット: コンソールゲーマー、AAA VRゲーム

HTC Vive / Pico / Varjo

  • HTC Vive XR Elite: 企業向け、passthrough
  • Pico 4 Pro: 中国/アジア市場で強い
  • Varjo XR-4: 超高解像度、シミュレーション/軍事

スペックの重要性

Quest 3基準: 2064×2208 per eye、90Hz、秒あたり8億ピクセル以上をレンダリングする必要があります。XRアプリはモバイルゲームよりもさらに厳しい性能予算で動作(どうさ)します。

Unity XR Toolkit: クロスプラットフォームの王様

Unityは2026年基準でXR開発の事実上(じじつじょう)の標準です。Quest、Vision Pro (PolySpatial)、HTC、Pico、PSVR2すべてをサポートします。

設定

  1. Unity Hubでunity 2022 LTS以上をインストール
  2. Package Managerで"XR Plugin Management"をインストール
  3. Project Settings → XR Plugin Management → Oculus/OpenXRをチェック
  4. "XR Interaction Toolkit"パッケージをインストール

XR Origin設定

// シーン構造
// XR Origin
//   Camera Offset
//     Main Camera (XR Camera)
//     Left Controller (XR Controller)
//       Direct Interactor / Ray Interactor
//     Right Controller (XR Controller)

シンプルなGrab Interaction

using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;

public class PickupItem : MonoBehaviour
{
    private XRGrabInteractable grabInteractable;

    void Awake()
    {
        grabInteractable = GetComponent<XRGrabInteractable>();
        grabInteractable.selectEntered.AddListener(OnGrabbed);
        grabInteractable.selectExited.AddListener(OnReleased);
    }

    void OnGrabbed(SelectEnterEventArgs args)
    {
        Debug.Log("Grabbed");
    }

    void OnReleased(SelectExitEventArgs args)
    {
        Debug.Log("Released");
    }
}

Locomotion (移動方式)

XRで移動は乗り物酔いの主要原因(しゅようげんいん)です。

Teleport: ポインタで目的地(もくてきち)を指(さ)し、ボタン → 瞬間(しゅんかん)移動。酔わない。

Continuous Movement: ジョイスティックで滑(なめ)らかに移動。没入感は高いが酔いを誘発(ゆうはつ)。

using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;

[RequireComponent(typeof(ContinuousMoveProviderBase))]
public class ComfortSettings : MonoBehaviour
{
    public ContinuousMoveProviderBase moveProvider;

    void Start()
    {
        moveProvider.moveSpeed = 2.0f;
    }
}

推奨(すいしょう): Teleportを基本(きほん)にしてContinuousはオプションで。

UI: World Space Canvas

// Canvas → Render Mode → World Space
// スケール0.01
// TrackedDeviceGraphicRaycaster追加
// EventSystemにXR UI Input Module

Unreal Engine VR: AAA graphics

Unreal Engineは高品質グラフィックが必要なAAA VRゲームに好(この)まれます。

VR Template

Unreal EditorNew ProjectGamesVirtual Reality Template

基本VR Pawn、モーションコントローラ、テレポート、Grabシステムが含まれています。

Motion Controller設定

UPROPERTY(VisibleAnywhere)
UMotionControllerComponent* LeftController;

LeftController = CreateDefaultSubobject<UMotionControllerComponent>(TEXT("LeftController"));
LeftController->SetupAttachment(VROrigin);
LeftController->SetTrackingSource(EControllerHand::Left);

WebXR: ブラウザでXR

WebXRはW3C標準APIで、Chrome、Edge、Safari、Meta Quest Browserで動作します。インストール不要でXRコンテンツを提供(ていきょう)できる唯一(ゆいいつ)の方法(ほうほう)です。

Three.js + WebXR

import * as THREE from 'three';
import { VRButton } from 'three/addons/webxr/VRButton.js';

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.xr.enabled = true;
document.body.appendChild(renderer.domElement);
document.body.appendChild(VRButton.createButton(renderer));

const geometry = new THREE.BoxGeometry(0.2, 0.2, 0.2);
const material = new THREE.MeshStandardMaterial({ color: 0x44aa88 });
const cube = new THREE.Mesh(geometry, material);
cube.position.set(0, 1.5, -1);
scene.add(cube);

const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(1, 1, 1);
scene.add(light);

renderer.setAnimationLoop(() => {
    cube.rotation.y += 0.01;
    renderer.render(scene, camera);
});

A-Frame: 宣言(せんげん)的VR

<!DOCTYPE html>
<html>
<head>
    <script src="https://aframe.io/releases/1.5.0/aframe.min.js"></script>
</head>
<body>
    <a-scene background="color: #ECECEC">
        <a-box position="-1 0.5 -3" rotation="0 45 0" color="#4CC3D9"></a-box>
        <a-sphere position="0 1.25 -5" radius="1.25" color="#EF2D5E"></a-sphere>
        <a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane>
        <a-camera>
            <a-cursor></a-cursor>
        </a-camera>
    </a-scene>
</body>
</html>

A-FrameはHTMLだけでVRシーンを作成できるようにします。

Apple Vision Pro: visionOS開発

visionOS基本

  • Shared Space: 複数(ふくすう)のアプリが共存(きょうぞん)する空間
  • Full Space: 一つのアプリが空間を独占(どくせん)
  • Windows: 2D UIウィンドウ
  • Volumes: 3Dコンテンツコンテナ
  • Immersive Space: 完全(かんぜん)な没入環境(かんきょう)

SwiftUI for Spatial

import SwiftUI
import RealityKit

@main
struct MyVisionApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }

        ImmersiveSpace(id: "ImmersiveSpace") {
            ImmersiveView()
        }
    }
}

struct ContentView: View {
    @Environment(\.openImmersiveSpace) var openImmersiveSpace

    var body: some View {
        VStack {
            Text("Hello Vision Pro")
                .font(.largeTitle)

            Button("Enter Immersive") {
                Task {
                    await openImmersiveSpace(id: "ImmersiveSpace")
                }
            }
            .padding()
        }
    }
}

struct ImmersiveView: View {
    var body: some View {
        RealityView { content in
            let cube = ModelEntity(
                mesh: .generateBox(size: 0.2),
                materials: [SimpleMaterial(color: .blue, isMetallic: false)]
            )
            cube.position = [0, 1.5, -1]
            content.add(cube)
        }
    }
}

RealityKit

import RealityKit
import ARKit

func setupARScene(content: RealityViewContent) async {
    let session = ARKitSession()
    let meshTracking = SceneReconstructionProvider()

    do {
        try await session.run([meshTracking])

        for await update in meshTracking.anchorUpdates {
            switch update.event {
            case .added:
                break
            case .updated:
                break
            case .removed:
                break
            }
        }
    } catch {
        print("ARKit session failed: \(error)")
    }
}

Meta Quest開発: Meta XR SDK

Passthrough API

using UnityEngine;
using Oculus.Passthrough;

public class MRDemo : MonoBehaviour
{
    public OVRPassthroughLayer passthroughLayer;

    void Start()
    {
        passthroughLayer.hidden = false;
        passthroughLayer.overlayType = OVROverlay.OverlayType.Underlay;
    }
}

Scene Understanding

using Meta.XR.MRUtilityKit;

public class RoomAnchor : MonoBehaviour
{
    void Start()
    {
        MRUK.Instance.LoadSceneFromDevice();
    }

    void OnRoomLoaded(MRUKRoom room)
    {
        foreach (var anchor in room.Anchors)
        {
            Debug.Log($"Found {anchor.Label} at {anchor.transform.position}");
        }
    }
}

入力方式

6DoFコントローラ

  • 位置 + 回転 (6自由度)
  • ハプティック、ボタン、ジョイスティック

Hand Tracking

using UnityEngine;
using UnityEngine.XR.Hands;

public class HandTrackingExample : MonoBehaviour
{
    private XRHandSubsystem handSubsystem;

    void Start()
    {
        var subsystems = new System.Collections.Generic.List<XRHandSubsystem>();
        SubsystemManager.GetSubsystems(subsystems);
        if (subsystems.Count > 0) handSubsystem = subsystems[0];
    }

    void Update()
    {
        if (handSubsystem == null || !handSubsystem.running) return;

        var leftHand = handSubsystem.leftHand;
        if (leftHand.isTracked)
        {
            var indexTip = leftHand.GetJoint(XRHandJointID.IndexTip);
            if (indexTip.TryGetPose(out var pose))
            {
                Debug.Log($"Left index tip at {pose.position}");
            }
        }
    }
}

ジェスチャ認識(にんしき): pinch(親指(おやゆび)+人差(ひとさ)し指(ゆび))、fist(拳(こぶし))、point。

視線追跡(しせんついせき)

Vision Pro、Quest Pro、PSVR2がサポートします。視線は2つの用途(ようと)で使われます:

  1. 入力: 見るだけで選択される(Vision Proの基本入力)
  2. 最適化: Foveated Rendering

音声

Questは Voice SDKを、Vision ProはSiriを提供します。

空間マッピング (SLAM)

SLAMはカメラ/IMUで環境を再構成(さいこうせい)する技術(ぎじゅつ)です。

平面(へいめん)検出

using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;

public class PlaneDetector : MonoBehaviour
{
    public ARPlaneManager planeManager;

    void Start()
    {
        planeManager.planesChanged += OnPlanesChanged;
    }

    void OnPlanesChanged(ARPlanesChangedEventArgs args)
    {
        foreach (var plane in args.added)
        {
            Debug.Log($"New plane: {plane.alignment} at {plane.center}");
        }
    }
}

Mesh Generation

Quest 3とVision Proは部屋の3Dメッシュをリアルタイムで生成(せいせい)します。これによりocclusion(仮想オブジェクトを実際の物体の後ろに隠すこと)と物理衝突(しょうとつ)を実装できます。

レンダリング最適化

Foveated Rendering

視線追跡を利用して「見ている場所」のみを高解像度でレンダリングします。周辺部は低解像度で処理されます。性能を30-50%節約できます。

Fixed Foveated Rendering (FFR)

視線追跡なしでも画面中央は高解像度、周辺部は低解像度で固定レンダリングします。

Single-Pass Stereo Rendering

Unity:

Project SettingsXR Plug-in ManagementOculusStereo Rendering ModeMultiview

ポリゴン数予算

Quest 3推奨(すいしょう):

  • 総ポリゴン: 500K-1M per frame
  • Draw call: 100-200
  • テクスチャ: 1024x1024以下、ASTC圧縮

乗り物酔い防止

VR酔いはXR開発最大の敵(てき)です。原因は前庭感覚(ぜんていかんかく)不一致: 目は動きを見ているが内耳(ないじ)は静止状態。

予防技法

  1. 90Hz以上維持(いじ): フレームドロップは即座に酔いを誘発
  2. Teleport優先: continuous movementより安全
  3. Vignette: 移動中周辺視野を暗くする
  4. Snap Turn: 連続回転(れんぞくかいてん)の代わりに45度単位回転
  5. 仮想の鼻: 意外にも効果的
  6. 短いセッション: 20分単位の休憩推奨
  7. アバターの手: 自分の手が見えると安定感

ハプティックフィードバック

using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;

public class HapticsExample : MonoBehaviour
{
    public XRBaseController controller;

    public void Vibrate()
    {
        controller.SendHapticImpulse(0.5f, 0.2f);
    }
}

空間オーディオ

3D空間で音の方向が聞こえる必要があります。Oculus Audio SDK、Resonance Audio、Steam Audioが使われます。

使用事例

  • ゲーム: Beat Saber、Half-Life Alyx
  • 訓練: 医療手術(しゅじゅつ)、軍事(ぐんじ)、溶接(ようせつ)
  • 教育: 仮想解剖学、歴史(れきし)シミュレーション
  • 医療: PTSD治療(ちりょう)、痛み管理、リハビリ
  • 生産性: Vision ProのMacミラーリング
  • ソーシャル: VRChat、Rec Room
  • 産業(さんぎょう): BIMレビュー、デジタルツイン

未来トレンド (2026-2030)

  1. ARグラス: Meta Orion、Snap Spectacles
  2. ニューラルインターフェース: Neuralink
  3. 高解像度: 8K per eye 2027年量産予定
  4. 軽量化: 100g以下XRデバイス
  5. AI統合: LLMで生成されるNPC
  6. デジタルツイン: 実物工場の1:1再現

クイズ

Q1. Foveated Renderingとは何ですか?なぜ重要ですか?

Foveated Renderingは視線追跡を利用し、ユーザーが実際に見ている領域のみを高解像度で、周辺部は低解像度でレンダリングする技術です。人間の視野は中央(fovea)でのみ高解像度を見られるため、周辺部の品質を下げても気づきません。GPU負荷を30-50%節約でき、XRの性能予算において非常に重要です。

Q2. TeleportとContinuous locomotionのどちらが乗り物酔いに安全ですか?

Teleportの方がはるかに安全です。視覚的動きと内耳(前庭系)の静止状態との不一致がVR酔いの原因ですが、teleportは瞬間移動のため動きが発生せず不一致が起こりません。Continuousは没入感が高いですがユーザーによっては酔いを誘発します。推奨はteleportを基本としcontinuousをオプションで提供することです。

Q3. Quest 3とVision Proの核心的な違いは?

価格(Quest 3は499ドル、Vision Proは3,499ドル)が最大の違いですが、開発観点では入力方式が異なります。Quest 3はコントローラ中心でハンドトラッキングは補助です。Vision Proは視線+ピンチが基本でコントローラがありません。解像度もVision Proがはるかに高く、passthrough品質も優秀です。Quest 3はゲームに、Vision Proは生産性に重点を置きます。

Q4. Single-Pass Stereo Renderingはどう性能を改善しますか?

伝統的にVRシーンは左目と右目のために2回レンダリングされます。Single-Passは1回のdraw callで両眼を同時に描きCPUとGPUのオーバーヘッドを半分に削減します。Unityでは Multiviewまたは Single Pass Instancedモードで有効化され、特にCPUバウンドのXRゲームで大きな効果があります。

Q5. WebXRの長所と短所は何ですか?

長所はインストール不要、クロスプラットフォーム(Quest、Vision Pro、デスクトップVR)、URL共有可能、参入障壁が低いことです。短所はネイティブ性能に比べて遅い(複雑なシェーダーは困難)、高度な機能(ハンドトラッキング、anchorsなど)へのアクセスが制限的、オーディオ品質とハプティックサポートが不足です。マーケティング、教育、簡単な体験用に良く、AAAゲームにはネイティブが必要です。

参考資料

  1. Unity XR Documentation
  2. Unreal Engine VR
  3. WebXR Device API
  4. Three.js WebXR Examples
  5. A-Frame Documentation
  6. Apple visionOS Developer
  7. Meta Quest Developer
  8. OpenXR Specification
  9. ARKit Documentation
  10. Unity Meta XR SDK
  11. PSVR2 Developer
  12. Khronos - OpenXR Resources
  13. VR Best Practices - Oculus
  14. Foveated Rendering Research - NVIDIA

현재 단락 (1/335)

1984年のMacintoshはグラフィカル・ユーザー・インターフェースを大衆化(たいしゅうか)しました。2007年のiPhoneはマルチタッチ・モバイル・コンピューティング時代を開きました。そして2...

작성 글자: 0원문 글자: 11,851작성 단락: 0/335