照明の種類を変えて、シーンの見栄えの変化を観察する
前回の途中からここまでは、シーンビューのautoenablesDefaultLighingプロパティをtrueに設定して、いかにもそれらしく見えるデフォルトの照明を使ってきました。もちろんシーンには、任意の照明を設定する機能も備わっています。その照明にはいろいろな種類がありますが、今回はアンビエント(環境)、オムニ(全周)、スポットの3種類を試してみることにしましょう。
アンビエントというと、なんとなくいい雰囲気のものを想像するかもしれませんが、シーンの照明としては、実は最も雰囲気のないものがこれです。シーンの照明はSCNLightクラスのオブジェクトを作成してから、そのtypeプロパティで種類を設定します。ここでは.ambientを設定しています。その照明オブジェクトを、空のノードのlightプロパティに設定することで、照明ノードとしてシーンの中に配置することができます。
アンビエント照明は、位置も方向もまったく関係ないので、シーンのルートノードの子ノードとして追加するだけです。その結果は、まったく味気ないものとなってしまいます。
すべての方向からすべての場所がくまなく照らされるので、影もなにも付きません。このようなシーンをどこかで見たような気がするかもしれません。そうです、前回に、まだ何も照明を指定する前のシーンがちょうどこんな感じでした。ただし、光の強さはちょっと弱い様子でした。実は、このアンビエント照明のintesityプロパティを0.5くらいに設定して光を弱めると、ちょうど何も照明を指定しなかった場合と同じような見栄えになります。
次にオムニ照明を試しましょう。オムニは全周といったような意味ですが、これは各ノードに全方向から光が当たるアンビエントとは異なり、照明の1点から全方向に光が放出されるのです。したがって、照明の位置を指定する必要があります。
オムニ照明の光には方向性があるので、ノードには陰影や影もできます。これは、シーンにautoenablesDefaultLighingを設定した場合よりも、さらに雰囲気のあるシーンになるでしょう。
最後にスポット照明を試します。これがどんなものかは説明する必要はないでしょう。照明のタイプは.spotです。照明の中心の光が強くあたる部分の角度(.spotInnerAngle)と、そのまわりの弱い光があたる範囲(.spotOuterAngle)を別々に指定できます。
スポット照明の場合には、照明を置く位置に加えて、その向きも指定する必要があります。ただし、照明を当てたいノードに向かって正しく数字で設定するのは、手動ではちょっと難しいのが事実です。そこで、照明を当てたいノードを指定することで、自動的にその方向に照明を向ける機能を利用することにしました。照明のノードのconstraintsプロパティに、ターゲットノードを指定して作ったSCNLookAtConstraintクラスのオブジェクトを設定することで実現できます。
画面の向かって右上のあたりから、中央の四角い箱のノードに向けてスポット照明を当てた結果を見てみましょう。
雰囲気はオムニ照明と似ていますが、照明の当たる範囲が絞られているので、照明があたらない部分は真っ暗で何も見えなくなっています。
任意の位置からシーンを撮影するカメラを設置する
シーンには、照明と同じようにカメラを設置することもできます。もちろん、これまでも、シーンが画面に表示されていたので、何らかのカメラがあったのは確かです。しかし、これまでは、すべてデフォルトのカメラで撮影した映像でした。そのカメラは、最初はz軸上のマイナス方向にあって、そこからx軸、y軸z軸が交差する中央を見るものでした。これまではタッチ操作でそのカメラの位置を動かしてシーンを見ていたのです。ここでは、カメラの位置と向きを最初からプログラムで指定する方法を示します。
まずカメラ自体はSCNCameraクラスのオブジェクトとして作成します。カメラにも色々なパラメータが設定できますが、ここでは視野の範囲を自動的に調整するautomaticallyAdjustsZRangeをtrueにして、レンズの焦点距離を70mmに設定しています。
カメラオブジェクトも、照明と同じようにまず空のノードを作り、そのcameraプロパティに設定することで、シーンに配置できるようになります。ここではカメラの位置は数値で指定していますが、向きはやはり自動的に箱のノードを向くようにconstraintsを指定しています。このあたりの考え方は、スポット照明の場合と同じです。
このプログラムを動かすと、最初から決まった位置から決まった方向を撮影したシーンを見ることができるようになっています。
次回の予定
今回は、いろいろな形状を表すジオメトリを使い、あれこれとノードを作ってシーンの中に配置してみました。また、いろいろな種類の照明の効果も試し、カメラを決まった位置、向きに設置することもできるようになりました。これで、なんとなくとっつきにくかったSceneKitも、だいぶ身近に感じられるようになったのではないかと思います。次回は、シーンの中でノードを動かすアニメーション効果を試してみる予定です。