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すべてをサポートします。
設定
- Unity Hubでunity 2022 LTS以上をインストール
- Package Managerで"XR Plugin Management"をインストール
- Project Settings → XR Plugin Management → Oculus/OpenXRをチェック
- "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 Editor → New Project → Games → Virtual 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つの用途(ようと)で使われます:
- 入力: 見るだけで選択される(Vision Proの基本入力)
- 最適化: 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 Settings → XR Plug-in Management → Oculus → Stereo Rendering Mode → Multiview
ポリゴン数予算
Quest 3推奨(すいしょう):
- 総ポリゴン: 500K-1M per frame
- Draw call: 100-200
- テクスチャ: 1024x1024以下、ASTC圧縮
乗り物酔い防止
VR酔いはXR開発最大の敵(てき)です。原因は前庭感覚(ぜんていかんかく)不一致: 目は動きを見ているが内耳(ないじ)は静止状態。
予防技法
- 90Hz以上維持(いじ): フレームドロップは即座に酔いを誘発
- Teleport優先: continuous movementより安全
- Vignette: 移動中周辺視野を暗くする
- Snap Turn: 連続回転(れんぞくかいてん)の代わりに45度単位回転
- 仮想の鼻: 意外にも効果的
- 短いセッション: 20分単位の休憩推奨
- アバターの手: 自分の手が見えると安定感
ハプティックフィードバック
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)
- ARグラス: Meta Orion、Snap Spectacles
- ニューラルインターフェース: Neuralink
- 高解像度: 8K per eye 2027年量産予定
- 軽量化: 100g以下XRデバイス
- AI統合: LLMで生成されるNPC
- デジタルツイン: 実物工場の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ゲームにはネイティブが必要です。
参考資料
- Unity XR Documentation
- Unreal Engine VR
- WebXR Device API
- Three.js WebXR Examples
- A-Frame Documentation
- Apple visionOS Developer
- Meta Quest Developer
- OpenXR Specification
- ARKit Documentation
- Unity Meta XR SDK
- PSVR2 Developer
- Khronos - OpenXR Resources
- VR Best Practices - Oculus
- Foveated Rendering Research - NVIDIA
현재 단락 (1/335)
1984年のMacintoshはグラフィカル・ユーザー・インターフェースを大衆化(たいしゅうか)しました。2007年のiPhoneはマルチタッチ・モバイル・コンピューティング時代を開きました。そして2...