Google Chrome または Safari を使用される事を強くお薦めしますw
他のブラウザでは Javascript の処理が重いです(汗)


2010/10/13

リアルタイムで3D迷路を表示する その2

視錘台の内外判定の話です。


まず面aよりも手前にあるかどうかですが、これは視点から見て図形までの距離が面aまでの距離D1 よりも小さければ手前にあると判定します。
同様に面bよりも遠くにあるかは面bまでの距離 D2 よりも大きいかどうかで判定します。

図形までの距離が D1 よりも大きく D2 よりも小さければ画角の範囲にあるかを見ます。
図形の頂点毎の計算になりますが、図で P1 は視点からの距離でZ方向(奥行き)に Lz1 、X 方向(横)に Lx1 の位置にあります。
簡単のために画角が90度だとすると、Lx1 < Lz1 であれば P1 は画角の範囲内であることになります。 P2 では Lx2 > Lz2 なので画角の範囲外であることになります。

前回説明した通り、頂点の内1つでも画角の範囲にあれば描画しますので、4点全て調べなくても途中で範囲内であると判断することもあるので、多少はスピードアップに繋がっているかもしれません。

このように判定はとても簡単なのですが、視点が原点で視線方向がZ軸であるという条件でなければ使えません。つまり、全ての図形の頂点座標をまず変換する必要があります。
表示せずに捨ててしまう図形の座標値まで変換するのは無駄なので、変換前に捨てられるものがあれば捨てるべきです。

このゲームで表示するのは全て同一サイズの直方体ですから、マス目として考えることができます。


このようなマップであった場合、下図にあるようにグレーで塗ったマス目は座標変換前に捨ててしまいます。


45度右を向いた場合であれば下図のグレー部分を先に捨てます。


実際にはこんなきれいな角度でなく、たとえば13度なんて角度の時もあるので話はもう少しややこしいのですが、ともかくこんな風に座標変換前に捨てられるものは捨ててしまうという考えをしています。


これで、直方体毎に描画するものを抽出できたわけですが、今度は1つの直方体について個々の面を描画するかどうかを判断します。


上の図で水色の部分は描画しますが、裏側の黒の部分は描画しません。
また手前にある面の陰になっている面は描画されません。
いわゆる隠面消去の処理が必要です。これについては次の回で。

0 件のコメント:

コメントを投稿