神トラ2もどきの作成時メモ

=前置き=

 このまえ作った神トラ2もどきの作成のプログラム的なTips。というか自分が思い出せるようにするためのメモ。

=基礎=

 3D表示用にAway3Dを使用。

 地面と天井は一枚絵にして、壁は一つ一つPlaneとして生成した。壁に関しては並んでるものをまとめる方向も考えたが、後述のマテリアル変更の件もあり、個別のPlaneを生成する方向でまとまった。
 Away3DではZの比較はピクセル単位ではなくメッシュ単位っぽく、普通の設定では天井の方がプレイヤーより奥に表示されてしまうことがあったため、mesh_ceil.zOffset = 10000;という感じでZのオフセットをかけて手前に表示するようにした。

 Flashをこのブログに貼る方法はいくつかあるが、Away3D(厳密にはStage3D)を使ったものを貼る場合はwmodeの設定も必要なのでFree Web Hosting - Your Website need to be migratedを使わせてもらった。

=3D表示を2Dっぽく見せる=

 神トラ2(もどき)は「通常モード」と「壁入りモード」の2つがあり、別にどちらも普通の3Dカメラにしても良かったが、「通常モード」の方は普通の2Dゲーム的な見た目にしておいた方が壁入り時のインパクトが大きいかなーと思ってそちらのカメラは2Dカメラっぽくすることにした。

 で、一般的には2Dゲームのカメラは「並行投影(Orthographic)カメラ」というやつで、3Dゲームのカメラは「透視投影(Perspective)カメラ」というやつなんだけど、壁の出入り時にこの2つの別種のカメラを補間するのはだいぶ面倒。ということで、ここでは3Dカメラ(透視投影)のFOV(画角)を小さくすることで平行投影っぽくしてみた。(3Dカメラでは60度で、2Dカメラもどきでは2度)
 ただ、FOVを小さくすると見える範囲も狭くなるのでカメラの位置を大きく後ろに下げてちゃんと一定の広さが見えるようにした。さらにそうすると今度は描画可能な距離範囲(Near〜Far)の範囲外になったりするのでこちらも一緒に変更するようにした。

 真上から見る場合や真横から見る場合はこの対応だけで良いんだけど、RPGっぽい表示にする場合はカメラを斜め45度から表示することになり、このままの設定だと縦方向が1/Root(2)に縮小されて表示されてしまう。そこで、さらにレンズ(PerspectiveLens)を継承してupdateMatrixのところで「縦にRoot(2)倍する」感じのAspectRatioを設定して引き伸ばすことで等倍っぽい表示にした。

 現状の設定ではここまでの対応で止めているが、プレイヤーの表示がやや潰れているのが気になる場合、いわゆる「ドットバイドット」な感じで表示を調整する必要がある。が、今回はそこまでは気にならないかなーというのとあくまで紹介のための簡易ゲームなのでここまでで止めておいた。


=壁に入った際の表現=

 神トラ2(もどき)では壁にプレイヤーを貼り付けて描画する必要がある。単にプレイヤーのPlaneを壁の少し手前に表示するだけだと、壁が直角に奥に曲がっているところでプレイヤーがはみ出てしまう。ということで、専用の対応が必要になる。

 当初は「投影マッピング」という手法をとるつもりだったものの、この手法だと他の壁にまでプレイヤーが表示されてしまうのと、ピクセルシェーダの負荷がムダに大きくなってしまう(投影しない壁でも不要なサンプリングが発生する)ので、今回は専用シェーダで実現することにした。

 具体的には「普通の描画(壁描画)にもう一つテクスチャ(プレイヤー)を追加し、UV座標のオフセットを外部から指定することで横方向にスクロールさせる」というシェーダを追加した。Away3D的にはEffectMethodBaseを継承したやつにシェーダを書いてそれを壁のマテリアルにaddMethodで加えるだけなので比較的簡単に実装できた。
 ただ、全ての壁にこのシェーダを加えるとやはり不要なサンプリングが増えて描画負荷などが大きくなるので、「現在居る壁」と「移動先の壁」だけ上記のマテリアルに変更するような処理を行ったりした。

=遷移部分=

 「通常モード」<=>「壁入りモード」ではカメラの「ターゲットとの距離」「FOV」「NEAR・FAR」「AspectRatio」をそれぞれ変化させる必要がある。
 当初は「ターゲットとの距離」を等速で変化させ、それに応じて他のパラメータを計算していたが、そうすると画角(FOV)の変化が遠くに行くほどゆるやかになり、画面での見た目がやや不自然な感じになった。
 そこで、「FOV(画角)」の方を等速(角速度)で変化させて他のパラメータを計算する方式にした。これでかなり自然な遷移になったが、逆に自然になりすぎたのでもうちょっとSinカーブとかを使って緩急をつけるべきだったかもしれない。


=予定=

 次は「ゲーム作成」やら「作曲ツール作成」やらを行う予定。どちらにしても数ヶ月レベルで時間がかかる見込み。