クリッピングの実装(途中経過)

赤・緑・青の三点から構成される面をポリゴンに、赤枠を描画領域に見立ててクリッピングを実装中。

デモデモ
■操作方法
(赤・緑・青の○Sprite)ドラッグ→特定の頂点移動

3頂点全てを同時移動
 テンキー8 → 上
 テンキー2 → 下
 テンキー4 → 左
 テンキー6 → 右

ポリゴン回転
 テンキー7 → 左
 テンキー9 → 右

ポリゴン伸縮
 テンキー+ → 拡大
 テンキー- → 縮小

※面は時計周りで構成されるので、
 右回りに赤→緑→青となるような場合のみ正常に判定できます。

                                                                                          • -



どうにかクリッピング後の頂点を求める処理がほぼ完成。
(クリッピングされた辺が2つの場合の場合分けがまだ未完成)

座標変換に始まりテクスチャマッピングやらシェーディング周りの実装を一通り勉強してきたけど、
クリッピングは今までで一番悩まされてる。

Flashでの3Dレンダリング手法がスキャンライン法じゃないとか、
クリッピングを自力実装してるプログラマの人口が絶対的に少ないとか、
色々と考えられるため参考になる資料が無いに等しい。

ので、どんどんスパゲティー的なコードになってってる・・・
クリッピング処理だけで既に500行超えしてるんですが(;´Д`)
取りあえず、クリッピング後の頂点数を求められるようになったら、
求めた頂点を使ってポリゴンを分解、各頂点の内積やUV値の補正を実装する予定。

クリッピングは地味な処理っぽく見えるけど凄く重要なのは分かった。
これが出来ないとワールド用の巨大六面体とか長細いポリゴンとか配置できないしね。
がんばろう。

クリッピングの勘違いに気づかせてくれたAlternativa3Dですが、
調べれば調べるほど凄い。クリッピングの正確さにも驚いたけど、
BSP-Treeってので深度管理してるのを知って更に衝撃。
というか、この単語自体初めて目にしたけど、
wiki曰くzバッファなしでも正確な深度管理ができるという…。
zソートなんて実装してる場合じゃなかったとしか言いようがないwwww
まぁ追々勉強するってことで…orz

そういった部分からみてもPV3Dよりも完成度高いですねぇAlternativa3D。
パッケージの中身もかなりシンプルだし。
しいて言うならライティング周り(影ではなく光源的な表現)がちょっと弱いのかな?という感じがする。
といっても影付けがかなり精巧だからそれでも十分だと思うけど。

多分ライセンス絡みでPV3Dより厳しいから皆使ってないんだろうなぁとも思ったり。