[Swift]3DモデルをSCNSceneに変換する方法2つ


Swiftで3DモデルをSCNSceneに変換するにはModelIOを経由する方法とscnファイルを作成する方法の2つがあります。
片方を実装するともう片方を忘れることが多くてその度に調べることになっているので、備忘録として残しておきます。

前提条件は以下の通りです。

  • Swift 5
  • Xcode 11.7
  • iOS 13.7

ModelIOを経由する方法

ModelIOのMDLAssetを使い、そこからSCNSceneを読み込みます。
最初にModelIOをimportしておきましょう。注意点としては本体ではなくSceneKitの方にあるものをimportすることです。

example.swift
import SceneKit.ModelIO

変換したい3Dモデルはプロジェクトに追加しておきます。
階層はどこでもいいですが複数の3Dモデルを使うのであればちゃんと1つのディレクトリにまとめておく方がいいでしょう。
今回は"hoge.usdz"という3Dモデルを追加しているものとしています。
あとはBundleから3DモデルのURLを取得して、そのURLをもとにMDLAssetを作成し、作成したMDLAssetからSCNSceneに変換します。

example.swift
guard let url = Bundle.main.url(forResource: "hoge", withExtension: "usdz") else { return }
let asset = MDLAsset(url: url)
let scene = SCNScene(mdlAsset: asset)

URL取得時のforResourceにはファイル名を、withExtensionには拡張子を指定します。
今回はusdz形式ですがobjでもgltfでも大丈夫です。

scnファイルを作成する方法

コードで実装せず最初からscnファイルを作成しておく方法です。
まずはModelIOを経由する方法と同じように3Dモデルをプロジェクトに追加します。
その後追加した3Dモデルを選択した状態で、Xcode上部のメニューにあるEditorから Convert to SceneKit file format (.scn)を実行します。

するとプロジェクトに3Dモデルのファイルと同名の.scnファイルが追加されます。
例)hoge.usdz → hoge.scn
このscnファイルをSCNSceneで直接読み込みます。

example.swift
let scene = SCNScene(named: "hoge.scn")

どちらの方法でも難しいところはありませんが、ModelIOをimportしたりMDLAssetを作成する手間を考えると、scnファイルを作成する方法が便利ではないかと思います。