Table of Contents

AR 驅動的 3D 渲染

AR 應用的開發需要解決一個基礎問題,就是 AR 內容的渲染。本文會以平面圖像跟踪為例,描述 AR 應用的基本模組、流程和渲染實現。

典型的 AR 應用流程

一個典型的 AR 應用,通常是從攝影機圖像中識別特定的圖像、物體或場景,跟踪其位置和姿態,並按照這個位置和姿態渲染顯示虛擬內容(3D 模型)的過程。

image tracking

例如上圖是一個平面圖形跟踪的 AR 應用

以下為應用流程示意圖。

flowchart TD
    CameraDevice[Camera Device]
    Tracker[Tracker]
    Renderer[Renderer]

    CameraDevice -->|Image Frame| Tracker
    Tracker -->|Image Frame + Tracked Pose| Renderer

流程中有以下一些模組。

模組 作用
物理相機 提供輸入圖像幀的序列。圖像幀包括圖像,圖像產生的時間戳,有時候也可以帶有攝影頭在空間中的位置和姿態
跟踪器 從圖像幀計算跟踪目標的位置和姿態。根據跟踪目標的不同,存在各種各樣的跟踪器,例如平面圖像跟踪器和 3D 物件跟踪器
渲染器 用於將相機圖像和跟踪物件對應的 3D 模型渲染到螢幕上。在某些 AR 眼鏡上,也可能不渲染相機圖像,只渲染 3D 模型

手機上的渲染

手機上的渲染分成相機畫面的渲染和虛擬物體的渲染兩部分。

相機畫面的渲染

camera image

相機畫面渲染時,有一些需要注意的參數。

  • 縮放模式

    通常需要將相機畫面填滿整個螢幕,或者填滿一個視窗,這時候會面臨相機畫面和螢幕/視窗的寬高比不一致的問題。

    假設我們要求相機畫面中心和螢幕/視窗中心對齊,保持寬高比不變,則有兩種常見的縮放模式:等比縮放、等比填充。

    縮放模式 效果
    等比縮放 在螢幕上顯示所有內容,但會在左右或者上下留黑邊
    等比填充 不會有黑邊,但會在左右或者上線裁掉部分畫面
  • 相機圖像旋轉

    在手機上,物理相機記錄的圖像通常相對於機身固定,不隨螢幕顯示方向變化而變化。但手機機身朝向的變化會影響到我們對於圖像的上下左右方向的定義。渲染時,當前螢幕顯示方向也會影響到顯示的圖像的方向。

    通常在渲染時,需要確定一個相機圖像相對於螢幕顯示方向的旋轉角。

  • 相機圖像翻轉

    有些情況下會用到前置攝影頭,此時通常需要將畫面左右翻轉,以使得畫面看起來像是一面鏡子。

虛擬物體的渲染

virtual object

在手機上渲染虛擬物體,需要將虛擬物體和相機畫面對準。這要求我們將渲染相機和物體都放置在和真實空間完全對應的虛擬空間中,並使用物理相機相同的視場角、寬高比來進行渲染。相機畫面和虛擬物體經過的透視投影變換一模一樣,除了相機畫面的透視投影變換大部分是發生在物理相機中,而虛擬物體的透視投影變換完全是一個計算過程。

頭顯上的渲染

頭顯上的渲染和手機上有一些差別,需要分兩種情況。

  • VST

    Video See-Through,是指頭顯通過物理相機捕捉圖像,然後在頭顯的螢幕上顯示相機圖像和虛擬內容的 AR 技術,典型代表是 Vision Pro。通常相機圖像和虛擬內容的透視投影矩陣由頭顯提供的 SDK 進行設置,外部只需要設置虛擬內容的位置和姿態。用於跟踪的物理相機和螢幕上渲染的相機圖像的相機可能在不同的位置,渲染時進行了座標變換。

  • OST

    Optical See-Through,是指頭顯的螢幕透明,頭顯在螢幕上只顯示虛擬內容的 AR 技術,典型代表是 HoloLens。通常虛擬內容的透視投影矩陣由頭顯提供的 SDK 進行設置,外部只需要設置虛擬內容的位置和姿態。用於跟踪的物理相機和螢幕上渲染的相機圖像的相機可能在不同的位置,渲染時進行了座標變換。

平台专用指南

AR 驅動的 3D 渲染與平台緊密相關。請根據您的目標平台,參考以下指南進行開發: