Japanese | English | Korean

Samples

Ray との交差判定

MascotCapsule エクステンション では Collision クラスの isPicked() メソッドを用いることにより、単純な衝突だけでなく交差の発生を検出できます。交差の発生が検出可能なオブジェクトの組み合わせは Ray と Figure になります。


目次


注意:本サンプルでは説明の都合上、描画に対する効率化を行なっておりません。特にBounding Volumeに対応するメッシュの描画は実行速度を低下させる恐れがあります。これはBounding Volumeに対するMeshはあくまでもデバッグ用であり、描画速度よりも形状の精度を優先してあるためです。

1.Ray の作成およびデバッグ用メッシュの作成

Ray の作成には Ray クラスのコンストラクタを使用します。また、デバッグ用メッシュの作成には createMesh() メソッドを使用します。

// Ray の作成とデバッグ用メッシュの作成
ray = new Ray( new Vector3D( 0.f, 0.f, 30.f ),
new Vector3D( 0.f, 0.f, -1.f ) );
ray.createMesh( _color_red, DrawableObject3D.BLEND_ALPHA, 50 );

2.Ray と Figure の交差判定

Ray と Figure, BVFigure あるいはバウンディングボリュームとの交差判定には、Collision.isHit() メソッドまたは、Collision.isPicked() メソッドを使用します。ここでは Collision.isPicked() メソッドを使用しています。 なお、使用するメソッドにより得られる情報に差異が生じます。

// BVFigure と ray の交差判定
if ( collision.isPicked( ray, figure, null, false, false ) ) {
// if ( collision.isHit( ray, figVolume, false ) ) {
color= _color_hit;
} else {
color = _color_red ;
}

このサンプルにおいて、isPicked() メソッドの第三引数が null に設定されているのは Figure の基本姿勢が原点にあり、そこから(アニメーション以外では)移動しないサンプルであるためです。また、コメントアウトされている if 文は Figure 全体を包むバウンディングボリュームとの、コメントアウトされていない部分は Figure そのものとの交差判定になります。