グーローシェーディングを実装


デモデモ


実装に当ってPsyark.jpさんのこのエントリーが大変参考になりました。
(3年も前のエントリーというのが驚き!)
というか「Flash」「グーローシェーディング」でgoogle先生に聞いてみても
国内でこの方のエントリー以外は見当たらなさそうだった。
始めソースを見たときは何がどうなって動いてるのかわからなかったけど
ペイントでいじりながら見てたら何となくわかってきました。
多分↓こういうことだと思います。

それと

即値1638.4(=2^14/10)はbeginGradientFillのマジックナンバーです。

1638.4と言う定数があるんですが、
これはどうやらグラデーションボックスを調整するもののようですね。
グラデーション調整は本来matrixクラスのcreateGradientBoxメソッドを呼び出して行いますが、
このメソッドにはボックスサイズ(width,height)と回転(rotate[radian]と座標位置(x,y)があります。
このメソッドを呼び出したしてボックスサイズを指定しなかった場合、
縦横のサイズは-819.2〜+819.2で出力されるようです。

つまりこのメソッドを使わない場合は
このデフォルト正方形のサイズを考慮して指定する必要があるため
「指定したいボックスサイズ / 1638.4」としているんですね。

行列クラスがオリジナルのものを使用していたので、
それにあわせたコードで実装したらそっちの方が負担が大きかった…w
ので、更に調整して何とか参考のソースコードと同様程度の速度に直せました。

が、重いです!
頂点法線求めるロジックとかひどいことになってる…
もっとスマートに組みたいなぁ(;´Д`)

パッケージにしてみたけどクラス分けが下手糞なのか、
500行超えてるクラスが二つある…

苦肉の策でFPS120で回してますwwwww
よし後はテクスチャだけだ!(フォンはスルー!