SceneKitのマテリアルのdiffuseを変更して3D物体の見た目を変える


SceneKitのマテリアルについて一番くわしいブログ記事にiOS で SceneKit を試す(Swift 3) その33 - ジオメトリの質感を決めるマテリアルについてがありますが、今記事では、もっと簡単なところだけにフォーカスします。

マテリアルとは


https://developer.apple.com/documentation/scenekit/scnmaterial

AppleのSCNMaterialの説明を引用すると、ジオメトリの表面の見た目を決める濃淡の特徴のセットと訳せます。

どうやって設定するの

scnファイルを開いてsphereというジオメトリをおいた様子が上です。

右側の玉アイコンで編集できます。

赤くしてみる

上記のようにdiffuseで色を変更するとmaterialの色が変わります。

マテリアルは1つだけではない

先の例では、上記のようにuntitiledMaterialが赤くなっていました。スフィアの場合は表面が1つしかないので、materialが一個しかありませんでした。しかし、円柱の場合はどうでしょう。

上のように、1つしかマテリアルを追加しなければ、全体が赤くなりますが、

円柱は表面が上の面、下の面、側面と3つあるので3つまでマテリアルを追加して面によって色を変えることができます。materialはそれぞれidentityに名前を入れて名前をつけることができます。

SCNTextのジオメトリに対して行うと、上のようにIKEAも再現できる。。!w

画像を割り当ててみる

diffuseには画像ファイルも割り当てることができます。

こんなかんじで、画像マテリアルで模様が自由自在です。

実はあの飛行機も

ARKitのテンプレートを作ると出てくるこの飛行機にも実はmaterialがはってあります。

ためしにマテリアルを削除してみると

真っ白になってしまいました。

実は飛行機の模様、以下のような画像のマテリアルが貼ってあるだけなのです。3Dのモデルを展開して2Dの面にしたときの展開図みたいなイメージですかね。

コードでもできるよ

let sphere = SCNSphere(radius: 0.1)
sphere.firstMaterial?.diffuse.contents = UIColor.red

let node = SCNNode()
node.geometry = sphere

複数のマテリアルをつけたいときは以下のように

let m1 = SCNMaterial()
m1.diffuse.contents = UIColor.red // 赤

let m2 = SCNMaterial()
m2.diffuse.contents = UIColor.blue // 青

sphere.materials = [m1, m2]

まとめ

  • materialのdiffuseに色を入れると表面の色が変わる
  • materialは1つだけではない、表面の数だけ設定できる
  • materialには画像も入れられる