Swift Playgroundsで学ぶiOSプログラミング

いろいろな形のノードをシーンの中に配置する

文●柴田文彦 編集●吉田ヒロ

2018年07月27日 17時00分

照明の種類を変えて、シーンの見栄えの変化を観察する

 前回の途中からここまでは、シーンビューのautoenablesDefaultLighingプロパティをtrueに設定して、いかにもそれらしく見えるデフォルトの照明を使ってきました。もちろんシーンには、任意の照明を設定する機能も備わっています。その照明にはいろいろな種類がありますが、今回はアンビエント(環境)、オムニ(全周)、スポットの3種類を試してみることにしましょう。

 アンビエントというと、なんとなくいい雰囲気のものを想像するかもしれませんが、シーンの照明としては、実は最も雰囲気のないものがこれです。シーンの照明はSCNLightクラスのオブジェクトを作成してから、そのtypeプロパティで種類を設定します。ここでは.ambientを設定しています。その照明オブジェクトを、空のノードのlightプロパティに設定することで、照明ノードとしてシーンの中に配置することができます。

デフォルトの照明に代えてアンビエント照明を指定しています。アンビエント照明には位置も方向も指定する必要がありません。もちろん指定しても意味がありません

 アンビエント照明は、位置も方向もまったく関係ないので、シーンのルートノードの子ノードとして追加するだけです。その結果は、まったく味気ないものとなってしまいます。

アンビエント照明では、すべてのノードにすべての方向から一様の光が当たります。陰影も影も付かずノードの立体感はかなり損なわれます

 すべての方向からすべての場所がくまなく照らされるので、影もなにも付きません。このようなシーンをどこかで見たような気がするかもしれません。そうです、前回に、まだ何も照明を指定する前のシーンがちょうどこんな感じでした。ただし、光の強さはちょっと弱い様子でした。実は、このアンビエント照明のintesityプロパティを0.5くらいに設定して光を弱めると、ちょうど何も照明を指定しなかった場合と同じような見栄えになります。

 次にオムニ照明を試しましょう。オムニは全周といったような意味ですが、これは各ノードに全方向から光が当たるアンビエントとは異なり、照明の1点から全方向に光が放出されるのです。したがって、照明の位置を指定する必要があります。

オムニ照明を設定しています。オムニ照明は、裸電球、あるいは小さな太陽のようなもので、指定した照明の位置の1点から全方向に光を放ちます

 オムニ照明の光には方向性があるので、ノードには陰影や影もできます。これは、シーンにautoenablesDefaultLighingを設定した場合よりも、さらに雰囲気のあるシーンになるでしょう。

オムニ照明では、ノードに深い陰影が付いて立体感が強調されます。照明の位置から遠いほど暗くなっていることも確認できます

 最後にスポット照明を試します。これがどんなものかは説明する必要はないでしょう。照明のタイプは.spotです。照明の中心の光が強くあたる部分の角度(.spotInnerAngle)と、そのまわりの弱い光があたる範囲(.spotOuterAngle)を別々に指定できます。

スポット照明では、照明の位置と方向の他にも光の広がる範囲の角度を指定できます。角度を小さくするほど狭い範囲の照明となります

 スポット照明の場合には、照明を置く位置に加えて、その向きも指定する必要があります。ただし、照明を当てたいノードに向かって正しく数字で設定するのは、手動ではちょっと難しいのが事実です。そこで、照明を当てたいノードを指定することで、自動的にその方向に照明を向ける機能を利用することにしました。照明のノードのconstraintsプロパティに、ターゲットノードを指定して作ったSCNLookAtConstraintクラスのオブジェクトを設定することで実現できます。

 画面の向かって右上のあたりから、中央の四角い箱のノードに向けてスポット照明を当てた結果を見てみましょう。

この例では、自動的に中央の四角い箱にスポットが向くように設定しているので、光がそこに集中して、周辺は急激に暗くなっています

 雰囲気はオムニ照明と似ていますが、照明の当たる範囲が絞られているので、照明があたらない部分は真っ暗で何も見えなくなっています。

任意の位置からシーンを撮影するカメラを設置する

 シーンには、照明と同じようにカメラを設置することもできます。もちろん、これまでも、シーンが画面に表示されていたので、何らかのカメラがあったのは確かです。しかし、これまでは、すべてデフォルトのカメラで撮影した映像でした。そのカメラは、最初はz軸上のマイナス方向にあって、そこからx軸、y軸z軸が交差する中央を見るものでした。これまではタッチ操作でそのカメラの位置を動かしてシーンを見ていたのです。ここでは、カメラの位置と向きを最初からプログラムで指定する方法を示します。

 まずカメラ自体はSCNCameraクラスのオブジェクトとして作成します。カメラにも色々なパラメータが設定できますが、ここでは視野の範囲を自動的に調整するautomaticallyAdjustsZRangeをtrueにして、レンズの焦点距離を70mmに設定しています。

照明と同じようにカメラも1つのノードとしてシーンに追加できます。カメラには非常に多くのパラメータを指定できます。必要なら絞りやボケ具合も設定できます

 カメラオブジェクトも、照明と同じようにまず空のノードを作り、そのcameraプロパティに設定することで、シーンに配置できるようになります。ここではカメラの位置は数値で指定していますが、向きはやはり自動的に箱のノードを向くようにconstraintsを指定しています。このあたりの考え方は、スポット照明の場合と同じです。

 このプログラムを動かすと、最初から決まった位置から決まった方向を撮影したシーンを見ることができるようになっています。

カメラを追加することで、最初から決まった位置、決まった方向でシーンを撮影できるようになります。もちろんシーンビューのallowsCameraControlがtrueになっていれば、ここからタッチ操作でカメラを動かすことも可能です

次回の予定

 今回は、いろいろな形状を表すジオメトリを使い、あれこれとノードを作ってシーンの中に配置してみました。また、いろいろな種類の照明の効果も試し、カメラを決まった位置、向きに設置することもできるようになりました。これで、なんとなくとっつきにくかったSceneKitも、だいぶ身近に感じられるようになったのではないかと思います。次回は、シーンの中でノードを動かすアニメーション効果を試してみる予定です。

mobileASCII.jp TOPページへ