これはHSPのHGIMG3でも、Easy3Dのような高度な当たり判定を実現させるために製作したモジュールです。

これを使えばX形式モデルから地面や壁の当たり判定を実装させることができるようになります。

使用する際にはhghit.hspをインクルードしてください。

 

※現時点ではRokDeBone2から出力されたXファイルには対応していません。XファイルはメタセコイアLE(R2.4辺り)から出力したものを使用してください。原因は不明ですが、新しいバージョンから出力されたXファイルでは上手く判定を行わないことがあるようです。

 

1.      地面との当たり判定を実装させる。 

@まずLoadground命令で地面となるXファイルをマップデータとして読み込みます。

Loadground p1,p2

 

    p1 読み込みを行うファイル名(X形式モデル)

    p2:作成された地面データが返される変数

 

A地面との当たり判定

当たり判定を行うときはオブジェクトの現在座標(X,Y,Z)を求め、groundhitに代入してください。

 

 Groundhit p1,p2,p3,p4

 

    p1loadgroundで作成された地面データ

    p2:オブジェクトの現在X座標

    p3:オブジェクトの現在Y座標

    p4:オブジェクトの現在Z座標

 

  p3にはオブジェクトが地面と交差したときにそのY座標が返されるので、それをオブジェクトのy座標に代入してください。

 

※地面データを作るときは必ず全ての面を三角形にしてください。

 

LoadgroundおよびGroundhitでは地形モデルのxz平面状における末端のX,Z座標を所得し、それにより当たり判定を行う範囲を設定します。たとえば図1のような範囲のマップ(灰色)を作った場合、図2のような赤線で囲まれた範囲においてのみ当たり判定を行うようになっています。それによってマップごとに処理を分けることにより動作をなるべく軽くできるようになっています。

実際に図1のようなマップを作ると、面の存在しない範囲においても当たり判定の処理を行ってしまうので、その分の計算が無駄になってしまいます。マップを作るときはできる限り正方形、あるいは長方形に近い形のものを作ってください。

 

 

          図1                          図2

 

2.      壁との当たり判定

@     壁データの読み込み

  まずLoadwall命令で地面となるXファイルを壁データとして読み込みます。

 

Loadwall p1,p2

  

    p1:読み込みを行うファイル名

    p2:作成された壁データが返される変数

 

 

 

A壁との当たり判定

  当たり判定を行うときは平面状におけるオブジェクトの現在座標(X,Z)および移動度(VX,VZ)を求め、WALLHITに代入してください。

 wallhit  p1,p2,p3,p4,p5

 

    p1loadwallで作成されたマップデータ

    p2:オブジェクトのX方向移動度

    p3:オブジェクトのZ方向移動度

    p4:オブジェクトの現在X座標

    p5:オブジェクトの現在Z座標

 

 壁と移動ベクトルが交差したとき、p4、p5に法線方向に押し返された後の座標が出力されるので、それをオブジェクトの現在座標に代入してください。

 

※壁データを作るときの注意点

まず、壁は片面であり(面の向いている側で当たり判定を行います)、かつ縦方向の軸は必ずXZ平面から垂直になるようにしてください(図3)。

そうしないと正しく判定を行わないことがあります。

 

 

              図3

 

もうひとつは、図4のような凹んでいる壁を作りたいとき、面の成す角が90度以上であれば図590度に満たない鋭角であれば図6のように作ってください。

面倒かもしれませんが、こうしないと壁から判定の対象となるオブジェクトが飛び出してしまうことがあります。

       図4                     図5                       図6

 

 

あまり壁の数が多すぎると処理速度に影響が出てしまうかもしれません。ブロックごとに分けて処理するなどといった工夫をしてください。

 

B     面と線分(レイ)との当たり判定

7に示すように、ある基点を持った線分(レイ)とLoadgroundで読み込んだ地形(メッシュ)データとの交差判定を行います。

 

meshhit  p1,p2,p3,p4,p5,p6,p7,p8   

 

    p1loadgroundで作成されたMESHデータ                    

    p2:線分の基点のX座標

    p3:線分の基点のY座標

    p4:線分の基点のZ座標

   p5:線分のX方向成分

      6:線分のY方向成分

    p7:線分のZ方向成分

    p8:線分と面が交差していた場合、1が出力される。交差しなかった場合0が出力される。

 

   

         図7

 

HGIMG3は現在最もユーザーの多いとされるEasy3Dと比較して、とても簡単で理解しやすい命令が多いため初心者向けのプラグインであると思います。しかし、3Dゲームには絶対に不可欠であるはずの地面および壁との当たり判定が存在しないために敬遠する人が多いのか、HGIMG3を使った作品は非常に少ないようです。

このモジュールによって、少しでもHGIMG3を使った作品が増えてくださることを願っております。

 

                                                     by Mackman