Blender →
*.gltf
→ Converter →*.usdz
→ Composer →*.rcproject
→ RealityKit / ARKitmarkdown
🔗 原文連接 app
RealityKit 是Apple 在 WWDC2019 推出的加強現實應用開發框架,是一個包含了虛擬對象渲染、動畫、物理、音頻等功能的3D引擎,配合 LiDAR 掃描儀和 ARKit 的場景理解能力,開發者能夠更輕鬆地創造高質量的加強現實體驗。除了用於渲染 3D 內容的 RealityKit 以外,Apple 還提供了配套的 3D 內容生產工具:Reality Converter 和 Reality Composer,並以 USDZ 3D文件格式爲中介,串聯起加強現實應用的內容生產工做流程。框架
RealityKit 中全部的虛擬對象都繼承自 Entity
,其中默認包含了Transform
和Synchronization
信息:ide
不管是經過 USDZ 文件格式仍是經過 Reality Composer 導入到項目的 3D 文件,在 RealityKit 中都是經過 Entity
的樹形結層級構來存儲的。工具
Anchor Entity 用於表示 AR 場景中的座標信息,既能夠是用於錨定對象的空座標,也能夠是實現 HasAnchoring
協議的 Model Entity。不過更經常使用的兩種方式是做爲 Raycast 或平面檢測結果的載體:oop
let touchLocation = sender.location(in: arView)
guard let raycastResult = arView.raycast(from: touchLocation, allowing: .estimatedPlane, alignment: .any).first else {
messageLabel.displayMessage("No surface detected, try getting closer.", duration: 2.0)
return
}
let anchor = AnchorEntity(raycastResult: raycastResult)
anchor.addChild(entity)
arView.scene.addChild(anchor)
複製代碼
2. 用於平面檢測,過濾符合面積要求的平面座標,例如選定遊戲場景所在平面:佈局
// 返回檢測到的 **水平** 且 面積不小於 20x20 cm 的平面座標
let anchor = AnchorEntity(plane:.horizontal, minimumBounds: [0.2,0.2])
anchor.addChild(model)
arView.scene.addAnchor(anchor)
複製代碼
RealityKit 實際渲染的虛擬對象存儲在 Model Enityt 中的 ModelComponent
中;Model Entity 中也能夠定義對象的碰撞屬性、物理屬性、物理運動等。動畫
一個虛擬對象的視覺部分由 Mesh 和 Material 組成,前者定義對象的幾何形狀,後者定義紋理材質。RealityKit 支持 4 種基本幾何形狀,意味着能夠在程序運行過程當中生成(同時也意味着除此以外的複雜形狀須要從其它建模工具中產生):ui
.generateBox
spa
.generatePlane
.generateSpere
.generateText
RealityKit 支持 4 種基本材質:
SimpleMaterial
:基本材質,可以根據材質屬性(金屬、粗糙等)反射環境、虛擬光源;
UnlitMaterial
:不反射光線的基本材質;
VideoMaterial
:將視頻素材做爲材質,例如虛擬播放器/小電視;
OcclusionMaterial
:遮擋素材,能夠形成遮擋效果:
因爲 RealityKit 目前只支持少許基本幾何形狀,更復雜的虛擬場景仍然須要經過其餘專業 3D 建模工具生成。接下來以 Blender 爲例,說明從建模到實現 AR 效果的開發過程。
在 Blender 中完成模型、貼圖、動畫等設計後,能夠導出 3D 文件(其中兼容性最好的是glTF 2.0
格式),而後經過 Reality Converter 轉換爲 USDZ 文件(也能夠利用 Blender 插件,直接導出到 .usd
文件,其原理是同樣的)。 在 Reality Converter 中能夠對 3D 對象的材質等屬性進行簡單修改:
從 Reality Converter 導出的 USDZ 文件能夠直接導入到 Reality Composer 中:
在 Composer 中能夠從新編輯對象的物理屬性、空間座標、動畫效果等,但更重要的是明確不一樣對象的分組、層級關係,由於在 RealityKit 中頗有可能須要分別獨立或成組地訪問這些資源;在實際 AR 場景中的座標關係也是在當前資源相對位置關係的基礎上從新定義的。
Composer 導出的 .rcproject
文件能夠直接導入到 Xcode ,並能夠在 Swift
中直接經過文件名訪問:
let scene = try! RocketLaunch.loadTower()
複製代碼
有時候須要在代碼中對導入的資源進行從新調整,例如給導入的幾何形狀替換遮擋材質:
let coverGround = rocketScene!.findEntity(named: "LaunchRocket_Ground")?.findEntity(named: "Ground")
var component: ModelComponent = coverGround?.components[ModelComponent].self as! ModelComponent
component.materials = [OcclusionMaterial()]
coverGround?.components.set(component)
複製代碼
RealityKit 只有兩年時間,目前仍有不少不足之處,但願在後續版本中能夠獲得改進:
首先是基本幾何形狀支持太少,有人吐槽 RealityKit 的 LOGO 中,只有一個球形(Sphere)是原生支持的。
其次是缺乏對粒子系統的支持,這就意味着沒法支持酷炫的特效,就像 SceneKit 的 SCNParticleSystem
同樣。
雖然 Composer 支持一些 PPT 級別的行爲/動畫效果,可是對於從其它工具導出到 Converter 再導出到 Composer 的工做流程來講,對於動畫的兼容性仍然頗有限。
對於擁有強大號召力的 Apple 來講,採用本身的 USDZ 格式並不使人意外,整個生態對USDZ 的支持也沒必要擔憂,只不過其先天限制可能須要你事先了解,已決定是否符合本身的項目須要,具體能夠參考:《glTF and USDZ》。
Apple 對於 AR 軟硬件生態的佈局已經逐漸清晰,RealityKit 做爲虛擬渲染引擎,與 ARKit 的配合更加緊密,前者負責渲染加強實體,後者負責理解現實場景:
可是從目前 RealityKit 的設計來看,它當下的目標並不是覆蓋全部 AR 應用場景(或者說不具有這個能力),而是緊密配合硬件的適用範圍(如 LiDAR 支持 5m 內的激光掃描),針對小場景、客廳級AR 應用,提供了一整套穩健、快速的生產解決方案。