影表示
http://www.nicovideo.jp/watch/sm4483055
Project MAOWの動画はもう見たかな?ちょこまか動くちっこいのの下に影が出てるよね。
E3Dに影を表示する機能は無いはずだけど、どうやってるんだろうと不思議に思った人もいるだらう。
潰してるんじゃないかと思っていたらやっぱりそうだったので、今日はそれをやってついでに発展系についても考えてみよう。
真下に投影する
オラも半年くらい前に考え付いたが結局やらなかった方法だ。MAOWのハイソな動画を見ればわかると思うが、かなり華麗に影が出ている。
動画のスクショを勝手に使うわけにも行かないので、おいらが勝手に用意した。こんな感じ。
何かそれっぽく影が出ているぞ。
やり方は無茶苦茶単純である。影を表示したいモデルとおんなじモデルを真っ黒に塗りつぶしぺしゃんこに潰しておんなじ座標に表示する。
同じモデルを潰す、ということはボーン構造も同じだ。よってモーションを適用してやっても問題なく見える動作になる。不覚にもオイラはモーションまでは気付かなかった。
(MAOW開発者yam2氏のブログにコメントがあるので敬意を払いつつ必ず音読する事)
発展系
「ウホッ、表示できたお!」
真上から光が当たり、真下に影っぽいものが投影された。ここで次に誰もが考えるのが「光の向きを変える」ことである。
普通に潰したら真上になるんだから、斜めに引き伸ばして潰したらいい、と思いついた人は60点。やってみたらわかるが、単純に斜めに引き伸ばすとこうなる。(事が多い)*1
以下、光が前から当たり、影が真後ろに向かって伸びる、という前提で話を進める。
まず何でこうなっちまったかと言うと、拡大の中心が原点中心だからである。原点を中心として、それより前にある点は前へ、後ろにある点は後ろへ、等しい比率で移動させる。図で表すとこうだ。マウスで適当に書いたがフィーリングでわかれ。
改善策は3つくらい考え付いた。
原点に先端を持ってくる
一つは、影はある特定の方向にしか伸びない、と決めてしまう事。
具体的には、以下のように、原点ピッタリを先端に持ってきたオブジェクトを作る。
こうすれば、原点中心で引き伸ばした時、原点より前に対して頂点の移動は発生しないはずだ。無いんだから。
('A`)<・・・無理やろ
横スクロール固定のゲーム、シューティング等、キャラの向きが単純なゲームなら光を当てたい方向の先端を原点ピッタリに持ってくればOKだ。理論上はな!試してないし、とてつもなく面倒だと思うよ!
拡大縮小した後に移動してつじつまを合わせる
これも、影の方向を特定の向きに固定した方法だ。これは先のSSで紹介した、前に伸びた影を、後ろに移動させてつじつまを合わせるというものだ。
もちろん、あんなふうに影はでねえし、よくみると色々おかしいが、とりあえず見れるものにはなるはずだ。
実際にやるとこうなる。
光源も整え、背中から光を当ててやった図。中々よく見えるじゃないか。
*正確な影ではない*
まず、影の基準となる頂点を決める。普通は足のつま先。そのローカル座標を取得しておく。
めんどくさかったら、一度ありとあらゆる全ての頂点の位置情報を調べ
- 最も光が当たる方向に近い(この場合は正面、つまりZ座標が最も小さいもの)
- かつ最も投影面に近い(この場合はXZ平面なので、最もY座標が0に近いもの)
を探し出しておく。2番目の条件が必要なのは、もしつま先より長いもの、たとえばおちんちn頭に生えた角など、つま先より長いものを検出されると後々面倒だからである。この条件を充てておけば、大抵の場合つま先の頂点が最終的に残るはず。
4足歩行の動物、象さんとか、そういうものには多分対応しない接地面は恐らく1つだけしかもてない。
この頂点がどれだけ移動したのかを調べ、その差分を修正するように移動させるだけ。
その上で残る問題点
- 正確な影ではない
- 当然のことながら、物理法則に基づいた正しい影ではない。
- ポリ数が倍になってしまう
- 頭の悪い(個人的にはむしろ賢い発想だと感心した)トゥーン表示と似たようなモンだ
- 影専用のローポリモデルを作る事で改善できる
- ボーン構造は同じにしないとモーションで不具合出る
- 頭の悪い(個人的にはむしろ賢い発想だと感心した)トゥーン表示と似たようなモンだ
- 半透明には出来ない
- 重なっているポリゴンが丸見えである
- もちろん平坦な地形に利用は限定される
結論
シャドウマップが実装されるまで大人しく真上からライトを当ててください