はじめに
こちらは xRギルド Advent Calendar 2024 の 18 日目の記事です。
私の他にも xR に関する記事がたくさん更新されていますので、読んでいただけると幸いです。
環境
macOS Sonoma 14.7.1
Xcode 16.1.0
本題
今回は ARKit において、取り込んだ dae 形式の 3D モデルのテクスチャの色をコード上から変更して表示する方法について解説していこうと思います。
モデルを scn ファイルに変換する
まずはコード上から取り扱いやすく、マテリアルなどノード内の関係性もわかりやすくするために dae 形式から scn 形式にモデルを変換します
-
dae 形式の 3D モデル(サンプル)をプロジェクトに追加します
-
次にモデルを選択した状態でツールバーから Editor > 「Convert to SceneKit file format (.scn)」を選択し、scn 形式に変換します
変換前後のモデルのマテリアルの対応を知る
変換前後でエディタ上のマテリアルがどう対応しているかは以下のように確認することでわかります。
モデルの構造によってはより深い位置のノードにマテリアルが適用されている場合もあります。
dae 形式でのマテリアルの一覧 | scn 形式でのマテリアルの一覧 |
---|---|
モデルのテクスチャの色を切り替える
- まずはマテリアルを取得したいノードの名前を確認しておきます
- 次に改めて scn 形式のモデルで変更したいマテリアルの名前を確認しておきます。今回は「Body」と「Lights」の色を変更していきます
- 次に以下のようにすることでコード上から「Body」と「Lights」のマテリアルの色をそれぞれ変更できます
// Car.scn のシーンファイルを読み込む
let scene = SCNScene(named: "Car.scn")!
// シーンから Car ノードを取得してくる
if let carNode = scene.rootNode.childNode(withName: "Car", recursively: true) {
// Body のマテリアルを取得
if let body = carNode.geometry?.materials.filter({ $0.name == "Body" }).first {
// マテリアルの色を変更
body.diffuse.contents = UIColor.green
}
// Lights のマテリアルを取得
if let lights = carNode.geometry?.materials.filter({ $0.name == "Lights" }).first {
// マテリアルの色を変更
lights.diffuse.contents = UIColor.yellow
}
}
// sceneView にセットする
sceneView.scene = scene
実行結果
おわりに
今回は色を変えるだけにしましたが、SCNMaterialProperty の contents は Any 型で、UIImage を設定すれば色だけでなく、画像テクスチャの切り替えなどにも応用することが可能です。
最近案件で実装した 競馬AR における各馬の 3D モデルのゼッケンのテクスチャ画像の切り替えもこの仕組みで実装しました。
最後まで読んでくださりありがとうございました。
来年も xR 界隈盛り上げていけるように色々と挑戦していきたいです。