ARKit3.5 框架學(xué)習(xí) (二)核心類簡介(中)

3.4 ARCamera

  • ARCamera: 關(guān)于給定幀的攝像機位置和成像特性的信息。
class ARCamera : NSObject

您可以從ARFrame ARKit交付的每個相機屬性中獲得相機信息。

3.5 ARHitTestResult

  • ARHitTestResult: 通過檢查屏幕上的一個點發(fā)現(xiàn)的關(guān)于真實世界表面的信息打洼。

如果你使用SceneKitSpriteKit作為你的渲染器筐钟,你可以使用以下命令在屏幕上搜索真實世界的表面:
ARSCNView hitTest(_:types:): 在捕獲的攝像機圖像中搜索與SceneKit視圖中某個點對應(yīng)的真實對象或AR錨點

ARSKView hitTest(_:types:): 在捕獲的相機圖像中搜索與 SpriteKit視圖中某個點相對應(yīng)的真實對象或AR錨點皮服。

Hit測試通過AR會話對攝像機圖像的處理來搜索現(xiàn)實世界中的物體或表面牢裳。在視圖的坐標(biāo)系統(tǒng)中,2D點可以指從設(shè)備攝像機開始并沿著由設(shè)備方向和攝像機投影決定的方向延伸的3D線上的任何點隆檀。這個方法沿著這條線搜索摇天,返回所有與它相交的物體,按與攝像機的距離排序恐仑。

class ARHitTestResult : NSObject

3.6 ARLightEstimate

  • ARLightEstimate:AR會話中與捕獲的視頻幀相關(guān)的估計場景照明信息泉坐。
class ARLightEstimate : NSObject

3.7 ARPointCloud

  • ARPointCloud: AR會話的世界坐標(biāo)空間中的點的集合。
class ARPointCloud : NSObject

使用ARFrame rawFeaturePoints屬性獲得一個點云裳仆,表示ARKit用于執(zhí)行世界跟蹤的場景分析的中間結(jié)果腕让。

3.8 ARReferenceImage

class ARReferenceImage : NSObject

為了在真實世界中準(zhǔn)確地檢測二維圖像的位置和方向歧斟,ARKit需要預(yù)處理的圖像數(shù)據(jù)和圖像的真實世界尺寸的知識纯丸。ARReferenceImage類封裝了這些信息。要在AR會話中啟用圖像檢測静袖,請將一組參考圖像傳遞到會話配置的detectionImages屬性觉鼻。

3.9 ARReferenceObject

class ARReferenceObject : NSObject

ARKit中的對象檢測允許您在會話識別已知的3D對象時觸發(fā)AR內(nèi)容勾徽。例如滑凉,您的應(yīng)用程序可以檢測藝術(shù)博物館中的雕塑并提供一個虛擬館長,或檢測桌面游戲人物并為游戲創(chuàng)建視覺效果喘帚。

要提供一個已知的3D對象檢測畅姊,你掃描一個現(xiàn)實世界的對象使用ARKit:

  1. 使用ARObjectScanningConfiguration運行AR會話,以啟用高保真空間映射數(shù)據(jù)的收集吹由。
  2. 在這個過程中若未,將設(shè)備攝像頭從不同的角度對準(zhǔn)真實世界的物體,這樣ARKit就可以建立物體及其周圍環(huán)境的內(nèi)部地圖倾鲫。有關(guān)引導(dǎo)用戶交互生成良好掃描數(shù)據(jù)的示例粗合,請參見掃描和檢測3D對象

3.10 ARVideoFormat

  • ARVideoFormat: 一個視頻大小和幀速率規(guī)格乌昔,用于AR會話隙疚。
@interface ARVideoFormat : NSObject

這個類是不可變的;要設(shè)置AR會話的幀速率和視頻分辨率,請將配置的videoFormat屬性設(shè)置為supportedVideoFormats數(shù)組中的一種格式磕道。

3.11 ARCollaborationData

  • ARCollaborationData:保存用戶收集的關(guān)于物理環(huán)境的信息的對象供屉。
@interface ARCollaborationData : NSObject

要創(chuàng)建多用戶增強現(xiàn)實體驗,您可以在世界跟蹤會話上啟用協(xié)作溺蕉。ARKit會定期輸出用戶之間共享的 ARCollaborationData伶丐,這使得每個人都可以從自己的角度查看相同的虛擬內(nèi)容。有關(guān)更多信息疯特,請參見啟用collaborationEnabled哗魂。

3.12 ARWorldMap

  • ARWorldMap: 空間映射狀態(tài)和一組來自世界跟蹤AR會話的錨點。
class ARWorldMap : NSObject

會話狀態(tài)的世界地圖包括ARKit意識的物理空間的用戶移動設(shè)備(ARKit用于確定設(shè)備的位置和方向),以及任何ARAnchor對象添加到會話(可以表示檢測到現(xiàn)實世界的特性或虛擬內(nèi)容的應(yīng)用程序)漓雅。

3.12.2 ARWorldMap序列化和反序列化世界地圖:

當(dāng)您的應(yīng)用程序退出時录别,您可以保存當(dāng)前的世界地圖(使用getCurrentWorldMap(completionHandler:)獲取)。因為ARWorldMap符合NSSecureCoding邻吞,所以您使用NSKeyedArchiver序列化它庶灿。

func writeWorldMap(_ worldMap: ARWorldMap, to url: URL) throws {
    let data = try NSKeyedArchiver.archivedData(withRootObject: worldMap, requiringSecureCoding: true)
    try data.write(to: url)
}

要在應(yīng)用程序下次啟動時恢復(fù)世界地圖,請使用NSKeyedUnarchiver吃衅。

func loadWorldMap(from url: URL) throws -> ARWorldMap {
    let mapData = try Data(contentsOf: url)
    guard let worldMap = try NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self, from: mapData)
        else { throw ARError(.invalidWorldMap) }
    return worldMap
}

如果應(yīng)用程序在相同的物理環(huán)境中啟動往踢,您可以使用恢復(fù)的世界地圖中的錨來將相同的虛擬內(nèi)容放在保存的會話中的相同位置。
有關(guān)更多信息徘层,請參見保存和加載世界數(shù)據(jù)峻呕。

3.12.3 ARWorldMap共享保存的世界地圖

有了兩個跟蹤相同世界地圖的設(shè)備,您就可以構(gòu)建一個網(wǎng)絡(luò)體驗趣效,兩個用戶都可以看到相同的虛擬內(nèi)容并與之交互瘦癌。將ARWorldMap發(fā)送到另一個設(shè)備,為多用戶AR體驗創(chuàng)建一個共享的參考框架:

步驟如下:

  1. 在一個設(shè)備上跷敬,使用NSKeyedArchiver 將世界地圖轉(zhuǎn)換為數(shù)據(jù)對象讯私。(你不需要把數(shù)據(jù)寫到一個文件中,然后通過網(wǎng)絡(luò)發(fā)送。)
  2. 使用您選擇的網(wǎng)絡(luò)技術(shù)將結(jié)果數(shù)據(jù)發(fā)送到另一個設(shè)備斤寇。(例如桶癣,在一個MultipeerConnectivity會話中,調(diào)用send(_:toPeers:with:)來發(fā)送數(shù)據(jù)娘锁,并在另一個設(shè)備上實現(xiàn)MCSessionDelegate方法來接收數(shù)據(jù)牙寞。)
  3. 在接收設(shè)備上,使用NSKeyedUnarchiver 從數(shù)據(jù)中反序列化一個ARWorldMap莫秆。

有關(guān)更多信息间雀,請參見創(chuàng)建多用戶增強現(xiàn)實體驗

3.12.4 ARWorldMap運行反序列化的世界地圖

要從現(xiàn)有的ARWorldMap開始新會話镊屎,請設(shè)置一個世界跟蹤配置的initialWorldMap屬性并使用run(_:options:)惹挟。這將啟動一個新的會話,使用相同的空間感知和從保存的世界地圖加載的錨缝驳。

3.12.4.1 ARWorldMap相關(guān)函數(shù)介紹
  • run(_:options:): 是ARSession的一個實例方法匪煌,用來使用指定的配置和選項啟動會話的AR處理。它的定義如下:
func run(_ configuration: ARConfiguration, 
 options: ARSession.RunOptions = [])

參數(shù)說明:

  1. configuration:為會話定義運動和場景跟蹤行為的對象党巾。
  2. options: 影響現(xiàn)有會話狀態(tài)(如果有的話)如何轉(zhuǎn)換到新配置的選項萎庭。
    如果會話是第一次運行,則此參數(shù)無效齿拂。

會話跟蹤設(shè)備運動驳规,捕獲并處理來自設(shè)備攝像頭的場景圖像,并僅在運行時與您的委托對象或ARSCNViewARSKView視圖進(jìn)行協(xié)調(diào)署海。

在已經(jīng)立即開始過渡到新會話配置的會話上調(diào)用此方法吗购。options參數(shù)確定現(xiàn)有會話狀態(tài)如何轉(zhuǎn)換到新配置。默認(rèn)情況下砸狞,會話從最后一個已知狀態(tài)恢復(fù)設(shè)備位置跟蹤捻勉,并保留會話中已經(jīng)包含的所有錨點(那些您使用add(anchor:)手動添加的錨點,以及那些由ARKit特性(如平面檢測或人臉跟蹤)自動添加的錨點)刀森。

3.13 ARRaycastQuery

  • ARRaycastQuery: 一種數(shù)學(xué)射線踱启,你可以用它來找到真實世界表面的三維位置。
class ARRaycastQuery : NSObject

您可以通過提供3D向量和起始位置來創(chuàng)建一個raycast查詢研底。
要使用2D屏幕位置和用戶向z方向投射的默認(rèn)向量來創(chuàng)建一個raycast查詢埠偿,可以使用ARView上的 makeRaycastQuery(from:allowing:alignment:)ARSCNView上的raycastQuery(from:allowing:alignment:)這兩個方便的函數(shù)。
光線投射可以與平面(平面)或網(wǎng)格(不平整的表面)相交榜晦。若要與平面相交冠蒋,請參見ARRaycastQuery.Target。若要與網(wǎng)格相交乾胶,請參見ARRaycastQuery.Target.estimatedPlane抖剿。

3.14 ARTrackedRaycast

  • ARTrackedRaycast:ARKit會連續(xù)重復(fù)一個raycast查詢朽寞,從而隨著時間的推移提供更精確的結(jié)果。
class ARTrackedRaycast : NSObject

跟蹤射線投射通過連續(xù)地重復(fù)3D位置的查詢來改進(jìn)命中測試技術(shù)斩郎。ARKit為您提供了一個更新的位置脑融,隨著時間的推移,它完善了它對世界的理解孽拷。
要啟動一個被跟蹤的raycast吨掌,你需要在你的應(yīng)用程序的當(dāng)前ARSession上調(diào)用trackedRaycast(_:updateHandler:)半抱。

3.15 ARRaycastResult

  • ARRaycastResult:通過檢查屏幕上的一個點發(fā)現(xiàn)的關(guān)于真實世界表面的信息脓恕。
class ARRaycastResult : NSObject

如果您使用ARViewARSCNView作為您的渲染器,您可以分別使用 raycast(from:allowing:alignment:)raycastQuery(from:allowing:alignment:)函數(shù)在屏幕上搜索真實世界的表面窿侈。
如果你使用自定義渲染器炼幔,你可以找到現(xiàn)實世界的位置使用屏幕點:
ARFrame的 raycastQuery(from:allowing:alignment:)函數(shù)。
ARSessionraycast(_:)函數(shù)史简。
對于被跟蹤的光線投射乃秀,你在你的應(yīng)用程序的當(dāng)前ARSession上調(diào)用trackedRaycast(_:updateHandler:)

3.16 ARAnchor

  • ARAnchor: 物理環(huán)境中某物的位置和方向圆兵。
class ARAnchor : NSObject

要跟蹤真實或虛擬對象相對于攝像機的靜態(tài)位置和方向跺讯,請創(chuàng)建錨對象并使用add(anchor:)方法將它們添加到AR會話中。

在會話中添加一個錨點可以幫助ARKit優(yōu)化該錨點周圍區(qū)域的世界跟蹤精度殉农,從而使虛擬對象看起來與真實世界保持一致刀脏。如果虛擬對象移動,則從舊位置移除相應(yīng)的錨超凳,并在新位置添加一個錨愈污。

一些ARKit特性會自動向會話添加特殊的錨。如果啟用了相應(yīng)的功能轮傍,世界跟蹤會話可以添加ARPlaneAnchor暂雹、ARObjectAnchorARImageAnchor對象;面部跟蹤會話添加ARFaceAnchor對象。

3.16.1 子類簡介

除了創(chuàng)建自己的ARAnchor實例來跟蹤虛擬內(nèi)容的實際位置之外创夜,還可以子類化ARAnchor來將自定義數(shù)據(jù)與創(chuàng)建的錨關(guān)聯(lián)起來杭跪。確保你的錨類在ARKit更新幀或保存并加載ARWorldMap中的錨時行為正確:

  • 錨子類必須滿足ARAnchorCopying協(xié)議的要求。ARKit調(diào)用init(錨:)(在一個后臺線程上)來將錨類的實例從一個ARFrame復(fù)制到下一個ARFrame驰吓。此初始化器的實現(xiàn)應(yīng)復(fù)制子類添加的任何自定義屬性的值揍魂。
  • 錨子類也必須采用NSSecureCoding協(xié)議。重寫encode(with:)和init(coder:)來保存和恢復(fù)您的子類自定義屬性的值棚瘟,當(dāng)ARKit將它們保存并加載到一個世界地圖中時现斋。
  • 錨點根據(jù)其標(biāo)識符屬性被認(rèn)為是相等的。
  • 當(dāng)您保存世界地圖時偎蘸,只有不采用可跟蹤的錨點(ARTrackable )才會被包括在內(nèi)庄蹋。

3.16.2 ARTrackable

  • ARTrackable: 一個真實世界的對象瞬内,在一個場景中,ARKit跟蹤位置和方向的變化限书。
protocol ARTrackable

這個協(xié)議被ARKit類所采用虫蝶,比如ARFaceAnchor類,它表示場景中移動的對象倦西。

ARKit在一個活動的AR會話中自動管理這些對象的表示能真,確保真實世界中對象的位置和方向(錨的transform屬性)的變化反映在相應(yīng)的ARKit對象中。isTracked屬性指示當(dāng)前轉(zhuǎn)換對于實際對象的移動是否有效扰柠。

可跟蹤的錨類影響其他ARKit行為:

  • getCurrentWorldMap(completionHandler:)方法自動在其創(chuàng)建的ARWorldMap中只包含不可跟蹤的錨點粉铐。(創(chuàng)建世界地圖后,可以選擇添加其他錨點卤档。)
  • ARSCNViewARSKView自動隱藏isTracked屬性為false的錨節(jié)點蝙泼。
  • World-tracking會話使用不可跟蹤的錨點來優(yōu)化每個錨點周圍區(qū)域的跟蹤質(zhì)量∪霸妫可跟蹤的錨不影響世界跟蹤汤踏。

3.17 AREnvironmentProbeAnchor

  • AREnvironmentProbeAnchor:在世界跟蹤AR會話中為特定空間區(qū)域提供環(huán)境照明信息的對象。
class AREnvironmentProbeAnchor : ARAnchor

環(huán)境紋理描述了場景中特定點的各個方向的視圖舔腾。在三維資產(chǎn)渲染中溪胶,環(huán)境紋理是基于圖像的照明算法的基礎(chǔ),其中表面可以真實地反射來自其周圍環(huán)境的光稳诚。ARKit可以在AR會話期間使用攝像機圖像生成環(huán)境紋理哗脖,允許SceneKit或自定義渲染引擎為AR體驗中的虛擬對象提供基于真實圖像的照明。
若要為AR會話啟用紋理映射生成采桃,請設(shè)置environmentTexturing屬性:

  1. ARWorldTrackingConfiguration.EnvironmentTexturing懒熙。手動環(huán)境紋理,你可以通過創(chuàng)建 AREnvironmentProbeAnchor 對象并將它們添加到會話中來識別場景中你想要的光探測紋理映射點普办。
  2. ARWorldTrackingConfiguration.EnvironmentTexturing工扎。自動環(huán)境紋理,ARKit自動創(chuàng)建衔蹲,定位肢娘,并添加 AREnvironmentProbeAnchor 對象到會話。

在這兩種情況下舆驶,ARKit在會話收集攝像機圖像時自動生成環(huán)境紋理橱健。使用諸如session(_:didUpdate:)這樣的委托方法來找出一個紋理何時可用,并從錨的environmentTexture屬性訪問它沙廉。
如果您使用ARSCNViewautomaticallyUpdatesLighting選項來顯示AR內(nèi)容拘荡,SceneKit會自動檢索AREnvironmentProbeAnchor紋理映射并使用它們來照亮場景。

3.18 ARFaceAnchor

  • ARFaceAnchor: 關(guān)于姿態(tài)撬陵、拓?fù)浣Y(jié)構(gòu)和面部表情的信息珊皿,ARKit在前置攝像頭中檢測到网缝。
class ARFaceAnchor : ARAnchor

當(dāng)會話在前置攝像頭提要中檢測到一個唯一的人臉時,它會自動將一個ARFaceAnchor:對象添加到它的錨點列表中蟋定。
當(dāng)你使用ARFaceTrackingConfiguration跟蹤面時粉臊,ARKit可以同時跟蹤多個面。

  • 跟蹤面部位置和方向

繼承的變換屬性在世界坐標(biāo)中描述人臉當(dāng)前的位置和方向;也就是說驶兜,在與會話配置的worldAlignment屬性指定的坐標(biāo)空間中扼仲。使用這個變換矩陣來定位你想要“附加”到AR場景中的虛擬內(nèi)容。
這個變換矩陣創(chuàng)建了一個面坐標(biāo)系統(tǒng)抄淑,用于定位相對于面而言的其他元素屠凶。面坐標(biāo)空間單位以米為單位,原點在面后居中蝇狼,如下圖所示阅畴。

跟蹤面部位置和方向

坐標(biāo)系是右向的——正的x方向指向觀察者的右邊(也就是臉自己的左邊)倡怎,正的y方向指向上(相對于臉本身迅耘,而不是世界),正的z方向指向外(指向觀察者)监署。

  • 使用面拓?fù)?
    幾何屬性提供了一個ARFaceGeometry對象颤专,該對象表示面部的詳細(xì)拓?fù)浣Y(jié)構(gòu),該對象符合一個通用的面部模型钠乏,以匹配檢測到的面部的尺寸栖秕、形狀和當(dāng)前表達(dá)式。
    您可以使用這個模型作為基礎(chǔ)晓避,根據(jù)用戶的面部形狀覆蓋內(nèi)容—例如簇捍,應(yīng)用虛擬化妝或紋身。你也可以使用這個模型來創(chuàng)建遮擋幾何——一個不渲染任何可見內(nèi)容的3D模型(允許攝像機圖像通過)俏拱,但是它會阻礙攝像機在場景中看到其他虛擬內(nèi)容暑塑。

  • 跟蹤面部表情:
    blendShapes屬性提供了當(dāng)前面部表情的高級模型,該模型通過一系列指定的系數(shù)進(jìn)行描述锅必,這些系數(shù)表示特定面部特征相對于其中性配置的移動事格。您可以使用混合形狀系數(shù)使2D或3D內(nèi)容(如角色或阿凡達(dá))具有動畫效果,并遵循用戶的面部表情搞隐。

3.19 ARFaceGeometry

  • ARFaceGeometry:描述人臉拓?fù)浣Y(jié)構(gòu)的三維網(wǎng)格驹愚,用于人臉跟蹤AR會話。
class ARFaceGeometry : NSObject

這個類以3D網(wǎng)格的形式為面部的詳細(xì)拓?fù)涮峁┝艘粋€通用模型劣纲,適合用于各種呈現(xiàn)技術(shù)或?qū)С?D資產(chǎn)逢捺。(使用SceneKit查看人臉幾何圖形的快速方法,請參見ARSCNFaceGeometry類癞季。)

在人臉跟蹤AR會話中劫瞳,當(dāng)您從ARFaceAnchor對象獲取人臉幾何形狀時棠耕,該模型將與被檢測到的人臉的尺寸、形狀和當(dāng)前表達(dá)式相匹配柠新。您還可以使用一個名為blend形狀系數(shù)的字典來創(chuàng)建一個面部網(wǎng)格窍荧,它提供了面部當(dāng)前表情的詳細(xì)但更有效的描述。

在AR會話中恨憎,您可以使用這個模型作為基礎(chǔ)蕊退,根據(jù)用戶的面部形狀覆蓋內(nèi)容——例如,應(yīng)用虛擬化妝或紋身憔恳。您還可以使用這個模型來創(chuàng)建遮擋幾何圖形瓤荔,它將其他虛擬內(nèi)容隱藏在攝像機圖像中檢測到的人臉的3D形狀之后。

  1. 面網(wǎng)格拓?fù)湓贏RFaceGeometry實例中是常量钥组。也就是說输硝,vertexCount、textureCoordinateCount和triangleCount屬性的值不會改變程梦,triangleIndices緩沖區(qū)總是描述相同的頂點排列点把,而textureCoordinateCount緩沖區(qū)總是將相同的頂點索引映射到相同的紋理坐標(biāo)。
  2. 只有頂點緩沖了AR會話提供的面網(wǎng)格之間的變化屿附,表明頂點位置的變化郎逃,因為ARKit使網(wǎng)格適應(yīng)用戶的臉的形狀和表情。

3.20 ARImageAnchor

  • ARImageAnchor: 在世界跟蹤AR會話中檢測到的圖像的位置和方向的信息挺份。
class ARImageAnchor : ARAnchor

當(dāng)您運行一個world-tracking AR會話并為會話配置的detectionImages屬性指定ARReferenceImage對象時褒翰,ARKit將在實際環(huán)境中搜索這些圖像。當(dāng)會話識別一個圖像時匀泊,它會自動將每個檢測到的圖像的 ARImageAnchor 添加到它的錨點列表中优训。
要查找場景中已識別圖像的范圍,可以使用繼承的transform屬性和錨點的referenceImage的物理大小各聘。

3.21 ARObjectAnchor

  • ARObjectAnchor:在世界跟蹤AR會話中檢測到的真實三維對象的位置和方向信息揣非。
class ARObjectAnchor : ARAnchor

當(dāng)您運行一個跟蹤世界的AR會話并為會話配置的detectionObjects屬性指定ARReferenceObject對象時,ARKit將在實際環(huán)境中搜索這些對象伦吠。當(dāng)會話識別一個對象時妆兑,它會自動將每個檢測到的對象的ARObjectAnchor添加到它的錨點列表中。
要放置與被檢測對象的位置或大小匹配的虛擬3D內(nèi)容毛仪,請使用錨點的繼承transform屬性以及錨點的referenceObject的中心和范圍搁嗓。

var detectionObjects: Set<ARReferenceObject> { get set }

detectionObjects屬性說明:

  1. detectionObjects是一組用于ARKit嘗試在用戶環(huán)境中檢測的3D對象。
  2. 使用此屬性可為ARKit選擇在用戶環(huán)境中找到的已知3D對象箱靴,并將其呈現(xiàn)為ARObjectAnchor腺逛,以供在增強現(xiàn)實體驗中使用。
    要創(chuàng)建用于檢測的引用對象衡怀,請在世界跟蹤會話中掃描它們棍矛,并使用ARWorldMap來提取ARReferenceObject實例安疗。然后可以將引用對象保存為文件,并將它們打包到使用Xcode資產(chǎn)目錄創(chuàng)建的任何ARKit應(yīng)用程序中够委。

3.22 ARParticipantAnchor

  • ARParticipantAnchor:表示多用戶增強現(xiàn)實體驗中另一個用戶的錨荐类。
class ARParticipantAnchor : ARAnchor

當(dāng)你將isCollaborationEnabled設(shè)置為true時,ARKit會調(diào)用session(_:didAdd:)茁帽,并為它在物理環(huán)境中檢測到的每個用戶提供一個ARParticipantAnchor玉罐,為你提供他們的世界位置。

3.23 ARPlaneAnchor:

class ARPlaneAnchor : ARAnchor

當(dāng)你在一個世界追蹤會話中啟用planeDetection時吊输,ARKit會通知你的應(yīng)用它通過設(shè)備的后攝像頭觀察到的所有表面。ARKit調(diào)用你的委派的session(_:didAdd:) 铁追,為每個獨特的表面使用一個ARPlaneAnchor季蚂。每一個平面錨都提供了關(guān)于表面的細(xì)節(jié),比如它在現(xiàn)實世界中的位置和形狀琅束。

session(_:didAdd:) 說明:

  1. 根據(jù)會話配置扭屁,ARKit可以自動向會話添加錨。
  2. 如果你使用SceneKit或SpriteKit來顯示AR體驗狰闪,你可以實現(xiàn)以下方法之一來代替跟蹤不僅僅是向會話中添加錨點疯搅,還可以跟蹤如何將SceneKit或SpriteKit內(nèi)容添加到相應(yīng)的場景中:ARSCNView: renderer(_:nodeFor:) or renderer(_:didAdd:for:) ARSKView: node(for:) or view(_:didAdd:for:)

3.24 ARPlaneGeometry

  • ARPlaneGeometry: 在世界跟蹤AR會話中描述被探測平面形狀的三維網(wǎng)格濒生。
class ARPlaneGeometry : NSObject

在世界跟蹤AR會話中描述被探測平面形狀的三維網(wǎng)格埋泵。這個類提供了被檢測平面的大致形狀的估計,其形式是一個詳細(xì)的3D網(wǎng)格罪治,適合與各種渲染技術(shù)一起使用或用于導(dǎo)出3D資產(chǎn)丽声。(使用SceneKit查看平面幾何圖形的快速方法,請參見ARSCNPlaneGeometry課程觉义。)

ARPlaneAnchor中心和范圍屬性不同雁社,后者僅對檢測到的平面的矩形區(qū)域進(jìn)行估計,而平面錨的幾何屬性提供了對該平面覆蓋的二維區(qū)域的更詳細(xì)的估計晒骇。例如霉撵,如果ARKit檢測到一個圓形桌面,得到的ARPlaneGeometry對象大致匹配表的一般形狀洪囤。隨著會話的繼續(xù)運行徒坡,ARKit提供了更新的平面錨點充甚,其相關(guān)的幾何形狀改進(jìn)了飛機的估計形狀针肥。

您可以使用此模型更精確地放置3D內(nèi)容击吱,這些內(nèi)容應(yīng)該只出現(xiàn)在檢測到的平面上叁幢。例如袒炉,確保虛擬對象不會從表的邊緣掉落。您還可以使用這個模型來創(chuàng)建遮擋幾何圖形参萄,它將攝像機圖像中檢測到的表面后面隱藏其他虛擬內(nèi)容综苔。

平面幾何的形狀總是凸的。也就是說刻诊,平面幾何的邊界多邊形是一個最小的凸包防楷,它包圍了ARKit識別或估計的所有點,這些點都是平面的一部分则涯。

3.25 ARSkeleton

  • ARSkeleton:跟蹤的身體的骨骼的接口域帐。
class ARSkeleton : NSObject

作為關(guān)節(jié)的集合,本協(xié)議描述了ARKit可以跟蹤的人體運動狀態(tài)是整。
ARSkeleton3D子類為您提供了3D空間中被跟蹤的人體關(guān)節(jié)的位置肖揣,特別是它的jointLocalTransformsjointModelTransforms屬性。
ARSkeleton2D子類通過它的jointLandmarks屬性為您提供了一個二維空間中被跟蹤物體關(guān)節(jié)的位置浮入。

3.26 ARSkeletonDefinition

class ARSkeletonDefinition : NSObject

骨架定義建立了構(gòu)成3D或2D身體骨架的關(guān)節(jié)之間的關(guān)系,其中關(guān)節(jié)連接到其他關(guān)節(jié)事秀,在父-子層次結(jié)構(gòu)中構(gòu)成單個骨架彤断。使用parentIndices來標(biāo)識給定框架定義的層次結(jié)構(gòu)。
ARKit指定了對身體跟蹤至關(guān)重要的特定關(guān)節(jié)易迹≡籽茫可以通過調(diào)用index(forJointName:)并傳入一個可用的聯(lián)名標(biāo)識符來訪問指定的聯(lián)名。

3.27 ARBody2D

  • ARBody2D: 屏幕空間表示ARKit在攝像機提要中識別的人員睹欲。
class ARBody2D : NSObject

當(dāng)ARKit在攝像頭提示中識別一個人時供炼,它會估計身體關(guān)節(jié)的屏幕空間位置,并通過當(dāng)前幀的detectedBody向您提供該位置窘疮。

3.28 ARBodyAnchor

  • ARBodyAnchor: 一個物體袋哼,它在三維空間中跟蹤一個物體的運動,ARKit可以在攝像頭中識別它闸衫。
class ARBodyAnchor : ARAnchor

這個ARAnchor子類跟蹤單個人的移動涛贯。通過使用ARBodyTrackingConfiguration運行會話,您可以啟用身體跟蹤蔚出。
當(dāng)ARKit在后臺攝像頭feed中識別一個人時弟翘,它會用ARBodyAnchor調(diào)用你的委托的session(_:didAdd:)函數(shù)。身體錨點的變換位置定義了身體髖關(guān)節(jié)的世界位置骄酗。
你也可以在框架的錨中檢查ARKit正在跟蹤的物體稀余。

  • 把骨架放在表面上

因為身體錨點的原點映射到髖關(guān)節(jié),所以您可以計算腳到髖關(guān)節(jié)的當(dāng)前偏移量酥筝,從而將身體的骨骼放置在一個表面上滚躯。通過將腳關(guān)節(jié)索引傳遞給jointModelTransforms,您可以得到腳與骨骼原點的偏移量。

static var hipToFootOffset: Float {
    // Get an index for a foot. 
    let footIndex = ARSkeletonDefinition.defaultBody3D.index(forJointName: .leftFoot)
    // Get the foot's world-space offset from the hip. 
    let footTransform = ARSkeletonDefinition.defaultBody3D.neutralBodySkeleton3D!.jointModelTransforms[footIndex]
    // Return the height by getting just the y-value. 
    let distanceFromHipOnY = abs(footTransform.columns.3.y) 
    return distanceFromHipOnY
}

3.29 ARCoachingOverlayView

  • ARCoachingOverlayView: 在會話初始化和恢復(fù)期間為用戶提供指導(dǎo)的可視化指令的視圖掸掏。
class ARCoachingOverlayView : UIView

此視圖為您的用戶提供了標(biāo)準(zhǔn)化的登錄例程茁影。您可以配置此視圖,使其在會話初始化期間和有限的跟蹤情況下自動顯示丧凤,同時為用戶提供特定的指令募闲,以最方便地跟蹤ARKit的世界。
這些插圖顯示了具有水平和垂直平面目標(biāo)的疊加視圖愿待,表明用戶應(yīng)該開始移動設(shè)備:

ARCoachingOverlayView 圖1

這些插圖顯示了疊加視圖浩螺,表明用戶應(yīng)該繼續(xù)移動手機或改變移動速度:

ARCoachingOverlayView 圖2

當(dāng)你啟動你的應(yīng)用程序時,coaching overlay會要求用戶以幫助ARKit建立追蹤的方式移動設(shè)備仍侥。當(dāng)你選擇一個特定的目標(biāo)時要出,比如找到一架飛機,視圖會相應(yīng)地調(diào)整它的指令农渊。當(dāng)coaching overlay確定目標(biāo)已經(jīng)達(dá)到并且不再需要coaching之后患蹂,它就會從用戶的視圖中隱藏起來。
有關(guān)使用coaching overlay的示例應(yīng)用程序砸紊,請參見放置對象和處理3D交互传于。

  • 支持自動輔導(dǎo):

默認(rèn)情況下,activatesautomatic是啟用的醉顽,因此您應(yīng)該覆蓋coachingOverlayViewWillActivate(_:)來確定教練是否在進(jìn)行中沼溜。協(xié)調(diào)您的操作以幫助用戶關(guān)注這些指令,例如游添,通過隱藏會話重新初始化時不需要的任何UI系草。

  • 在中斷后重新定位:
    如果啟用了重新本地化(請參閱sessionShouldAttemptRelocalization(_:)),如果任何中斷降低了應(yīng)用程序的跟蹤狀態(tài)否淤,ARKit將嘗試恢復(fù)您的會話悄但。在這種情況下,coaching overlay會自動出現(xiàn)石抡,并向用戶提供幫助ARKit進(jìn)行重新定位的指令。
在中斷后重新定位1

在此期間助泽,coaching overlay包含一個按鈕啰扛,讓用戶指示他們希望重新開始而不是恢復(fù)會話。

在中斷后重新定位2

ARKit通過調(diào)用你的委托的coachingOverlayViewDidRequestSessionReset(_:)函數(shù)在用戶按下Start時通知你嗡贺。實現(xiàn)這個回調(diào)隐解,如果你的應(yīng)用程序需要任何自定義動作來重新啟動AR體驗。

func coachingOverlayViewDidRequestSessionReset(_ coachingOverlayView: ARCoachingOverlayView) {    

    // Reset the session.
    let configuration = ARWorldTrackingConfiguration()
    configuration.planeDetection = [.horizontal, .vertical]
    session.run(configuration, options: [.resetTracking])

    // Custom actions to restart the AR experience. 
    // ...
}

如果你沒有實現(xiàn)coachingOverlayViewDidRequestSessionReset(_:)诫睬, coaching overlay會通過重置跟蹤來響應(yīng)Start Over按鈕煞茫,這也會移除任何現(xiàn)有的錨點。
有關(guān)重新本地化的更多信息,請參見管理會話生命周期和跟蹤質(zhì)量续徽。

3.30 ARSCNView

  • ARSCNView : 一個視圖蚓曼,使您能夠顯示與SceneKit增強現(xiàn)實的經(jīng)驗。
class ARSCNView : SCNView

ARSCNView類提供了創(chuàng)建增強現(xiàn)實體驗的最簡單方法钦扭,這種體驗將虛擬3D內(nèi)容與真實世界的設(shè)備攝像頭視圖混合在一起纫版。當(dāng)你運行視圖提供的ARSession對象:

  1. 該視圖自動將來自設(shè)備攝像機的實時視頻提要呈現(xiàn)為場景背景。
  2. 視圖的SceneKit場景的世界坐標(biāo)系統(tǒng)直接響應(yīng)由會話配置建立的AR世界坐標(biāo)系統(tǒng)客情。
  3. 視圖會自動移動它的SceneKit攝像頭其弊,以匹配設(shè)備在真實世界中的移動。

因為ARKit會自動將SceneKit空間與現(xiàn)實世界相匹配膀斋,所以放置一個虛擬對象梭伐,使其看起來能夠保持一個真實世界的位置,只需要適當(dāng)?shù)卦O(shè)置該對象的SceneKit位置仰担。(參見使用SceneKit提供3D虛擬內(nèi)容籽御。)

您不一定需要使用ARAnchor類來跟蹤添加到場景中的對象的位置,但是通過實現(xiàn)ARSCNViewDelegate方法惰匙,您可以將SceneKit內(nèi)容添加到ARKit自動檢測到的任何錨中技掏。

3.30.1 ARSCNView 類定義

3.30.2 ARSCNViewDelegate

  • ARSCNViewDelegate:代理方法您可以實現(xiàn)將SpriteKit內(nèi)容的自動同步與AR會話進(jìn)行協(xié)調(diào)。
    實現(xiàn)這個協(xié)議來提供與視圖的AR會話跟蹤的ARAnchor對象相對應(yīng)的SpriteKit內(nèi)容项鬼,或者管理視圖對這些內(nèi)容的自動更新哑梳。
    該協(xié)議擴展了ARSessionObserver協(xié)議,因此您的會話委托也可以實現(xiàn)那些方法來響應(yīng)會話狀態(tài)的更改绘盟。
  • 處理內(nèi)容更新:
//要求委托提供一個與新添加的錨點相對應(yīng)的SpriteKit節(jié)點鸠真。
func view(ARSKView, nodeFor: ARAnchor) -> SKNode?

//告訴代理,與一個新的AR錨相對應(yīng)的SpriteKit節(jié)點已經(jīng)被添加到場景中龄毡。
func view(ARSKView, didAdd: SKNode, for: ARAnchor)

//告訴代理吠卷,SpriteKit節(jié)點的屬性將被更新,以匹配其相應(yīng)錨點的當(dāng)前狀態(tài)沦零。
func view(ARSKView, willUpdate: SKNode, for: ARAnchor)

//告訴代理祭隔,SpriteKit節(jié)點的屬性已經(jīng)更新,以匹配其相應(yīng)錨的當(dāng)前狀態(tài)路操。
func view(ARSKView, didUpdate: SKNode, for: ARAnchor)

//告訴代理疾渴,與AR錨對應(yīng)的SpriteKit節(jié)點已經(jīng)從場景中移除。
func view(ARSKView, didRemove: SKNode, for: ARAnchor)

3.30.3 ARSCNView 屬性和方法

//用于管理視圖內(nèi)容的運動跟蹤和攝像機圖像處理的AR會話搞坝。
var session: ARSession

//將在視圖中顯示的SceneKit場景。
var scene: SCNScene

  • 響應(yīng)AR更新
//一個對象魁袜,你提供的中介同步視圖的AR場景信息與SceneKit內(nèi)容桩撮。
var delegate: ARSCNViewDelegate?

//方法可以實現(xiàn)將SceneKit內(nèi)容的自動同步與AR會話進(jìn)行協(xié)調(diào)敦第。
protocol ARSCNViewDelegate

  • 發(fā)現(xiàn)真實的表面
在捕獲的攝像機圖像中搜索與SceneKit視圖中某個點對應(yīng)的真實對象或AR錨點。
func hitTest(CGPoint, types: ARHitTestResult.ResultType) -> [ARHitTestResult]

//創(chuàng)建一個光線投射查詢店量,該查詢源于視圖上與攝像機視場中心對齊的一個點芜果。
func raycastQuery(from: CGPoint, allowing: ARRaycastQuery.Target, alignment: ARRaycastQuery.TargetAlignment) -> ARRaycastQuery?

  • 將內(nèi)容映射到實際位置
//返回與指定SceneKit節(jié)點關(guān)聯(lián)的AR錨點(如果有的話)。
func anchor(for: SCNNode) -> ARAnchor?

//返回與指定AR錨關(guān)聯(lián)的SceneKit節(jié)點(如果有的話)垫桂。
func node(for: ARAnchor) -> SCNNode?

//在ARKit檢測到的三維世界空間中师幕,返回從2D視圖到平面上的點的投影。
func unprojectPoint(CGPoint, ontoPlane: simd_float4x4) -> simd_float3?

  • 管理光照
//一個布爾值诬滩,指定ARKit是否在視圖的場景中創(chuàng)建和更新SceneKit燈光霹粥。
var automaticallyUpdatesLighting: Bool

  • 調(diào)試基于“增大化現(xiàn)實”技術(shù)的展示

//在SceneKit視圖中繪制覆蓋內(nèi)容以幫助調(diào)試AR跟蹤的選項
typealias ARSCNDebugOptions

  • 管理渲染效果
、疼鸟、確定視圖是否呈現(xiàn)運動模糊后控。
var rendersMotionBlur: Bool
//一個確定SceneKit是否將圖像噪聲特征應(yīng)用于應(yīng)用程序的虛擬內(nèi)容的標(biāo)志。
var rendersCameraGrain: Bool

3.31 ARSKView

class ARSKView : SKView

使用ARSKView:類來創(chuàng)建增強現(xiàn)實體驗,將2D元素放置在3D空間中的設(shè)備攝像機視圖中吴攒。當(dāng)你運行視圖提供的ARSession對象:

  1. 該視圖自動將來自設(shè)備攝像機的實時視頻提要呈現(xiàn)為場景背景张抄。
  2. 當(dāng)您實現(xiàn)ARSKViewDelegate方法來將 SpriteKit內(nèi)容與真實世界的位置相關(guān)聯(lián)時,視圖會自動縮放和旋轉(zhuǎn)那些 SpriteKit節(jié)點洼怔,以便它們看起來能夠跟蹤攝像機看到的真實世界署惯。

3.31.1 ARSKViewDelegate

  • ARSKViewDelegate: 提供方法您可以實現(xiàn)將SpriteKit內(nèi)容的自動同步與AR會話進(jìn)行協(xié)調(diào)。
protocol ARSKViewDelegate
  1. 方法您可以實現(xiàn)將SpriteKit內(nèi)容的自動同步與AR會話進(jìn)行協(xié)調(diào)镣隶。
  2. 實現(xiàn)這個協(xié)議來提供與視圖的AR會話跟蹤的ARAnchor對象相對應(yīng)的SpriteKit內(nèi)容极谊,或者管理視圖對這些內(nèi)容的自動更新。
  3. 該協(xié)議擴展了ARSessionObserver協(xié)議安岂,因此您的會話委托也可以實現(xiàn)那些方法來響應(yīng)會話狀態(tài)的更改轻猖。
  • 處理內(nèi)容更新的回調(diào)代理:
//要求委托提供一個與新添加的錨點相對應(yīng)的SpriteKit節(jié)點。
func view(ARSKView, nodeFor: ARAnchor) -> SKNode?

//告訴委派域那,與一個新的AR錨相對應(yīng)的SpriteKit節(jié)點已經(jīng)被添加到場景中咙边。
func view(ARSKView, didAdd: SKNode, for: ARAnchor)

//告訴委托,SpriteKit節(jié)點的屬性將被更新琉雳,以匹配其相應(yīng)錨點的當(dāng)前狀態(tài)样眠。
func view(ARSKView, willUpdate: SKNode, for: ARAnchor)

//告訴委托,SpriteKit節(jié)點的屬性已經(jīng)更新翠肘,以匹配其相應(yīng)錨的當(dāng)前狀態(tài)。
func view(ARSKView, didUpdate: SKNode, for: ARAnchor)

//告訴委托辫秧,與AR錨對應(yīng)的SpriteKit節(jié)點已經(jīng)從場景中移除束倍。
func view(ARSKView, didRemove: SKNode, for: ARAnchor)

3.32 ARMatteGenerator

  • ARMatteGenerator:一個創(chuàng)建啞光紋理的對象,你可以用它來遮擋你的應(yīng)用程序的虛擬內(nèi)容
class ARMatteGenerator : NSObject

當(dāng)你想要完全控制你的應(yīng)用程序的虛擬內(nèi)容時,使用這個類绪妹,基于ARKit在攝像頭feed中識別的人甥桂。

使用標(biāo)準(zhǔn)渲染器(ARViewARSCNView)的應(yīng)用程序不需要這個類來影響人們的遮擋。有關(guān)更多信息邮旷,請參見frameSemantics黄选。

為了幫助你的自定義渲染器與人遮擋,matte生成器處理alpha和深度信息在幀的分段緩沖和估計的深度數(shù)據(jù)婶肩,為你提供matte和深度紋理办陷。你使用這些紋理在你的應(yīng)用程序的虛擬內(nèi)容上分層

3.33 ARQuickLookPreviewItem

當(dāng)您想要控制背景律歼,指定共享表格共享的內(nèi)容民镜,或者在不允許用戶縮放特定模型的情況下禁用縮放時,使用這個類险毁。

3.34 ARFrame

  • ARFrame: 位置跟蹤信息作為會話的一部分而捕獲的視頻圖像

當(dāng)ARKit分析視頻幀以估計用戶在世界中的位置時制圈,一個正在運行的會話不斷地從設(shè)備攝像頭捕獲視頻幀。 ARKit還以ARFrame的形式向您提供這些信息畔况,并以您的應(yīng)用程序的幀速率的頻率提供這些信息鲸鹦。

你的應(yīng)用程序有兩種接收ARFrame的方式:

  1. 如果你的應(yīng)用程序維護(hù)了自己的渲染循環(huán),或者你需要在ARSCNViewDelegateARSKViewDelegate回調(diào)中獲取幀信息跷跪,那么從ARSession中請求currentFrame馋嗜。
  2. 讓你的一個對象成為ARSession的委托,當(dāng) ARKit捕獲新幀時自動接收它們域庇。

3.34.1 ARFrame 類定義

3.34.2 ARFrame 屬性方法

  • 訪問捕獲的視頻幀
//包含攝像機捕獲的圖像的像素緩沖區(qū)嵌戈。
var capturedImage: CVPixelBuffer

//幀被捕獲的時間。
var timestamp: TimeInterval

//深度圖(如果有的話)與視頻幀一起捕獲听皿。
var capturedDepthData: AVDepthData?

//幀(如果有)的深度數(shù)據(jù)被捕獲的時間熟呛。
var capturedDepthDataTimestamp: TimeInterval

  • 檢查世界地圖狀態(tài)
//為該框架生成或重新定位世界地圖的可行性。
var worldMappingStatus: ARFrame.WorldMappingStatus

//可能的值尉姨,描述ARKit如何徹底地映射給定幀中可見的區(qū)域庵朝。
enum ARFrame.WorldMappingStatus

  • 檢查現(xiàn)場參數(shù)
//有關(guān)用于捕獲幀的攝像機位置、方向和成像參數(shù)的信息又厉。
var camera: ARCamera

//基于攝像機圖像的照明條件的估計九府。
var lightEstimate: ARLightEstimate?

//返回一個仿射變換,用于在規(guī)格化圖像坐標(biāo)和用于在屏幕上呈現(xiàn)攝像機圖像的坐標(biāo)空間之間進(jìn)行轉(zhuǎn)換覆致。
func displayTransform(for: UIInterfaceOrientation, viewportSize: CGSize) -> CGAffineTransform

  • 跟蹤和查找對象
//表示場景中被跟蹤的位置或檢測到的對象的錨點列表侄旬。
var anchors: [ARAnchor]

//在捕獲的攝像機圖像中搜索真實世界的對象或AR錨。
func hitTest(CGPoint, types: ARHitTestResult.ResultType) -> [ARHitTestResult]

  • 調(diào)試現(xiàn)場檢測
//目前煌妈,場景分析的中間結(jié)果ARKit用于執(zhí)行世界跟蹤儡羔。
var rawFeaturePoints: ARPointCloud?

//AR會話的世界坐標(biāo)空間中的點的集合宣羊。
class ARPointCloud

  • 發(fā)現(xiàn)真實的表面
//獲取一個屏幕點的光線投射查詢。
func raycastQuery(from: CGPoint, allowing: ARRaycastQuery.Target, alignment: ARRaycastQuery.TargetAlignment) -> ARRaycastQuery

  • 2D追蹤人體
//ARKit在相機圖像中識別的身體的屏幕位置信息汰蜘。
var detectedBody: ARBody2D?

//屏幕空間表示ARKit在攝像機提要中識別的人員仇冯。
class ARBody2D

  • detectedBody: ARBody2D類型, 用于ARKit在相機圖像中識別的身體的屏幕位置信息
var detectedBody: ARBody2D? { get }

要啟用2D體檢測族操,您可以將體檢測幀語義添加到配置的frameSemantics屬性中苛坚,或者使用ARBodyTrackingConfiguration運行會話,在默認(rèn)情況下色难,體檢測是啟用的泼舱。

  • class ARBody2D : 屏幕空間表示ARKit在攝像機提要中識別的人員。

當(dāng)ARKit在攝像頭提示中識別一個人時莱预,它會估計身體關(guān)節(jié)的屏幕空間位置柠掂,并通過當(dāng)前幀的detectedBody向您提供該位置。

  • 將虛擬內(nèi)容與人隔離
//一個包含像素信息的緩沖區(qū)依沮,該像素信息識別來自用于遮擋虛擬內(nèi)容的攝像機提要的對象的形狀涯贞。
var segmentationBuffer: CVPixelBuffer?

//一個緩沖區(qū),表示用于遮擋虛擬內(nèi)容的攝像機提要的估計深度值危喉。
var estimatedDepthData: CVPixelBuffer?

//一個像素的分類宋渔,它定義了你用來遮擋應(yīng)用程序虛擬內(nèi)容的內(nèi)容類型。
enum ARFrame.SegmentationClass

  • segmentationBuffer : CVPixelBuffer類型辜限,標(biāo)識一個包含像素信息的緩沖區(qū)皇拣,該像素信息識別來自用于遮擋虛擬內(nèi)容的攝像機提要的對象的形狀。

  • estimatedDepthData :CVPixelBuffer類型薄嫡,深度數(shù)據(jù)緩沖區(qū)氧急,表示用于遮擋虛擬內(nèi)容的攝像機提要的估計深度值。

  • enum ARFrame.SegmentationClass :枚舉類型毫深,它定義了你用來遮擋應(yīng)用程序虛擬內(nèi)容的內(nèi)容類型

enum SegmentationClass : UInt8

ARKit根據(jù)它對攝像機提要像素數(shù)據(jù)的解釋應(yīng)用這個類中定義的類別吩坝。只有人在攝像機提要中被識別,因此可用的像素分類是ARFrame.SegmentationClass.personARFrame.SegmentationClass.none哑蔫。

  1. ARFrame.SegmentationClass.person: 將分割緩沖區(qū)中的像素作為人的一部分進(jìn)行分類钉寝。
  2. ARFrame.SegmentationClass.none: 將分割緩沖區(qū)中的像素分類為未識別的。
  • 開啟相機紋理
//一個值闸迷,用于指定相機紋理紋理中出現(xiàn)的紋理數(shù)量嵌纲。
var cameraGrainIntensity: Float

//由ARKit創(chuàng)建的可平鋪的金屬紋理,以匹配當(dāng)前視訊流的視覺特性腥沽。
var cameraGrainTexture: MTLTexture?

  • cameraGrainIntensity: 用于指定相機紋理紋理中出現(xiàn)的紋理數(shù)量逮走。
var cameraGrainIntensity: Float { get }

此屬性在[0..1],其中0表示沒有糧食今阳,1表示糧食的最大數(shù)量言沐。
當(dāng)您將此值應(yīng)用于cameraGrainTexture的深度組件時邓嘹,您將從存儲在金屬紋理中的各種視覺圖像噪聲數(shù)據(jù)中選擇概念上與此強度級別匹配的數(shù)據(jù)酣栈。

  • cameraGrainTexture: 由ARKit創(chuàng)建的可平鋪的金屬紋理险胰,以匹配當(dāng)前視訊流的視覺特性。
var cameraGrainTexture: MTLTexture? { get }

攝像頭紋理增強了用戶體驗的真實和增強方面的視覺凝聚力矿筝,使你的應(yīng)用程序的虛擬內(nèi)容具有類似的圖像噪聲特征起便,這些特征自然會出現(xiàn)在攝像頭feed中。

如下圖:

攝像頭紋理

如果ARSCNView是你的渲染器窖维,SceneKit默認(rèn)會將相機紋理應(yīng)用到你的應(yīng)用的虛擬內(nèi)容中榆综。有關(guān)更多信息,請參見rendersCameraGrain铸史。

  • rendersCameraGrain: 一個確定SceneKit是否將圖像噪聲特征應(yīng)用于應(yīng)用程序的虛擬內(nèi)容的標(biāo)志鼻疮。rendersCameraGrain是ARSCNView的一個屬性。
var rendersCameraGrain: Bool { get set }

默認(rèn)啟用琳轿。設(shè)置好后判沟,SceneKit會在你的應(yīng)用程序的虛擬內(nèi)容中添加一個相機紋理效果,該效果與ARKit在相機反饋中觀察到的圖像噪聲特征相匹配崭篡。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挪哄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子琉闪,更是在濱河造成了極大的恐慌迹炼,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颠毙,死亡現(xiàn)場離奇詭異斯入,居然都是意外死亡,警方通過查閱死者的電腦和手機蛀蜜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門刻两,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涵防,你說我怎么就攤上這事闹伪。” “怎么了壮池?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵偏瓤,是天一觀的道長。 經(jīng)常有香客問我椰憋,道長厅克,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任橙依,我火速辦了婚禮证舟,結(jié)果婚禮上硕旗,老公的妹妹穿的比我還像新娘。我一直安慰自己女责,他們只是感情好漆枚,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抵知,像睡著了一般墙基。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刷喜,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天残制,我揣著相機與錄音,去河邊找鬼掖疮。 笑死初茶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浊闪。 我是一名探鬼主播恼布,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼规揪!你這毒婦竟也來了桥氏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤猛铅,失蹤者是張志新(化名)和其女友劉穎字支,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奸忽,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡堕伪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了栗菜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欠雌。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖疙筹,靈堂內(nèi)的尸體忽然破棺而出富俄,到底是詐尸還是另有隱情,我是刑警寧澤而咆,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布霍比,位于F島的核電站,受9級特大地震影響暴备,放射性物質(zhì)發(fā)生泄漏悠瞬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浅妆。 院中可真熱鬧望迎,春花似錦、人聲如沸凌外。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趴乡。三九已至对省,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晾捏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工哀托, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惦辛,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓仓手,卻偏偏與公主長得像胖齐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嗽冒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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