Files
2nd/10_Wiki/Topics/Frontend/Mobile-Augmented-Reality.md
T
Antigravity Agent f8b21af4be Wiki cleanup: error-doc removal, dedup merge, link normalization
10_Wiki/Topics 대규모 정리:
- 오류 캡처/미완성 stub 문서 227개 제거
- 교차폴더 중복 43클러스터 병합 (63파일 → redirect)
- 링크명 정규화: 깨진 링크 수정·redirect 직결·개념 매핑 ~2,400건
- 카테고리 MOC 6개 신규 생성
- Graph 섹션 미해결 related-keyword 링크 10,058건 제거

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 23:52:15 +09:00

7.9 KiB

id, title, category, status, canonical_id, aliases, duplicate_of, source_trust_level, confidence_score, verification_status, tags, raw_sources, last_reinforced, github_commit, tech_stack
id title category status canonical_id aliases duplicate_of source_trust_level confidence_score verification_status tags raw_sources last_reinforced github_commit tech_stack
wiki-2026-0508-mobile-augmented-reality Mobile Augmented Reality 10_Wiki/Topics verified self
Mobile AR
Smartphone AR
none A 0.9 applied
ar
mobile
computer-vision
3d
2026-05-10 pending
language framework
Swift / Kotlin / C# ARKit 7 / ARCore / Unity AR Foundation

Mobile Augmented Reality

매 한 줄

"매 스마트폰 매 camera 매 real-time 3D 매 합성 — 매 SLAM 기반 device-pose tracking + plane detection + lighting estimation". Apple ARKit (2017), Google ARCore (2018) 매 starting point, 매 2026 매 ARKit 7 + ARCore 1.45 + Unity AR Foundation 6 매 unified API, 매 LiDAR/depth sensor 매 mesh reconstruction 매 standard.

매 핵심

매 핵심 capabilities

  • 6DoF tracking: 매 device pose (position + rotation) 매 visual-inertial SLAM.
  • Plane detection: 매 horizontal/vertical plane 매 detect.
  • Hit testing: 매 screen ray 매 world surface 매 intersection.
  • Lighting estimation: 매 ambient light + spherical harmonics + shadow.
  • Anchors: 매 world coordinate 매 stable point 매 attach virtual object.
  • People occlusion: 매 ML-based segmentation 매 사람 뒤 / 앞 렌더링.
  • Depth API: 매 LiDAR (iPhone Pro) / ToF (Android) / monocular (ML).
  • Cloud anchors / Persistent anchors: 매 multi-device + multi-session 공유.

매 platforms

  • ARKit 7 (iOS 19): RoomPlan, Object Capture (photogrammetry), Geo Anchors, Vision Pro bridge.
  • ARCore 1.45 (Android): Geospatial API (Streetscape Geometry), Depth API, Cloud Anchors.
  • Unity AR Foundation 6: cross-platform abstraction over ARKit/ARCore.
  • Unreal AR: Niagara particles + Lumen — 매 high-fidelity preferred.
  • WebXR Device API: browser-based AR (Chrome Android, Quest browser).

매 응용

  1. IKEA Place — furniture preview in room.
  2. Snapchat Lenses — face/world filters.
  3. Pokémon GO — geo-anchored creatures.
  4. Google Maps Live View — walking AR navigation.
  5. Industrial maintenance overlays.

💻 패턴

ARKit RealityKit (Swift)

import ARKit
import RealityKit

class ARController: NSObject, ARSessionDelegate {
  let arView = ARView(frame: .zero)

  func start() {
    let config = ARWorldTrackingConfiguration()
    config.planeDetection = [.horizontal, .vertical]
    config.environmentTexturing = .automatic
    if ARWorldTrackingConfiguration.supportsFrameSemantics(.sceneDepth) {
      config.frameSemantics.insert(.sceneDepth) // LiDAR
    }
    arView.session.run(config)
    arView.session.delegate = self
  }

  func placeBox(at screenPoint: CGPoint) {
    guard let result = arView.raycast(from: screenPoint,
                                      allowing: .estimatedPlane,
                                      alignment: .horizontal).first else { return }
    let anchor = AnchorEntity(world: result.worldTransform)
    let box = ModelEntity(mesh: .generateBox(size: 0.1),
                          materials: [SimpleMaterial(color: .red, isMetallic: false)])
    anchor.addChild(box)
    arView.scene.addAnchor(anchor)
  }
}

ARCore (Kotlin)

class ArSceneView(context: Context) : GLSurfaceView(context) {
    private lateinit var session: Session

    fun init(activity: Activity) {
        session = Session(activity)
        val config = Config(session).apply {
            planeFindingMode = Config.PlaneFindingMode.HORIZONTAL_AND_VERTICAL
            lightEstimationMode = Config.LightEstimationMode.ENVIRONMENTAL_HDR
            depthMode = if (session.isDepthModeSupported(Config.DepthMode.AUTOMATIC))
                Config.DepthMode.AUTOMATIC else Config.DepthMode.DISABLED
        }
        session.configure(config)
    }

    fun onTap(x: Float, y: Float) {
        val frame = session.update()
        for (hit in frame.hitTest(x, y)) {
            val trackable = hit.trackable
            if (trackable is Plane && trackable.isPoseInPolygon(hit.hitPose)) {
                val anchor = hit.createAnchor()
                placeModel(anchor)
                return
            }
        }
    }
}

Unity AR Foundation (C#)

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

public class PlaceObject : MonoBehaviour {
    public ARRaycastManager raycaster;
    public GameObject prefab;
    static List<ARRaycastHit> hits = new();

    void Update() {
        if (Input.touchCount == 0) return;
        var touch = Input.GetTouch(0);
        if (touch.phase != TouchPhase.Began) return;

        if (raycaster.Raycast(touch.position, hits, TrackableType.PlaneWithinPolygon)) {
            var pose = hits[0].pose;
            Instantiate(prefab, pose.position, pose.rotation);
        }
    }
}

People occlusion (ARKit)

config.frameSemantics.insert(.personSegmentationWithDepth)
arView.environment.background = .cameraFeed()
arView.renderOptions.remove(.disablePersonOcclusion)

Geospatial anchor (ARCore)

val earth = session.earth ?: return
if (earth.trackingState != TrackingState.TRACKING) return

val anchor = earth.createAnchor(
    37.7749, -122.4194, // lat/lng
    altitude,
    0f, 0f, 0f, 1f // quaternion
)

WebXR (browser AR)

const session = await navigator.xr.requestSession('immersive-ar', {
  requiredFeatures: ['hit-test', 'local'],
})
const refSpace = await session.requestReferenceSpace('local')
const viewerSpace = await session.requestReferenceSpace('viewer')
const hitSource = await session.requestHitTestSource({ space: viewerSpace })

session.requestAnimationFrame(function onFrame(t, frame) {
  const hits = frame.getHitTestResults(hitSource)
  if (hits.length > 0) {
    const pose = hits[0].getPose(refSpace)
    placeReticle(pose.transform.matrix)
  }
  session.requestAnimationFrame(onFrame)
})

Mesh reconstruction (LiDAR)

config.sceneReconstruction = .meshWithClassification
// ARMeshAnchor 매 frame 별 update
func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
  for case let mesh as ARMeshAnchor in anchors {
    addMeshToScene(mesh)
  }
}

매 결정 기준

상황 Approach
iOS-only, 매 native UX ARKit + RealityKit
Android-only ARCore + Sceneform-EQR / Filament
Cross-platform iOS+Android Unity AR Foundation
Web/no-install WebXR (Chrome Android only currently)
High-fidelity / game Unreal AR
Geo-anchored content ARCore Geospatial / ARKit Location Anchors
Indoor mapping ARKit RoomPlan / ARCore Streetscape
Multi-user shared session Cloud Anchors (ARCore) / SharePlay (ARKit)

기본값: 매 cross-platform 매 Unity AR Foundation, 매 native 매 ARKit/ARCore 직접.

🔗 Graph

🤖 LLM 활용

언제: 매 mobile AR feature 설계, 매 ARKit/ARCore 선택, 매 placement/occlusion/lighting 매 implementation. 언제 X: 매 desktop VR/AR (different platforms), 매 marker-based AR only (legacy — Vuforia 같은 different stack).

안티패턴

  • 첫 frame 매 immediate placement: 매 tracking 매 not-converged — 매 plane detection 매 wait.
  • 매 anchor 매 world origin attach: 매 drift 누적 — 매 surface anchor 매 use.
  • 무한 occlusion 활성화 매 mid-tier device: 매 30fps 이하 — 매 capability check.
  • Battery 무시: 매 AR session 매 30 min 매 device thermal throttle — 매 idle pause.
  • Privacy 무시: 매 camera + location 매 prompt + purpose string 필수 (App Store/Play reject).

🧪 검증 / 중복

  • Verified (ARKit 7 docs, ARCore 1.45 docs, Unity AR Foundation 6).
  • 신뢰도 A.

🕓 Changelog

날짜 변경
2026-05-08 Phase 1
2026-05-10 Manual cleanup — ARKit/ARCore/Unity/WebXR patterns + capabilities matrix