質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ARKit

ARKitは、iPhone/iPad向けのARアプリ用フレームワーク。iOS11以降に標準搭載されています。これを用いたARアプリは、特殊なデバイスがなくてもiPhone/iPadの単眼カメラを使用して動作することが可能です。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2104閲覧

SCNNodeのテクスチャーをプログラムから変更したい

nmty

総合スコア19

ARKit

ARKitは、iPhone/iPad向けのARアプリ用フレームワーク。iOS11以降に標準搭載されています。これを用いたARアプリは、特殊なデバイスがなくてもiPhone/iPadの単眼カメラを使用して動作することが可能です。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/10/25 13:38

編集2020/10/25 14:31

◼︎環境
PC:macOS mojave バージョン10.14.6
Xcode:バージョン11.3.1

◼︎3Dモデルの一部のテクスチャーを変更したい

・Xcode(ARkit)で3Dモデルファイル(iPhoneの3Dモデル、scnファイル)を読み込み、
その中の1つのパーツ(iPhoneの画面)のテクスチャーを変更したいと考えていますが方法がわかりません。

※現在作成中のコードは以下のように記述しています。場所としては③の部分で、取得したSCNNodeのdiffudeを
変更したいと考えています。

Swift

1//3Dモデルのscnファイルを取得 2guard let scene = SCNScene(named: "IPhone.scn",inDirectory: "art.scnassets/iphone") 3 else{fatalError()} 4//①まずiPhone全体を取得 5var node = scene.rootNode.childNode(withName: "IPhone", recursively: true) 6//②その中のiPhone画面を取得 7var iScreen = node?.childNode(withName: "iScreen", recursively: true) 8//③ 9//(ここでiScreenのテクスチャーを変更したい) 10//④シーンに登録する 11self.sceneView.scene.rootNode.addChildNode(node)

参考画像:iPhoneの3DモデルのScene graph
iPhoneの3DモデルのScene graph


※以下のようにSCNBoxで作られたオブジェクトのテクスチャーを変更できるのは、様々なサイトで書かれているのですが、上記のようなSCNSceneから取得したSCNNodeのテクスチャーの変更の方法がわからず、ここで質問させていただきました。お詳しい方がいらっしゃればご教授頂けると助かります。

Swift

1let samplebox = SCNBox(width: 1.0, height: 1.0, length: 1.0, chamferRadius: 0.0) 2samplebox.firstMaterial?.diffuse.contents = UIImage(named: "texture")

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

対象のSCNNodeが取得できている場合、以下の様な処理でテクスチャ変更できませんでしょうか。

処理手順
1、対象Nodeのジオメトリに設定されているマテリアルを取得する(マテリアルは複数存在する場合あり)
2、複数マテリアルから、対象のマテリアルだけ抽出(マテリアル名で抽出する)
3、上記2で抽出したマテリアルに対し、任意のテクスチャを設定する

以下サンプル

Swift

1// 対象Nodeからマテリアル取得 2let mats: [SCNMaterial] = iScreen.geometry!.materials 3 4// 複数マテリアル存在する(場合がある)ので、For文で対象のマテリアルだけ取得 5for mat in mats { 6 if mat.name == "Color_008" { 7 // 任意のテクスチャ貼り付け 8 mat.diffuse.contents = UIImage.init(named: "テクスチャのImage名") 9 } 10}

投稿2020/10/25 14:41

tsuki01

総合スコア1751

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nmty

2020/10/26 01:38

回答ありがとうございます。マテリアルのことをあまり意識していませんでしたが、自分の画面をよく見ると確かに複数のマテリアルがあることに気づきました(今までなんとなくfirstMaterial?.diffuse.contentsとしておけばいいと思っていました汗)。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問