入門6:当たり判定

Last-modified: 2013-08-26 (月) 18:35:22

入門6:当たり判定

コリジョン

種類は

① 直線とモデルの交点
② モデルとモデルの重なり
③ 無料プラグインによる

直線とモデルの交点

レイ、光線と言われる方法です
直線の2点の座標を決めて、それを横切るモデルを検出します。
コマンドにより、線を厚みのある円にすることもある。

光線銃の当たり判定などに使う。
キャラから地面である下に向けて、地面との交点を求め、地面の高さを計算に使う。
NPCの視界として使う。

モデルとモデルの重なり

モデルとモデルが重なった時に、検出されます。
通常は、モデルのボンディングボックス(境界箱)を設定して、
それによって検出します。

接触判定に使う。
ワープポイントなどの場所に使う。

無料プラグインによる

標準の当たり判定以外に、オプションのプラグインがあり、高性能です。
標準のものの方が情報が多いから、
標準当たり判定コマンドに慣れてからプラグインにするのがよい。

おまけ

DBPには、いくつかのマップの種類がある。
マップの種類毎にコリジョンが違う。それぞれに専用のコリジョンを使う。

matrix  
Xファイル
BSP Map
FPSC Map

sample code

Rem INTERSECT OBJECT()
Rem レイでポリゴンの上を歩く
floor_object=1   `床-地形
make object box floor_object,500,10,500
position object floor_object,0,0,0
make object cube 3,50
zrotate object 3,30
perform csg union floor_object,3
delete object 3
player_object=2   `player 
make object cube player_object,10
color object player_object,rgb(255,0,0)
position object player_object,0,55,0
position camera -100,50,-200
point camera 0,0,0
sync rate 30 : sync on
do
 set cursor 0,0
 print "use cursor-key"
 x# = object position x( player_object )
 y# = object position y( player_object )
 z# = object position z( player_object )
 if upkey()=1    then z#=z#+1
 if downkey()=1  then z#=z#-1
 if leftkey()=1  then x#=x#-1
 if rightkey()=1 then x#=x#+1
 gh# = INTERSECT OBJECT( floor_object, x#, 100, z#,  x#, -100, z# )
 ny# = 100 - gh#
 position object player_object , x# , ny#+5 , z#
 sync
loop

 

rem  OBJECT COLLISION()
rem  重なり検出
make object cube 1,10 : color object 1,rgb(255,0,0)
make object cube 2,5
make object cube 3,10 : color object 3,rgb(0,0,255)
position object 1,30,0,50
position object 2,50,0,50
position object 3,70,0,50
make matrix 1,100,100,10,10
sync on : sync rate 30
do
  set cursor 0,0
  print "use left/right-key"
  if 1=leftkey()  then move object left  2,1
  if 1=rightkey() then move object right 2,1
  c=OBJECT COLLISION(2, 0)
  color object 2,rgb(0,c*80,0)
  print c
  sync
loop