WWDC18で発表されたARコンテンツの新フォーマット "USDZ" ですが、同WWDCでのセッション「Integrating Apps and Content with AR Quick Look」ではQLPreviewController
やSafariでプレビューするためのHTMLの解説はあれど、ARKit・SceneKitで利用するための実装方法については提示されていませんでした1。
しかし、「ARKitアプリケーションの実装をしなくてもAR体験を提供できるフォーマット」という点がUSDZの最もインパクトがある点だとしても、それを含めて「ユニバーサル」2である点がUSDZという新フォーマットの売りであるはずで、ARKitでの利用方法(=SceneKitでの利用方法)について明示されないのは片手落ち感を感じてしまいました。「ブラウザやプレビューでAR体験を提供するための『専用』フォーマット」ではないはずで。
おそらく、USDZはSceneKitでの利用だけ見るとUSDと同様で、USD自体はModel I/Oでの読み込みがiOS 10で既にサポートされていたので、そこは自明(新しいフィーチャーではない)として解説しなかったのでしょう。
とはいえ私のように「で、USDZってARKit(SceneKit)ではどう利用するの」とググった方(これからググる方)は多いと思われるので、ここに実装を示しておきます。
実装
.usdz
ファイルからMDLAsset
を初期化する
読み込みにはModel I/Oフレームワークを利用します。アプリケーションバンドル内の.usdz
ファイルのURLをMDLAsset
のイニシャライザに渡して初期化するだけです。
guard let url = Bundle.main.url(forResource: name, withExtension: "usdz") else { fatalError() }
let mdlAsset = MDLAsset(url: url)
ちなみに、MDLAsset
がサポートしている(ロード可能な)ファイル形式は、MDLAsset
のcanImportFileExtension(_:)
から調べることができます。同メソッドのリファレンスにも、サポートしているファイル形式が載っています。3
- Alembic
.abc
- Universal Scene Description
-
.usd
,.usda
,.usdc
-
- Universal Scene Description (Mobile)
.usdz
- Polygon
.ply
- Wavefront Object
.obj
- Standard Tessellation Language
.stl
MDLAsset
からSCNScene
を初期化する
SCNSceneのリファレンスを見ると、次のようなイニシャライザがあります。
convenience init(mdlAsset: MDLAsset)
しかし、このイニシャライザは、import ARKit
やimport SceneKit
、import ModelIO
していても使えません。次のようにSceneKit.ModelIO
をインポートする必要があります。
import SceneKit.ModelIO
先ほど作成したMDLAsset
オブジェクトをイニシャライザに渡し、SCNScene
を初期化します。
let scene = SCNScene(mdlAsset: mdlAsset)
あとは通常通り(.scn
ファイル等からSCNScene
を初期化した場合と同様)のSceneKitの実装になります。
サンプルコード
「ARKit-Sampler」にAppleの公式配布usdzファイルをARKitで使うサンプルを追加しました。
(本サンプルはiOS 11で動作させています)