壁判定とは
「Curl 3D Gallery」のような3次元空間を自由に動き回るようなアプリケーションの場合、必要不可欠となる処理に「壁判定処理」があります。昨今の3Dゲームでもそうですが、建物の外壁を通り抜けることはありえませんし、不用意に崖や屋上から飛び降りてしまうとダメージを受けたり、キャラクターが減ったりします。これらには、今回ご紹介する壁判定処理により実現されています。
では、壁判定処理とはどのようなものなのでしょうか?
先を急ぐ前に、視点の移動方法を簡単に説明しておきます。視点移動は視点位置に進行方向ベクトル×1回での移動距離を加算することにより行っています。3Dゲームでは、この移動の間にカメラを上下させることで、走っているような雰囲気を出しているものもあるようです。
では、「Curl 3D Gallery」の壁判定処理をみていきましょう。壁判定処理では、壁判定有効距離、接近猶予距離、接近限界距離の3つの距離レベルを用いて処理を行っています。
- 壁判定有効距離:処理高速化のために壁面判定の詳細処理を行う距離。
壁面が、この距離以上離れている(※1)と壁判定処理は行いません。
- 接近猶予距離:移動前の視点位置の調整距離。
- 接近限界距離:移動後の視点位置の許容距離。
ボックスで判断することでより高速な処理を行っています。
これまでの連載
壁判定の手順
具体的には、以下のような壁判定処理を行っています(以降、現在の視点位置を「現視点位置」、移動後の仮の視点位置を「新視点位置」とします)。
以下の1~3は、前進を行う際に一連の処理として実行します。前進動作が連続する場合(移動ボタンが押されている場合や、マウス操作を行っている場合)は、この一連の処理が繰り返し行われます。複雑なことを行っていそうですが、次ページで図解いたします。図を見ればご理解頂けると思います。
1)壁判定必要性の確認
- 現視点位置から壁判定有効距離内に面が存在しない場合は、新視点位置とし、以降の判定処理は行われません。
一歩進んだ先に壁があるかないかの判定です。壁がない場合は一歩進みます。
2)移動前の視点位置での確認
- 現視点位置の進行方向で接近猶予距離以内に面がある場合、現視点位置を進行方向逆に、接近猶予距離だけ離れた位置を新視点位置とする。
- 現視点位置の進行方向左側で接近猶予距離以内に面がある場合、現視点位置を進行方向右側に、接近猶予距離だけ離れた位置を新視点位置とする。
- 現視点位置の進行方向右側で接近猶予距離以内に面がある場合、現視点位置を進行方向左側に、接近猶予距離だけ離れた位置を新視点位置とする。
一歩進んだ際、壁に近づきすぎているかどうかの判定です。壁に正対しているときは、あまり意味をなしませんが、壁に斜めに向かってジグザグに進む際に有効な処理となります。つまり、壁に近づきすぎていた場合に壁から距離を取り、壁から離れた方向に位置をずらして、進めるようにしています。
3)移動後の視点位置の確認
- 新視点位置の進行方向で接近限界距離以内に面がある場合、現視点位置のままとする。
- 新視点位置の進行方向左側で接近限界距離以内に面がある場合、現視点位置のままとする。
- 新視点位置の進行方向右側で接近限界距離以内に面がある場合、現視点位置のままとする。
2番目の判定を行い壁から離れた結果、それでも壁に近すぎる場合は移動そのものを取り消します。こちらも壁に正対しているときは意味をなさない処理ですが、斜めに向かって壁に接近した際に必要になります。
手順の図解
- 凡例
1)壁判定必要性の確認の例
壁判定を行わず、新視点位置に移動します。
![](http://cz-cdn.shoeisha.jp/static/images/article/3929/02.gif)
2)移動前の視点位置での確認の例
移動前、接近猶予距離以内に面(壁)があるので、面(壁)より、接近猶予距離離れた位置を現視点位置とする。
![](http://cz-cdn.shoeisha.jp/static/images/article/3929/03.gif)
3)移動後の視点位置の確認の例
移動後、接近限界距離以内に面(壁)があるので、現視点位置のままとする。
![](http://cz-cdn.shoeisha.jp/static/images/article/3929/04.gif)
移動前の位置調整により、壁面に沿って、ジグザグに移動することもできます。
![](http://cz-cdn.shoeisha.jp/static/images/article/3929/05.gif)
壁判定の処理は、「3D-Gallery\SCENE\CustomSceneGraphic.scurl」のmovement-eyepointメソッドで行っていますので、参照してみてください。
平面との距離計算
次に、平面との距離計算についても触れておきたいと思います。
CurlのSceneには、get-intersectionsメソッドがあり、交差する面と交点座標を得ることができるのですが、簡易実装となっているようです。交差する面は得られるのですが、交点座標は、斜めの面の場合、その面が内接する直方体の最も近い面での交点座標となり、実際の交差面との交点は得られません。
![](http://cz-cdn.shoeisha.jp/static/images/article/3929/06.gif)
そのため、「Curl 3D Gallery」では、get-intersectionsメソッドで交差面を求め、交点座標は、交差面との幾何計算により、厳密に求めるようにしています。
ソースコードは、Geom. calc-coords-plane-intersectionメソッドになります。具体的には、交差面の平面方程式を求めます。求められた平面方程式との交点座標を求め、交点座標が、交差面に内包するか否かで、実交点を求めています。
![](http://cz-cdn.shoeisha.jp/static/images/article/3929/07.gif)
今回は、具体的なソースコード説明はありませんでしたが、「Curl 3D Gallery」の解読や、他への応用のお役にたてれば幸いです。