RealityKit 翻譯 -- 通過照片創(chuàng)建3D對象

原文鏈接:

https://developer.apple.com/documentation/realitykit/creating_3d_objects_from_photographs

構(gòu)建虛擬物體以用于你的AR體驗嗦随。


概述

要從一系列的照片中創(chuàng)建一個三維物體窖杀,需要使用PhotogrammetrySession將圖像提交給RealityKit奢赂,注冊以接收狀態(tài)更新荣暮,然后啟動會話。這個過程完成之后會產(chǎn)生一個拍攝對象的三維呈現(xiàn)这揣,你可以在你的應(yīng)用程序中使用,或者導(dǎo)出到其他軟件影斑,如Reality Composer给赞。

關(guān)于為攝影測量捕獲高質(zhì)量的圖像的更多信息,請參閱Capturing Photographs for RealityKit Object Capture矫户。

檢查設(shè)備是否可用

RealityKit對象捕捉只適用于滿足執(zhí)行對象重建的最低要求的Mac電腦--包括至少4GB的內(nèi)存--并且擁有支持光線追蹤的GPU片迅。在使用任何Object Capture APIs之前,請檢查你的代碼所運行的計算機是否符合這些要求皆辽,只有在符合這些要求的情況下才可以進行柑蛇。

import Metal

// Checks to make sure at least one GPU meets the minimum requirements
// for object reconstruction. At least one GPU must be a "high power" 
// device, which means it has at least 4 GB of RAM, provides 
// barycentric coordinates to the fragment shader, and is running on an
// Apple silicon Mac or an Intel Mac with a discrete GPU.
private func supportsObjectReconstruction() -> Bool {
    for device in MTLCopyAllDevices() where 
        !device.isLowPower &&
         device.areBarycentricCoordsSupported &&
         device.recommendedMaxWorkingSetSize >= UInt64(4e9) {
        return true
    }
    return false
}

// Returns `true` if at least one GPU has hardware support for ray tracing. 
// The GPU that supports ray tracing need not be the same GPU that supports
// object reconstruction.
private func supportsRayTracing() -> Bool {
    for device in MTLCopyAllDevices() where device.supportsRaytracing {
        return true
    }
    return false
}

// Returns `true` if the current hardware supports Object Capture.
func supportsObjectCapture() -> Bool {
    return supportsObjectReconstruction() && supportsRayTracing()
}

func doObjectCapture() {
    guard supportsObjectCapture() else {
        print("Object capture not available")
        return
    }
    // ...
}

創(chuàng)建攝影測量法會話

首先創(chuàng)建一個PhotogrammetrySession.Request,其URL指向生成的USDZ文件所需的輸出位置和模型所需的細節(jié)級別驱闷。接下來耻台,使用該請求,以及指向包含你的圖像的目錄的URL空另,來創(chuàng)建PhotogrammetrySession對象盆耽。

let inputFolderUrl = URL(fileURLWithPath: "/tmp/MyInputImages/")
let url = URL(fileURLWithPath: "MyObject.usdz")
var request = PhotogrammetrySession.Request.modelFile(url: url, 
                                                      detail: .full)
guard let session = try PhotogrammetrySession(input: inputFolderUrl) else {
    return } 

監(jiān)聽更新并開始創(chuàng)建

RealityKit使用PhotogrammetrySession.Output對象的AsyncSequence來在后臺提供關(guān)于對象創(chuàng)建過程的狀態(tài)更新。為了更新你的應(yīng)用程序的用戶界面或采取其他行動作為這些狀態(tài)更新的結(jié)果痹换,創(chuàng)建一個異步任務(wù)并對輸出使用for-try-await循環(huán)征字。

let waiter = async {
    do {
        for try await output in session.outputs {
            switch output {
                case .processingComplete:
                    // RealityKit has processed all requests.
                case .requestError(let request, let error):
                    // Request encountered an error.
                case .requestComplete(let request, let result):
                    // RealityKit has finished processing a request.
                case .requestProgress(let request, let fractionComplete):
                    // Periodic progress update. Update UI here.
                case .inputComplete: 
                    // Ingestion of images is complete and processing begins.
                case .invalidSample(let id, let reason):
                    // RealityKit deemed a sample invalid and didn't use it.
                case .skippedSample(let id):
                    // RealityKit was unable to use a provided sample.
                case .automaticDownsampling:
                    // RealityKit downsampled the input images because of
                    // resource constraints.
                case .processingCancelled
                    // Processing was canceled.
                @unknown default:
                    // Unrecognized output.
            }
        }
    } catch {
        print("Output: ERROR = \(String(describing: error))")
        // Handle error.
    }
}

一旦你創(chuàng)建了一個會話并注冊接收狀態(tài)更新,就可以通過調(diào)用process(request:)啟動對象創(chuàng)建過程娇豫。RealityKit在后臺處理照片匙姜,并在過程完成或失敗時通知你的應(yīng)用程序。

session.process(requests: [request])

補償具有挑戰(zhàn)性的圖像

RealityKit的默認攝影測量設(shè)置對絕大多數(shù)的輸入圖像都有效冯痢。然而氮昧,如果你的圖像集對比度低或缺乏許多可識別的地標框杜,你可以通過創(chuàng)建一個PhotogrammetrySession.Configuration對象并在創(chuàng)建PhotogrammetrySession時將其傳入初始化器來覆蓋默認值以進行補償。

為了簡化對象創(chuàng)建過程袖肥,你可以使用自定義配置咪辱,通過將相鄰的圖像列在一起,依次向PhotogrammetrySession提供圖像椎组,或者控制對對象遮蔽的支持油狂,遮蔽對象周圍圖像的一部分。

let config = Configuration()

// Use slower, more sensitive landmark detection.
config.featureSensitivity = .high
// Adjacent images are next to each other.
config.sampleOrdering = .sequential
// Object masking is enabled.
config.isObjectMaskingEnabled = true

let session = try PhotogrammetrySession(input: inputFolderUrl, 
                                        configuration:config)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寸癌,一起剝皮案震驚了整個濱河市专筷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蒸苇,老刑警劉巖磷蛹,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異溪烤,居然都是意外死亡味咳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門檬嘀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來槽驶,“玉大人,你說我怎么就攤上這事枪眉∞嗝剩” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵贸铜,是天一觀的道長堡纬。 經(jīng)常有香客問我,道長蒿秦,這世上最難降的妖魔是什么烤镐? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮棍鳖,結(jié)果婚禮上炮叶,老公的妹妹穿的比我還像新娘。我一直安慰自己渡处,他們只是感情好镜悉,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著医瘫,像睡著了一般侣肄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上醇份,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天稼锅,我揣著相機與錄音吼具,去河邊找鬼。 笑死矩距,一個胖子當著我的面吹牛拗盒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锥债,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼陡蝇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哮肚?” 一聲冷哼從身側(cè)響起毅整,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绽左,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艇潭,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡拼窥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹋凝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鲁纠。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鳍寂,靈堂內(nèi)的尸體忽然破棺而出改含,到底是詐尸還是另有隱情,我是刑警寧澤迄汛,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布捍壤,位于F島的核電站,受9級特大地震影響鞍爱,放射性物質(zhì)發(fā)生泄漏鹃觉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一睹逃、第九天 我趴在偏房一處隱蔽的房頂上張望盗扇。 院中可真熱鬧,春花似錦沉填、人聲如沸疗隶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斑鼻。三九已至,卻和暖如春橄碾,著一層夾襖步出監(jiān)牢的瞬間卵沉,已是汗流浹背颠锉。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留史汗,地道東北人琼掠。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像停撞,于是被迫代替她去往敵國和親瓷蛙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容