iOS で SceneKit を試す(Swift 3) その33 - ジオメトリの質感を決めるマテリアルについて
SceneKit で言うマテリアルとはジオメトリの質感を決めるための設定だと考えてもらえば良いかと。
これまででも、firstMaterial などで設定していたがもう少し詳しくを紹介していく。
以前に、3DCG にはカメラ、ジオメトリ、ライトが必要だと書いたが、もう一つ重要なのがジオメトリの質感である。
大体の 3DCG の制作ツールなどでは最初に設定されているため、マテリアル設定がないということはないが、マテリアルが存在しないとジオメトリが描画されない。
マテリアルは何をしているのか
ジオメトリの法線情報を元に、ジオメトリがどのような色の光を反射しているか決めており、
赤い物体は赤色を反射するし、光が強いとハイライトができる。
法線とは
ざっくり書くと、主な役目はジオメトリの頂点や面がどの方向を向いているかの情報。
例えば、カメラやライトの光に対して表を見ているか裏を見ているか。 カメラから見て裏にあるものは、ものに隠れるので描画しなくても良いし、 ライトから見て裏にある部分は陰を落とす。
強引にジオメトリの断面を書いたが、
ライトが光を照射している方向の反対向きに法線がある場合はハイライトになるし、同じ向きに近い方は影になる。
SceneKit のマテリアルの種類 (Lighting Model)
マテリアルでは 3DCG の制作ソフト同様に、
光の処理が異なるライティングモデルが用意されている。
ほとんどの場合 Physically Based を使用することが多いと思われる。
- Constant
- Lambert
- Blinn
- Phong
- Physically Based
Constant
単色で塗られ光の影響を受けない。
Lambert
光沢のないつや消しを行なっている物体に向いている質感。
ハイライトはつかない。
Blinn
金属のような広めのハイライトをもつ物体に向いている質感。
2番目に計算のコストが高い。
Phong
鏡面反射を行うような物体のような強い光沢を持つ質感。
Normal や iOS 11 で追加される Height Map では、ロジク的な問題で状況によっては光沢部分が汚くなる可能性がある。
Physically Based
Lambert、Blinn、Phong は計算で近似した質感を計算しているが、
Physically Based は光学的に現実世界に近いリアルなジオメトリの表示を行う。
この中では最も計算コストが高い。
SceneKit マテリアルにはどのような設定値があるのか
以下のもの。ライティングモデルで使用できるものが異なる。
名称 | 機能 |
---|---|
Diffuse | 表面色の設定 |
Specular | 光沢色の設定 |
Normal | Normal Map 使用時の設定 |
Reflective | 鏡面反射設定 |
Transparent | 半透明時の設定(こちらとは別にジオメトリ全体のもある) |
Occlusion | Ambient Occlusion (画像)使用の際の設定 |
Illumimation | 自発光しているように見せるための設定 |
Emission | 自発光の値の設定 |
Multiply | 全ての設定適応後にこちらの値が乗算される設定 |
Ambient | 環境光の設定 |
ライティングモデルが Physically Based のみ使用できるもの。
名称 | 機能 |
---|---|
Metalness | 金属のような表面を表す設定 |
Roughness | 表面の粗さの設定 |
Physically Based 以外では、フレネル効果(シャボン玉のように輪郭部分の屈折率が変わる効果)の追加ができ、
Blinn、Phong ではハイライトの設定を Shininess で設定できる。
共通で設定できるものでは、ジオメトリの半透明度やジオメトリをどのように描画するか、深度情報をどのように扱うかなどがある。
詳しくは Material Inspector の説明の際に紹介する。
テクスチャ
画像を壁紙やシールのようにマテリアルに貼り付けることができる。 マテリアルの色は Swift の Any となっており UIColor やテクスチャ、テクスチャの配列を設定できる。
テクスチャや色の設定をすることでジオメトリのリアリティが増す。
今回はここまで。