Apple Engine

Apple, iPhone, iOS, その周辺のことについて

WWDC 2017 の SceneKit サンプル Fox 2 を調べる その7

level_scene.scn を調べていく。 シーンにおける操作キャラクター Max、敵キャラクター以外の背景に相当するシーンファイル。

level_scene.scn では設定されているものが多いため、今回は読み飛ばしても構わない。

f:id:x67x6fx74x6f:20180418195835j:plain

 

このシーンにあるジオメトリやパーティクル、物理フィールド以外のもの

ロジック部分である 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 の色が映り込んでいる。

f:id:x67x6fx74x6f:20180418195836j:plain

 

古い Apple TV では .exr ファイルでの動作が厳しいらしく、tvOS のコード上では png に変更されている。

溶岩が流れている影響で Fog の色はオレンジ、開始距離が 10、終了が 400 となっている。

 

level_scene.scn のノード

depart

岩場や地面、小屋など背景のジオメトリ。

f:id:x67x6fx74x6f:20180418195837j:plain

 

lava

溶岩のジオメトリ。ジオメトリに対してパーティクルが設定されている。
また、Shader Modifiers でカスタムシェーダーが適応されている。

f:id:x67x6fx74x6f:20180418195838j:plain

f:id:x67x6fx74x6f:20180418195839j:plain

 

door

小屋で仲間を閉じ込めている扉。
Max が侵入できないように Static の Physics Body が設定されている。

f:id:x67x6fx74x6f:20180418195840j:plain

 

grass072, Object001, Object002, Object003, Object004

マップ内に配置しているの植物で、シダ植物の葉、その葉と薇(ぜんまい)のような渦を巻きで構成されたものが配置されている。
葉の動きなど Shader Modifiers でカスタムシェーダーが適応されている。

f:id:x67x6fx74x6f:20180418195841j:plain

 

CollectableBig

鍵を表示させるための宝石のアイテム。
Max 接触時にイベントを起こすため Physics Body が設定されている。

f:id:x67x6fx74x6f:20180418195842j:plain

 

また、ジオメトリの両面を透過した際にアーティファクト(表示上のエラー)が出るため、iOS 11 の SceneKit で追加された Dual layar が使用されている、

f:id:x67x6fx74x6f:20180418195843j:plain

 

skybox_copy

depart と lava の外面に筒状のジオメトリが配置されており、星の瞬きのパーティクルが設定されている。

そのため、プレイヤーからの視点は、岩などの背景 > skybox_copy のパーティクル > シーンの背景画像の順で外観が見えることとなる。

f:id:x67x6fx74x6f:20180418195844j:plain

 

DirectLight

全体の光を設定しているディレクショナルライト。
シャドーマップの生成を iOS 11 から追加された Auto Adjust を使用しているため、シャドーマップの細かな設定をしなくても綺麗に描画される。

また、コードの方では遠方のシャドーマップの処理を段階的に低減させるカスケードシャドーマップの設定をしている。

f:id:x67x6fx74x6f:20180418195845j:plain

 

mobilePlatform

小屋の前にある溶岩に浮かぶ移動する6角形の橋?

mobilePlatform ノードの下には、 橋のジオメトリ、橋が動いた時に溶岩の表面の揺れを表示するパーティクルが2つ、 Max が橋に着地した時に溶岩へ落ちないようにコリジョンが設定されている。

f:id:x67x6fx74x6f:20180418195846j:plain

 

key

鍵のアイテム。宝石のアイテム取得後に表示されるため、このノードの透明度は 0 になっている。

鍵のジオメトリに Max 接触時にイベントを起こすため Physics Body が設定されているものと、鍵出現時にパーティクルを表示するためのからのノードがある。

f:id:x67x6fx74x6f:20180418195847j:plain

 

cameraStart_node、cameraGame_node、cameraMountain_node、cameraGameArena_node、camPlatform01_node、camPlatform02_node

親ノードの子のノードにカメラが設置されたものが複数用意されている。 シーン内の ”trigCam_〜” の名前で設定されている Physics Body に Max が接触した際、 特定の場所に移動するカメラ。

f:id:x67x6fx74x6f:20180418195848j:plain

 

trigCam_camLookAt_cameraGameArena

ゲームスタート後ジャンプし段を降りた際、この Physics Body に当たると、cameraGameArena_node のカメラへ切り替わる。

f:id:x67x6fx74x6f:20180418195849j:plain

 

trigCam_camLookAt_cameraMountain

ゲームスタート後ジャンプし段を登った際、この Physics Body に当たると、cameraMountain_node のカメラへ切り替わる。

f:id:x67x6fx74x6f:20180418195850j:plain

 

trigCam_camTrav_camPlatform01

鍵を取る際に岸にあるこの Physics Body に当たると、camPlatform01_node のカメラへ切り替わる。

camPlatform01_node のカメラは視点変更の操作ができなくなる。 そのため、他のカメラの Physics Body に接触するまで視点変更できない。

f:id:x67x6fx74x6f:20180418195851j:plain

 

trigCam_camLookAt_cameraGameArena

宝石の近くに設置されたこの Physics Body に当たると、cameraGameArena_node のカメラへ切り替わる。
岸などで視点変換されたあと移動して戻る際にこちらの視点に変更される。

f:id:x67x6fx74x6f:20180418195852j:plain

 

trigCam_camLookAt_cameraGameArena

宝石の間近に設置されたこの Physics Body に当たると、cameraGameArena_node のカメラへ切り替わる。
岸などで視点変換されたあと移動して戻る際にこちらの視点に変更される。

f:id:x67x6fx74x6f:20180418195853j:plain  

trigCam_camTrav_camPlatform02

鍵取得後に移動する橋の前にある岸に設置されており、この Physics Body に当たると、camPlatform02_node のカメラへ切り替わる。

camPlatform02_node のカメラは視点変更の操作ができなくなる。 そのため、他のカメラの Physics Body に接触するまで視点変更できない。

f:id:x67x6fx74x6f:20180418195854j:plain

 

trigCam_camTrav_camPlatform01

鍵の場所から宝石の場所に戻る場所に設置され、この Physics Body に当たると、camPlatform01_node のカメラへ切り替わる。

camPlatform01_node のカメラは視点変更の操作ができなくなる。 そのため、他のカメラの Physics Body に接触するまで視点変更できない。

f:id:x67x6fx74x6f:20180418195855j:plain

 

trigCam_camLookAt_cameraGame

宝石のある空間に設置され、この Physics Body に当たると、cameraGame のカメラへ切り替わる。

f:id:x67x6fx74x6f:20180418195856j:plain

 

trigCam_camLookAt_cameraStart

スタート地点に設置され、この Physics Body に当たると、cameraStart のカメラへ切り替わる。

f:id:x67x6fx74x6f:20180418195857j:plain

 

trigCam_camLookAt_cameraGame

動く橋を超えた岸に設置され、この Physics Body に当たると、cameraGame のカメラへ切り替わる。

f:id:x67x6fx74x6f:20180418195858j:plain

 

trigAction_unlockDoor

鍵穴近くに設置される Physics Body。 コードでは当たると扉を開け、仲間の解放、パーティクル、クリア画面を表示する。

f:id:x67x6fx74x6f:20180418195859j:plain

 

friendsBox

用途不明。Static の Physics Body が設定されている

f:id:x67x6fx74x6f:20180418195900j:plain

 

CameraCinematic02

クリア時のカメラ。

f:id:x67x6fx74x6f:20180418195901j:plain

 

CameraCinematic01

宝石取得時に鍵へフォーカスするカメラ。

f:id:x67x6fx74x6f:20180418195902j:plain

 

他のカメラと異なりフォーカスレングスなどが調整されていて、鍵より後ろの背景がボケて表示される。

f:id:x67x6fx74x6f:20180418195903j:plain

 

particles_spores、particles_spores_arena

ステージで舞う火の粉。

f:id:x67x6fx74x6f:20180418195904j:plain

 

particles_volcanoSmoke_v1

煙のパーティクル。

f:id:x67x6fx74x6f:20180418195905j:plain

 

particles_smallJets_v1

溶岩の飛び散りを表現するのパーティクル。

f:id:x67x6fx74x6f:20180418195906j:plain

 

particles_volcanoSmoke_v2

煙のパーティクル。

f:id:x67x6fx74x6f:20180418195907j:plain

 

particles_smallJets_v2

溶岩の飛び散りを表現するのパーティクル。

f:id:x67x6fx74x6f:20180418195908j:plain

 

particles_lock

鍵穴を周りのパーティクル。

f:id:x67x6fx74x6f:20180418195909j:plain

 

field

particles_spores、particles_spores_arena で火の粉となっているパーティクルにターピュランスの Physics Field で揺らぎを与えている。

f:id:x67x6fx74x6f:20180418195910j:plain

 

particles_smallSmoke

隙間から出る煙のパーティクル。

f:id:x67x6fx74x6f:20180418195911j:plain

 

particles_littleSplashs

小さな穴から出る溶岩の飛び散りを表現するのパーティクル。

f:id:x67x6fx74x6f:20180418195912j:plain

 

particles_door

unlock_door.scn のパーティクルを設置する空のノード。

f:id:x67x6fx74x6f:20180418195913j:plain

 

CameraDof0, CameraDof1, CameraDof2

デバッグ用のカメラでそのままでは使えない。
ソースコードをいじることで、これらのカメラを試すボタンが出る。

 

次回はソースコードの説明をしようとしていたけど、全体の仕組みについて見てゆこうと思う。