WWDC 2017 の SceneKit サンプル Fox 2 を調べる その7
level_scene.scn を調べていく。 シーンにおける操作キャラクター Max、敵キャラクター以外の背景に相当するシーンファイル。
level_scene.scn では設定されているものが多いため、今回は読み飛ばしても構わない。
このシーンにあるジオメトリやパーティクル、物理フィールド以外のもの
ロジック部分である Swift のコードでは、
キャラクターの状態が変わった際に何かが行われるようになっており、
状態の変化を知らせるものはほぼ物理シミュレーションのヒットテストで行われている。
そのため、このシーンでは当たり判定としていくつかの Physics Body が設定されている。
以下、このシーンでのヒットテスト
- アイテムと Max がぶつかり、アイテムを取得する時
- 扉の鍵穴に近づきを扉を開ける時
溶岩に Max が入ってしまった時の判定は collision.scn の COLL_lava で判定し、敵との判定は enemy1、enemy2 の各 GKComponent で行なっている
level_scene.scn の背景と Fog
背景画像に Background_sky.png が設定されており、Image Based Lighting (IBL) では sky_cube.exr が設定されている。
以下の画像では、試しに Physically Based のマテリアルを置いている。マテリアルには背景ではなく、上が青、下が黄色の IBL の色が映り込んでいる。
古い Apple TV では .exr ファイルでの動作が厳しいらしく、tvOS のコード上では png に変更されている。
溶岩が流れている影響で Fog の色はオレンジ、開始距離が 10、終了が 400 となっている。
level_scene.scn のノード
depart
岩場や地面、小屋など背景のジオメトリ。
lava
溶岩のジオメトリ。ジオメトリに対してパーティクルが設定されている。
また、Shader Modifiers でカスタムシェーダーが適応されている。
door
小屋で仲間を閉じ込めている扉。
Max が侵入できないように Static の Physics Body が設定されている。
grass072, Object001, Object002, Object003, Object004
マップ内に配置しているの植物で、シダ植物の葉、その葉と薇(ぜんまい)のような渦を巻きで構成されたものが配置されている。
葉の動きなど Shader Modifiers でカスタムシェーダーが適応されている。
CollectableBig
鍵を表示させるための宝石のアイテム。
Max 接触時にイベントを起こすため Physics Body が設定されている。
また、ジオメトリの両面を透過した際にアーティファクト(表示上のエラー)が出るため、iOS 11 の SceneKit で追加された Dual layar が使用されている、
skybox_copy
depart と lava の外面に筒状のジオメトリが配置されており、星の瞬きのパーティクルが設定されている。
そのため、プレイヤーからの視点は、岩などの背景 > skybox_copy のパーティクル > シーンの背景画像の順で外観が見えることとなる。
DirectLight
全体の光を設定しているディレクショナルライト。
シャドーマップの生成を iOS 11 から追加された Auto Adjust を使用しているため、シャドーマップの細かな設定をしなくても綺麗に描画される。
また、コードの方では遠方のシャドーマップの処理を段階的に低減させるカスケードシャドーマップの設定をしている。
mobilePlatform
小屋の前にある溶岩に浮かぶ移動する6角形の橋?
mobilePlatform ノードの下には、 橋のジオメトリ、橋が動いた時に溶岩の表面の揺れを表示するパーティクルが2つ、 Max が橋に着地した時に溶岩へ落ちないようにコリジョンが設定されている。
key
鍵のアイテム。宝石のアイテム取得後に表示されるため、このノードの透明度は 0 になっている。
鍵のジオメトリに Max 接触時にイベントを起こすため Physics Body が設定されているものと、鍵出現時にパーティクルを表示するためのからのノードがある。
cameraStart_node、cameraGame_node、cameraMountain_node、cameraGameArena_node、camPlatform01_node、camPlatform02_node
親ノードの子のノードにカメラが設置されたものが複数用意されている。 シーン内の ”trigCam_〜” の名前で設定されている Physics Body に Max が接触した際、 特定の場所に移動するカメラ。
trigCam_camLookAt_cameraGameArena
ゲームスタート後ジャンプし段を降りた際、この Physics Body に当たると、cameraGameArena_node のカメラへ切り替わる。
trigCam_camLookAt_cameraMountain
ゲームスタート後ジャンプし段を登った際、この Physics Body に当たると、cameraMountain_node のカメラへ切り替わる。
trigCam_camTrav_camPlatform01
鍵を取る際に岸にあるこの Physics Body に当たると、camPlatform01_node のカメラへ切り替わる。
camPlatform01_node のカメラは視点変更の操作ができなくなる。 そのため、他のカメラの Physics Body に接触するまで視点変更できない。
trigCam_camLookAt_cameraGameArena
宝石の近くに設置されたこの Physics Body に当たると、cameraGameArena_node のカメラへ切り替わる。
岸などで視点変換されたあと移動して戻る際にこちらの視点に変更される。
trigCam_camLookAt_cameraGameArena
宝石の間近に設置されたこの Physics Body に当たると、cameraGameArena_node のカメラへ切り替わる。
岸などで視点変換されたあと移動して戻る際にこちらの視点に変更される。
trigCam_camTrav_camPlatform02
鍵取得後に移動する橋の前にある岸に設置されており、この Physics Body に当たると、camPlatform02_node のカメラへ切り替わる。
camPlatform02_node のカメラは視点変更の操作ができなくなる。 そのため、他のカメラの Physics Body に接触するまで視点変更できない。
trigCam_camTrav_camPlatform01
鍵の場所から宝石の場所に戻る場所に設置され、この Physics Body に当たると、camPlatform01_node のカメラへ切り替わる。
camPlatform01_node のカメラは視点変更の操作ができなくなる。 そのため、他のカメラの Physics Body に接触するまで視点変更できない。
trigCam_camLookAt_cameraGame
宝石のある空間に設置され、この Physics Body に当たると、cameraGame のカメラへ切り替わる。
trigCam_camLookAt_cameraStart
スタート地点に設置され、この Physics Body に当たると、cameraStart のカメラへ切り替わる。
trigCam_camLookAt_cameraGame
動く橋を超えた岸に設置され、この Physics Body に当たると、cameraGame のカメラへ切り替わる。
trigAction_unlockDoor
鍵穴近くに設置される Physics Body。 コードでは当たると扉を開け、仲間の解放、パーティクル、クリア画面を表示する。
friendsBox
用途不明。Static の Physics Body が設定されている
CameraCinematic02
クリア時のカメラ。
CameraCinematic01
宝石取得時に鍵へフォーカスするカメラ。
他のカメラと異なりフォーカスレングスなどが調整されていて、鍵より後ろの背景がボケて表示される。
particles_spores、particles_spores_arena
ステージで舞う火の粉。
particles_volcanoSmoke_v1
煙のパーティクル。
particles_smallJets_v1
溶岩の飛び散りを表現するのパーティクル。
particles_volcanoSmoke_v2
煙のパーティクル。
particles_smallJets_v2
溶岩の飛び散りを表現するのパーティクル。
particles_lock
鍵穴を周りのパーティクル。
field
particles_spores、particles_spores_arena で火の粉となっているパーティクルにターピュランスの Physics Field で揺らぎを与えている。
particles_smallSmoke
隙間から出る煙のパーティクル。
particles_littleSplashs
小さな穴から出る溶岩の飛び散りを表現するのパーティクル。
particles_door
unlock_door.scn のパーティクルを設置する空のノード。
CameraDof0, CameraDof1, CameraDof2
デバッグ用のカメラでそのままでは使えない。
ソースコードをいじることで、これらのカメラを試すボタンが出る。
次回はソースコードの説明をしようとしていたけど、全体の仕組みについて見てゆこうと思う。