Skip to content

Split View: AR/VR & 공간 컴퓨팅 개발 완전 가이드 2025: Unity, WebXR, Apple Vision Pro, Meta Quest

✨ Learn with Quiz
|

AR/VR & 공간 컴퓨팅 개발 완전 가이드 2025: Unity, WebXR, Apple Vision Pro, Meta Quest

XR의 시대: 컴퓨팅의 세 번째 혁명

1984년 Macintosh는 그래픽 유저 인터페이스를 대중화했습니다. 2007년 iPhone은 멀티터치 모바일 컴퓨팅의 시대를 열었습니다. 그리고 2024년 Apple Vision Pro는 "공간 컴퓨팅(Spatial Computing)"이라는 새로운 패러다임을 본격적으로 시작했습니다.

2026년 현재, 우리는 컴퓨팅의 세 번째 대전환 한가운데 있습니다. Meta Quest 3는 700달러 가격으로 mixed reality를 대중화했고, Apple Vision Pro는 8K 마이크로OLED와 R1 칩으로 초저지연 passthrough를 실현했습니다. Sony PSVR2는 PS5와 결합해 콘솔 VR의 기준을 새로 썼고, WebXR은 브라우저만으로 XR 콘텐츠를 제공할 수 있게 만들었습니다.

이 가이드는 AR, VR, MR, XR이라는 용어의 구분부터 시작해, 주요 하드웨어, 주요 개발 플랫폼(Unity, Unreal, WebXR, visionOS, Meta XR SDK), 입력 방식(컨트롤러, 핸드 트래킹, 시선), 공간 매핑, 성능 최적화, 멀미 방지, 그리고 미래 트렌드까지 다룹니다.

한 가지 분명히 해 둘 것이 있습니다. XR 개발은 "VR 게임 만들기"가 아닙니다. 공간 속에 존재하는 인터페이스를 설계하는 일입니다. 2D 화면의 규칙은 대부분 적용되지 않으며, 새로운 제약(멀미, 배터리, 열, 시야각)과 새로운 기회(공간 배치, 핸드 제스처, 현실 혼합)가 등장합니다.

용어 정리: AR vs VR vs MR vs XR

용어정의예시
VR (Virtual Reality)완전히 가상 세계에 몰입Meta Quest 3 VR 모드, Beat Saber
AR (Augmented Reality)현실 위에 디지털 정보 오버레이Pokemon GO, 스마트폰 AR
MR (Mixed Reality)디지털과 현실이 상호작용HoloLens, Quest 3 MR, Vision Pro
XR (Extended Reality)VR+AR+MR 총칭업계 표준 포괄 용어
Spatial Computing공간 자체가 컴퓨팅 인터페이스Apple Vision Pro의 마케팅 용어

Apple은 "spatial computing"이라는 용어를 선호하며, AR/VR 구분을 피합니다. 이는 Vision Pro가 passthrough 기반이며 단일 디바이스에서 두 모드를 넘나들기 때문입니다. Meta는 "mixed reality"를 Quest 3의 핵심 기능으로 홍보합니다.

개발자 관점에서 가장 중요한 구분은 closed vs passthrough입니다:

  • Closed VR: 외부 세계가 완전히 가려짐. 게임, 시뮬레이션에 적합.
  • Passthrough MR: 카메라로 외부를 보면서 디지털 오버레이. 생산성, 교육, 산업용.

하드웨어 풍경: 2026년의 디바이스들

Meta Quest 3 / 3S / Pro

  • Quest 3 (499 USD): 4K+ 디스플레이, Snapdragon XR2 Gen 2, 컬러 passthrough, 핸드 트래킹, 8GB RAM, 128GB/512GB
  • Quest 3S (299 USD): Quest 3 아키텍처에 Quest 2 디스플레이, 엔트리 가격
  • Quest Pro: 시선 추적 + 표정 추적, 기업용

Meta Quest는 2026년 기준 XR 시장 점유율 1위입니다. 가격과 콘텐츠 생태계에서 압도적입니다.

Apple Vision Pro

  • Vision Pro (3,499 USD): 듀얼 4K 마이크로OLED, M2 + R1 칩, 12ms motion-to-photon, EyeSight(외부 디스플레이에 눈 표시), 시선+핸드 입력
  • visionOS: SwiftUI + RealityKit + ARKit 기반
  • positioning: 프리미엄 생산성 디바이스

Vision Pro는 대중화 디바이스가 아닙니다. 개발자 플랫폼이며, 향후 AR 글래스로 가는 징검다리입니다.

PSVR2

  • PSVR2 (549 USD + PS5 필요): OLED 4K, HDR, 헤드셋 햅틱, 시선 추적, 어댑티브 트리거
  • 타깃: 콘솔 게이머, AAA VR 게임

HTC Vive / Pico / Varjo

  • HTC Vive XR Elite: 기업용, passthrough
  • Pico 4 Pro: 중국/아시아 시장 강세
  • Varjo XR-4: 초고해상도, 시뮬레이션/군사

스펙이 왜 중요한가

XR 하드웨어 스펙은 게임/앱 성능 예산과 직결됩니다:

  • 해상도: Quest 3는 2064×2208 per eye. 90Hz 기준 초당 8억 픽셀 이상을 렌더링.
  • 리프레시레이트: 72/90/120Hz. 낮으면 멀미 원인.
  • 시야각(FoV): 수평 100-110도가 표준.
  • GPU: Quest 3의 XR2 Gen 2는 데스크탑 GPU의 5-10% 수준.
  • 배터리: 2-3시간. 열 제한도 성능에 영향.

핵심: XR 게임/앱은 모바일 게임보다 더 빡빡한 성능 예산에서 작동합니다. 양안 렌더링 때문에 draw call과 vertex 수를 실질적으로 반으로 계산해야 합니다.

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은 플레이어의 "카메라 + 컨트롤러"를 담는 루트 오브젝트입니다.

// 씬 구조
// 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 by " + args.interactorObject);
    }

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

XRGrabInteractable 컴포넌트만 붙이면 이 오브젝트는 컨트롤러로 집을 수 있습니다. Rigidbody와 Collider도 필요합니다.

Locomotion (이동 방식)

XR에서 이동은 멀미의 주요 원인입니다. Unity는 두 가지 표준 방식을 제공합니다.

Teleport: 포인터로 목적지를 가리키고 버튼 → 순간 이동. 멀미 없음. 몰입감 중간.

// TeleportationProvider + TeleportInteractor 설정
// 각 바닥 오브젝트에 TeleportationArea 컴포넌트 부착

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;  // 느릴수록 편안
    }
}

권장: 텔레포트를 기본으로 하고, 설정에서 continuous를 켤 수 있게 합니다. vignette(주변 시야 어둡게)과 snap-turn(45도 단위 회전)을 제공하세요.

UI: 월드 스페이스 Canvas

// Canvas → Render Mode → World Space
// Canvas 크기를 0.01 스케일로 설정 (Unity의 1m = 100px)
// Canvas에 TrackedDeviceGraphicRaycaster 추가
// EventSystem에 XR UI Input Module 추가

손이나 컨트롤러로 버튼을 누를 수 있는 월드 공간 UI가 만들어집니다.

Unreal Engine VR: AAA 그래픽

Unreal Engine은 고품질 그래픽이 필요한 AAA VR 게임에 선호됩니다. Meta Horizon, Lone Echo, Asgard's Wrath 등이 Unreal로 제작되었습니다.

VR Template

Unreal EditorNew ProjectGamesVirtual Reality Template

기본 VR Pawn, 모션 컨트롤러, 텔레포트, Grab 시스템이 포함되어 있습니다.

Motion Controller 설정

VR Pawn에는 두 개의 MotionControllerComponent가 있습니다.

// C++ 예시
UPROPERTY(VisibleAnywhere)
UMotionControllerComponent* LeftController;

UPROPERTY(VisibleAnywhere)
UMotionControllerComponent* RightController;

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

Blueprint vs C++

XR 개발에서는 Blueprint가 프로토타이핑에 매우 효율적입니다. 실제 AAA 프로젝트는 C++로 성능 크리티컬 부분을 작성하고, 게임 로직은 Blueprint로 처리하는 하이브리드 방식을 사용합니다.

WebXR: 브라우저로 XR을

WebXR은 W3C 표준 API로 Chrome, Edge, Safari(iOS 17.4+), Meta Quest Browser에서 작동합니다. 설치 없이 XR 콘텐츠를 제공할 수 있는 유일한 방법입니다.

Three.js + WebXR

import * as THREE from 'three';
import { VRButton } from 'three/addons/webxr/VRButton.js';
import { XRControllerModelFactory } from 'three/addons/webxr/XRControllerModelFactory.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.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.xr.enabled = true;
document.body.appendChild(renderer.domElement);
document.body.appendChild(VRButton.createButton(renderer));

// 간단한 cube
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);

// 컨트롤러
const controller1 = renderer.xr.getController(0);
const controller2 = renderer.xr.getController(1);
scene.add(controller1);
scene.add(controller2);

const controllerModelFactory = new XRControllerModelFactory();
const controllerGrip1 = renderer.xr.getControllerGrip(0);
controllerGrip1.add(controllerModelFactory.createControllerModel(controllerGrip1));
scene.add(controllerGrip1);

// 렌더 루프
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-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="#FFC65D"></a-cylinder>
        <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 씬을 만들 수 있게 해 줍니다. 학습 곡선이 매우 낮습니다.

Babylon.js

Babylon.js는 TypeScript 친화적이며 강력한 도구 체인을 제공합니다. Microsoft가 후원합니다.

immersive-web working group

WebXR의 공식 샘플과 명세가 https://immersive-web.github.io 에 있습니다. WebXR Device API의 raycasting, hit-test, anchors, plane detection 기능이 AR에 필수적입니다.

Apple Vision Pro: visionOS 개발

visionOS 기본

Vision Pro는 iOS의 확장이지만 완전히 새로운 개념이 도입되었습니다:

  • 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

RealityKit은 Apple의 3D 엔진입니다. ARKit과 통합되며 AR 앵커, occlusion, 물리 시뮬레이션을 제공합니다.

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:
                // 새로운 mesh 추가
                break
            case .updated:
                // 기존 mesh 업데이트
                break
            case .removed:
                // mesh 제거
                break
            }
        }
    } catch {
        print("ARKit session failed: \(error)")
    }
}

Unity PolySpatial

Unity는 PolySpatial 패키지로 visionOS를 지원합니다. 기존 Unity 프로젝트를 Vision Pro로 포팅할 수 있습니다.

Meta Quest 개발: Meta XR SDK

Meta Quest는 Android 기반이므로 Unity에서 Android Build + Oculus/OpenXR 플러그인으로 개발합니다.

Passthrough API

Quest 3의 컬러 passthrough를 사용해 MR 앱을 만들 수 있습니다.

using UnityEngine;
using Oculus.Passthrough;

public class MRDemo : MonoBehaviour
{
    public OVRPassthroughLayer passthroughLayer;

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

Camera의 Clear Flags를 "Solid Color + 알파 0"으로 설정하면 가상 오브젝트가 현실 위에 그려집니다.

Scene Understanding

Quest 3는 방 안의 벽, 바닥, 가구를 자동으로 인식합니다.

using Meta.XR.MRUtilityKit;

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

    void OnRoomLoaded(MRUKRoom room)
    {
        foreach (var anchor in room.Anchors)
        {
            // FLOOR, CEILING, WALL_FACE, TABLE, BED, etc.
            Debug.Log($"Found {anchor.Label} at {anchor.transform.position}");
        }
    }
}

이를 통해 현실 가구 위에 가상 물체를 올리거나, 벽을 파괴하는 효과를 만들 수 있습니다.

입력 방식: 컨트롤러, 핸드 트래킹, 시선

6DoF 컨트롤러

  • 위치 + 회전 (6 자유도)
  • 햅틱, 버튼, 조이스틱
  • Meta Touch Plus, PSVR2 Sense, Valve Index

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}");
            }
        }
    }
}

Gesture 인식: pinch(엄지+검지), fist(주먹), point(검지만 펴기) 등. Meta XR All-in-One SDK는 gesture 감지 API를 제공합니다.

Eye Tracking (시선 추적)

Vision Pro, Quest Pro, PSVR2가 지원합니다. 시선은 두 가지 용도로 쓰입니다:

  1. 입력: 바라보면 선택됨(Vision Pro의 기본 입력)
  2. 최적화: Foveated Rendering

Vision Pro의 경험은 시선 추적 없이 불가능합니다. 손가락 tap으로 "눈으로 본 것을 클릭"합니다.

Voice

Quest는 Voice SDK를, Vision Pro는 Siri를 제공합니다. 키보드 입력이 어려운 XR에서 음성은 텍스트 입력의 핵심입니다.

공간 매핑 (SLAM)

SLAM(Simultaneous Localization and Mapping)은 카메라/IMU로 환경을 재구성하는 기술입니다. XR 디바이스의 inside-out 트래킹은 SLAM을 기반으로 합니다.

평면 감지 (Plane Detection)

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(가상 물체를 실제 물체 뒤에 숨기기)과 물리 충돌을 구현할 수 있습니다.

Anchors

특정 위치에 가상 오브젝트를 "고정"합니다. 세션 간 지속될 수 있습니다(persistent anchors). 여러 사용자가 같은 공간을 공유하는 shared anchor도 가능합니다.

렌더링 최적화

Foveated Rendering

시선 추적을 이용해 "보는 곳"만 고해상도로 렌더링합니다. 주변부는 저해상도로 처리됩니다. Vision Pro, Quest Pro, PSVR2가 지원합니다. 성능을 30-50% 절약할 수 있습니다.

Fixed Foveated Rendering (FFR)

시선 추적이 없어도 "화면 중앙은 고해상도, 주변부는 저해상도"로 고정 렌더링합니다. Quest 2/3에서 사용됩니다.

Single-Pass Stereo Rendering

왼쪽/오른쪽 눈을 두 번 렌더링하는 대신, 한 번의 pass에서 두 눈을 동시에 렌더링합니다. draw call 수를 절반으로 줄입니다.

Unity에서 활성화:

Project SettingsXR Plug-in ManagementOculusStereo Rendering ModeMultiview

Draw Call 배칭

Unity는 동일한 재질을 사용하는 오브젝트를 자동 배칭합니다. Static Batching과 GPU Instancing을 적극 활용하세요.

폴리곤 수 예산

Quest 3 기준 권장:

  • 총 폴리곤: 500K-1M per frame
  • Draw call: 100-200
  • 텍스처: 1024×1024 이하, ASTC 압축
  • 셰이더: Unlit 또는 Mobile Lit

멀미 방지 (Motion Sickness Prevention)

VR 멀미는 XR 개발의 가장 큰 적입니다. 원인은 vestibular mismatch: 눈은 움직임을 보는데 내이(內耳)는 정지 상태.

예방 기법

  1. 90Hz 이상 유지: 프레임 드롭은 즉각 멀미 유발
  2. 텔레포트 선호: continuous movement보다 안전
  3. Vignette: 이동 중 주변 시야를 어둡게
  4. Snap Turn: 연속 회전 대신 45도 단위 회전
  5. Grounding: 가상 코가 보이도록(의외로 효과적)
  6. 짧은 세션: 20분 단위 휴식 권장
  7. 아바타 손: 자신의 손이 보이면 안정감

프레임레이트는 생명

90Hz = 11ms. 한 프레임이라도 놓치면 사용자는 알아차립니다. Unity Profiler와 OVR Metrics Tool로 지속 모니터링하세요.

햅틱 피드백

컨트롤러 햅틱

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

public class HapticsExample : MonoBehaviour
{
    public XRBaseController controller;

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

햅틱 패턴

  • Tap: 짧고 강한 펄스 (버튼 누름)
  • Rumble: 지속적 진동 (충돌)
  • Texture: 주파수 변화 (질감 표현)

Meta Haptics Studio는 파형 디자인을 지원합니다.

공간 오디오

3D 공간에서 소리가 오는 방향이 들려야 합니다. Unity는 Oculus Audio SDK, Resonance Audio, Steam Audio를 지원합니다.

// AudioSource에 Spatial Blend 1.0 (3D)
// Audio Listener는 Main Camera에 부착
// HRTF 설정으로 방향감 강화

Ambisonics는 360도 공간 음향을 기록하는 표준입니다. 라이브 이벤트나 cinematic VR에서 사용됩니다.

사용 사례

  • 게임: Beat Saber, Half-Life Alyx, Horizon Worlds
  • 훈련: 의료 수술, 군사, 용접 시뮬레이션
  • 교육: 가상 해부학, 역사 시뮬레이션
  • 의료: PTSD 치료, 통증 관리, 재활
  • 생산성: Vision Pro의 Mac 미러링, Horizon Workrooms
  • 소셜: VRChat, Rec Room
  • 산업: BIM 리뷰, 원격 협업, 디지털 트윈

미래 트렌드 (2026-2030)

  1. AR 글래스: Meta Orion, Snap Spectacles, Apple AR Glasses (루머)
  2. 뉴럴 인터페이스: Neuralink, Meta EMG 손목 밴드
  3. 고해상도: 8K per eye 2027년 양산 예상
  4. 경량화: 100g 이하 XR 디바이스
  5. AI 통합: NPC가 LLM으로 생성되는 동적 세계
  6. 디지털 트윈: 실물 공장을 1:1로 재현

퀴즈

Q1. Foveated Rendering은 무엇이고 왜 중요한가요?

Foveated Rendering은 시선 추적을 이용해 사용자가 실제로 보는 영역만 고해상도로, 주변부는 저해상도로 렌더링하는 기술입니다. 인간의 시야는 중앙(fovea)에서만 고해상도를 볼 수 있기 때문에 주변부 품질을 낮춰도 인지하지 못합니다. GPU 부하를 30-50% 절약할 수 있어 XR의 성능 예산에서 매우 중요합니다.

Q2. Texture vs 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 씬은 왼쪽 눈과 오른쪽 눈을 위해 두 번 렌더링됩니다. Single-Pass는 한 번의 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

AR/VR & Spatial Computing Development Complete Guide 2025: Unity, WebXR, Apple Vision Pro, Meta Quest

The XR Era: Computing's Third Revolution

The 1984 Macintosh popularized the graphical user interface. The 2007 iPhone opened the era of multi-touch mobile computing. In 2024, Apple Vision Pro formally kicked off the "spatial computing" paradigm.

By 2026 we are in the middle of computing's third big shift. Meta Quest 3 made mixed reality mainstream at 499 USD. Apple Vision Pro paired 8K micro-OLED displays with the R1 chip to deliver ultra-low-latency passthrough. Sony PSVR2 reset the bar for console VR through its pairing with PS5. WebXR enabled full XR content delivery with nothing more than a browser.

This guide starts with terminology (AR vs VR vs MR vs XR), surveys today's hardware, then dives into the major development platforms (Unity, Unreal, WebXR, visionOS, Meta XR SDK), input modalities (controllers, hand tracking, gaze), spatial mapping, performance optimization, motion sickness mitigation, and future trends.

One thing needs stating up front. XR development is not "making VR games." It is designing interfaces that live in space. Most 2D screen rules no longer apply. New constraints appear (motion sickness, battery, thermal, field-of-view) and so do new opportunities (spatial layout, hand gestures, reality blending).

Terminology: AR vs VR vs MR vs XR

TermDefinitionExample
VR (Virtual Reality)Full immersion in a virtual worldQuest 3 VR, Beat Saber
AR (Augmented Reality)Digital overlay on realityPokemon GO, phone AR
MR (Mixed Reality)Digital and real interactHoloLens, Quest 3 MR, Vision Pro
XR (Extended Reality)Umbrella for VR+AR+MRIndustry standard
Spatial ComputingSpace itself is the interfaceApple Vision Pro marketing

Apple prefers "spatial computing" and sidesteps AR/VR labels because Vision Pro is passthrough-first and blurs both modes. Meta markets "mixed reality" as the flagship Quest 3 capability.

The most important developer distinction is closed vs passthrough:

  • Closed VR: outside world fully occluded. Games and simulations.
  • Passthrough MR: cameras show the outside world with digital overlay. Productivity, education, industrial.

Hardware Landscape: 2026 Devices

Meta Quest 3 / 3S / Pro

  • Quest 3 (499 USD): 4K+ display, Snapdragon XR2 Gen 2, color passthrough, hand tracking, 8GB RAM
  • Quest 3S (299 USD): Quest 3 internals with Quest 2 display, entry price
  • Quest Pro: eye + face tracking, enterprise

Meta Quest leads XR market share in 2026 on both price and content library.

Apple Vision Pro

  • Vision Pro (3,499 USD): dual 4K micro-OLED, M2 + R1, 12ms motion-to-photon, EyeSight external display, gaze + pinch input
  • visionOS: built on SwiftUI, RealityKit, and ARKit

Vision Pro is a developer-first premium device, not a mass-market product. Treat it as a stepping stone toward future AR glasses.

PSVR2

  • PSVR2 (549 USD + PS5): OLED 4K, HDR, headset haptics, eye tracking, adaptive triggers
  • Target: console gamers, AAA VR titles

HTC Vive / Pico / Varjo

  • HTC Vive XR Elite: enterprise, passthrough
  • Pico 4 Pro: strong in China/Asia
  • Varjo XR-4: ultra-high resolution, simulation and defense

Why Specs Matter

XR hardware specs dictate your performance budget:

  • Resolution: Quest 3 renders 2064x2208 per eye. At 90Hz that is 800M+ pixels per second.
  • Refresh rate: 72/90/120Hz. Anything lower induces motion sickness.
  • Field of view: 100-110 degrees horizontal is typical.
  • GPU: Quest 3's XR2 Gen 2 is 5-10% of a desktop GPU.
  • Battery/thermal: 2-3 hours, with throttling.

Key insight: XR has stricter budgets than mobile because everything is rendered twice (one eye per pass, unless using single-pass). Treat draw call and vertex budgets as halved.

Unity XR Toolkit: Cross-Platform King

Unity is the de facto standard for XR in 2026. It targets Quest, Vision Pro (via PolySpatial), HTC, Pico, and PSVR2.

Setup

  1. Install Unity 2022 LTS or newer from Unity Hub
  2. Install "XR Plugin Management" via Package Manager
  3. Project Settings to XR Plugin Management to Oculus/OpenXR
  4. Install "XR Interaction Toolkit"

XR Origin

XR Origin holds the player camera and controllers.

// Hierarchy
// XR Origin
//   Camera Offset
//     Main Camera (XR Camera)
//     Left Controller (XR Controller)
//       Direct Interactor / Ray Interactor
//     Right Controller (XR Controller)

Simple 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");
    }
}

Attach XRGrabInteractable, a Rigidbody, and a Collider. That is enough to make the object grabbable.

Locomotion

VR locomotion is the primary trigger for motion sickness. Unity offers two standard approaches.

Teleport: point, click, jump. No sickness, less immersive.

// TeleportationProvider + TeleportInteractor setup
// Add TeleportationArea to ground meshes

Continuous: joystick moves smoothly. High immersion, possible sickness.

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

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

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

Recommendation: default to teleport, expose continuous as an opt-in. Offer vignette and snap-turn.

World Space UI

// Canvas -> Render Mode -> World Space
// Scale Canvas to 0.01 (Unity 1m = 100px)
// Add TrackedDeviceGraphicRaycaster to Canvas
// EventSystem gets XR UI Input Module

Now hands or controllers can poke buttons in world space.

Unreal Engine VR: AAA Graphics

Unreal is the choice when photorealism matters. Meta Horizon, Lone Echo, Asgard's Wrath all shipped on Unreal.

VR Template

Unreal Editor -> New Project -> Games -> Virtual Reality Template

It ships with a VR Pawn, motion controllers, teleport, and a grab system.

Motion Controller Setup

UPROPERTY(VisibleAnywhere)
UMotionControllerComponent* LeftController;

UPROPERTY(VisibleAnywhere)
UMotionControllerComponent* RightController;

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

Blueprint vs C++

Blueprint is unbeatable for prototyping XR logic. AAA teams typically keep performance-critical paths in C++ and game logic in Blueprint.

WebXR: XR in the Browser

WebXR is a W3C standard API that runs in Chrome, Edge, Safari (iOS 17.4+), and the Meta Quest Browser. It is the only install-free way to deliver XR content.

Three.js + WebXR

import * as THREE from 'three';
import { VRButton } from 'three/addons/webxr/VRButton.js';
import { XRControllerModelFactory } from 'three/addons/webxr/XRControllerModelFactory.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.setPixelRatio(window.devicePixelRatio);
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);

const controller1 = renderer.xr.getController(0);
const controller2 = renderer.xr.getController(1);
scene.add(controller1);
scene.add(controller2);

const controllerModelFactory = new XRControllerModelFactory();
const controllerGrip1 = renderer.xr.getControllerGrip(0);
controllerGrip1.add(controllerModelFactory.createControllerModel(controllerGrip1));
scene.add(controllerGrip1);

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

A-Frame: Declarative 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-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="#FFC65D"></a-cylinder>
        <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 lets you author a VR scene in HTML. Minimal learning curve.

Babylon.js

Babylon.js is TypeScript-friendly with a mature toolchain. Microsoft is a major sponsor.

immersive-web working group

Specs and reference samples live at https://immersive-web.github.io. Raycasting, hit-test, anchors, and plane detection are the AR-critical features.

Apple Vision Pro: visionOS Development

visionOS Primer

Vision Pro extends iOS with new spatial primitives:

  • Shared Space: multiple apps coexist
  • Full Space: one app owns the environment
  • Windows: 2D UI panels
  • Volumes: 3D content containers
  • Immersive Space: fully immersive environment

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

RealityKit is Apple's native 3D engine. It integrates with ARKit for anchors, occlusion, and physics.

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)")
    }
}

Unity PolySpatial

Unity ships PolySpatial to target visionOS from existing Unity projects, preserving most of your Unity workflow.

Meta Quest Development: Meta XR SDK

Quest is Android under the hood. Build Android in Unity with the Oculus or OpenXR plugin.

Passthrough API

using UnityEngine;
using Oculus.Passthrough;

public class MRDemo : MonoBehaviour
{
    public OVRPassthroughLayer passthroughLayer;

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

Set camera clear flags to solid color with alpha 0 and virtual objects are composited over the real world.

Scene Understanding

Quest 3 automatically identifies walls, floors, furniture.

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}");
        }
    }
}

With this you can place virtual objects on real tables, or break through real walls in a game.

Input Modalities

6DoF Controllers

  • Position plus rotation (6 degrees of freedom)
  • Haptics, buttons, thumbsticks
  • Meta Touch Plus, PSVR2 Sense, Valve Index

Hand Tracking

Camera-based tracking without controllers.

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}");
            }
        }
    }
}

Gestures: pinch (thumb + index), fist, point. The Meta XR All-in-One SDK provides gesture detection APIs.

Eye Tracking

Vision Pro, Quest Pro, and PSVR2 ship with eye tracking. It serves two purposes:

  1. Input: look and pinch is Vision Pro's primary interaction model.
  2. Optimization: foveated rendering.

Vision Pro's UX is impossible without eye tracking. You select by looking at something and pinching your fingers.

Voice

Quest has Voice SDK, Vision Pro has Siri. Keyboard input is hard in XR, so voice is critical.

Spatial Mapping (SLAM)

SLAM (Simultaneous Localization and Mapping) reconstructs the environment from cameras and IMU. XR inside-out tracking is built on SLAM.

Plane Detection

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 and Vision Pro build live 3D meshes of the room. This enables occlusion (hiding virtual objects behind real ones) and physics collisions.

Anchors

Anchors pin virtual objects to physical locations. They can persist across sessions and be shared between users.

Rendering Optimization

Foveated Rendering

Uses eye tracking to render only the fovea area at full resolution. The periphery runs at lower resolution. Vision Pro, Quest Pro, and PSVR2 support it, and it saves 30-50% GPU work.

Fixed Foveated Rendering (FFR)

Without eye tracking, the center of the display stays full resolution and peripheral areas render lower. Quest 2/3 rely on FFR.

Single-Pass Stereo Rendering

Instead of rendering the left and right eyes separately, single-pass rendering issues one draw call for both eyes. It halves the draw call count.

In Unity:

Project Settings -> XR Plug-in Management -> Oculus -> Stereo Rendering Mode -> Multiview

Draw Call Batching

Unity automatically batches objects sharing the same material. Leverage Static Batching and GPU Instancing aggressively.

Polygon Budgets

Quest 3 recommendations:

  • Polygons per frame: 500K-1M
  • Draw calls: 100-200
  • Textures: 1024x1024 max, ASTC compression
  • Shaders: Unlit or Mobile Lit

Motion Sickness Prevention

VR sickness is the biggest challenge in XR. The root cause is vestibular mismatch: your eyes see motion while your inner ear senses none.

Mitigation Techniques

  1. Maintain 90Hz or higher. Even a single dropped frame is noticeable.
  2. Prefer teleport over continuous movement.
  3. Vignette during motion (darken peripheral vision).
  4. Snap-turn (45 degree increments).
  5. Visible virtual nose for grounding.
  6. Short sessions with 20-minute breaks.
  7. Show the user's hands - visible avatars increase comfort.

Frame Rate Is Survival

90Hz means 11ms per frame. Use Unity Profiler and OVR Metrics Tool continuously to catch drops.

Haptic Feedback

Controller Haptics

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

public class HapticsExample : MonoBehaviour
{
    public XRBaseController controller;

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

Haptic Patterns

  • Tap: short, strong pulse (button press)
  • Rumble: sustained vibration (collision)
  • Texture: frequency variation (surface feel)

Meta Haptics Studio supports authoring haptic waveforms.

Spatial Audio

Sound should appear to come from correct 3D directions. Unity supports Oculus Audio SDK, Resonance Audio, Steam Audio.

// AudioSource Spatial Blend 1.0 (3D)
// Audio Listener attached to Main Camera
// Enable HRTF for directional cues

Ambisonics is the format for 360-degree sound, used in cinematic VR and live events.

Use Cases

  • Gaming: Beat Saber, Half-Life Alyx, Horizon Worlds
  • Training: medical surgery, military, welding
  • Education: virtual anatomy, historical simulation
  • Healthcare: PTSD therapy, pain management, rehabilitation
  • Productivity: Vision Pro Mac Virtual Display, Horizon Workrooms
  • Social: VRChat, Rec Room
  • Industrial: BIM review, remote collaboration, digital twins
  1. AR glasses: Meta Orion, Snap Spectacles, rumored Apple glasses
  2. Neural interfaces: Neuralink, Meta EMG wristbands
  3. Higher resolution: 8K per eye by 2027
  4. Lighter weight: sub-100g wearables
  5. AI-native content: LLM-driven NPCs, procedural worlds
  6. Digital twins: live 1:1 factory mirrors

Quiz

Q1. What is Foveated Rendering and why does it matter?

Foveated rendering uses eye tracking so only the area the user fixates on is rendered at full resolution; the periphery is rendered lower. Human vision resolves detail only in the fovea, so users do not notice the reduced peripheral quality. It saves 30-50% of GPU work, which is enormous for XR's tight budgets.

Q2. Teleport vs continuous locomotion - which is safer?

Teleport is much safer. VR sickness stems from visual motion with no vestibular motion. Teleport eliminates the mismatch entirely. Continuous movement is more immersive but triggers sickness in a significant fraction of users. The standard recommendation is to default to teleport and offer continuous as a toggle.

Q3. What is the core difference between Quest 3 and Vision Pro?

Price is the headline (499 vs 3499 USD), but the deeper split is input. Quest 3 is controller-first with hand tracking as backup. Vision Pro has no controllers; gaze + pinch is the primary input. Vision Pro also has much higher resolution and better passthrough. Quest is a gaming device; Vision Pro is a productivity device.

Q4. How does Single-Pass Stereo Rendering improve performance?

Traditional VR renders each eye separately, doubling draw calls and CPU work. Single-pass renders both eyes in one draw call, roughly halving CPU overhead. Unity exposes it as Multiview or Single Pass Instanced, and CPU-bound XR apps see significant gains.

Q5. WebXR trade-offs?

Pros: no install, cross-platform (Quest, Vision Pro, desktop VR), shareable by URL, low entry barrier. Cons: slower than native (complex shaders struggle), limited access to advanced features (hand tracking, anchors), weaker audio and haptics. Great for marketing, education, and light experiences; native is still required for AAA.

References

  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