1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ARKit で 3D モデルのテクスチャの色をコード上から変更して表示する方法

Posted at

はじめに

こちらは xRギルド Advent Calendar 2024 の 18 日目の記事です。
私の他にも xR に関する記事がたくさん更新されていますので、読んでいただけると幸いです。

環境

macOS Sonoma 14.7.1
Xcode 16.1.0

本題

今回は ARKit において、取り込んだ dae 形式の 3D モデルのテクスチャの色をコード上から変更して表示する方法について解説していこうと思います。

モデルを scn ファイルに変換する

まずはコード上から取り扱いやすく、マテリアルなどノード内の関係性もわかりやすくするために dae 形式から scn 形式にモデルを変換します

  1. dae 形式の 3D モデル(サンプル)をプロジェクトに追加します

  2. 次にモデルを選択した状態でツールバーから Editor > 「Convert to SceneKit file format (.scn)」を選択し、scn 形式に変換します

スクリーンショット 2024-12-17 15.49.02.png

変換前後のモデルのマテリアルの対応を知る

変換前後でエディタ上のマテリアルがどう対応しているかは以下のように確認することでわかります。
モデルの構造によってはより深い位置のノードにマテリアルが適用されている場合もあります。

dae 形式でのマテリアルの一覧 scn 形式でのマテリアルの一覧
スクリーンショット 2024-12-17 15.49.57.png スクリーンショット 2024-12-17 15.49.33.png

モデルのテクスチャの色を切り替える

  1. まずはマテリアルを取得したいノードの名前を確認しておきます

スクリーンショット 2024-12-17 16.28.33.png

  1. 次に改めて scn 形式のモデルで変更したいマテリアルの名前を確認しておきます。今回は「Body」と「Lights」の色を変更していきます

スクリーンショット 2024-12-17 15.49.33.png

  1. 次に以下のようにすることでコード上から「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

実行結果

IMG_1638.jpg

おわりに

今回は色を変えるだけにしましたが、SCNMaterialProperty の contents は Any 型で、UIImage を設定すれば色だけでなく、画像テクスチャの切り替えなどにも応用することが可能です。

最近案件で実装した 競馬AR における各馬の 3D モデルのゼッケンのテクスチャ画像の切り替えもこの仕組みで実装しました。

最後まで読んでくださりありがとうございました。
来年も xR 界隈盛り上げていけるように色々と挑戦していきたいです。

参考リンク

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?