Japanese | English | Korean

Samples

視錐台による可視判定

MascotCapsule エクステンション では視錐台を利用した可視判定を行うことが可能です。可視判定には com.nttdocomo.ui.graphics3d.collision.ViewVolume クラスを使用します。


目次


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

1.ViewVolume の作成と視錐台の設定

ViewVolume クラスのインスタンス作成にはコンストラクタを使用します。

// ViewVolume クラスのインスタンス作成
viewVolume = new ViewVolume();

次に、near, far, 画角等の設定ですが、Graphics3D クラスへの設定と同一になります。ここではViewVolume.setPerspectiveView() メソッドを使用しています。

// near と far、画角の設定
g3.setPerspectiveView( Parameters.PERSPECTIVE_NEAR_CLIP,
Parameters.PERSPECTIVE_FAR_CLIP,
Parameters.PERSPECTIVE_ANGLE );

// 同様にviewVolumeに near と far、画角の設定
// near と far、画角の設定
viewVolume.setPerspectiveView( Parameters.PERSPECTIVE_NEAR_CLIP,
Parameters.PERSPECTIVE_FAR_CLIP,
Parameters.PERSPECTIVE_ANGLE );

さらに、視錐台へ視点変換行列の設定を行います。これには ViewVolume.setTransform() メソッドを使用します。

vTrans.setIdentity();
vTrans.lookAt( position, lookAt, up );

// viewVolume にワールド座標から視錐台への変換行列をセットする
viewVolume.setTransform( vTrans );

2.BVFigure 全体に対するバウンディングボリュームの設定

BVFigure に対する可視判定にはあらかじめ BVFigure クラス全体に対するバウンディングボリュームを設定する必要があります。

// BVFigure に全体のバウンディングボリュームを設定する
bvFig.calculateBV( Shape.TYPE_CAPSULE, 1.0f );

BVFigure 全体に対するバウンディングボリュームが設定されていないときは、以下に述べる ViewVolume.isViewable() メソッドは常に false を返します。


3.可視判定の実施

可視判定には ViewVolume.isViewable() メソッドを使用します。isViewable() メソッドに渡された BoundingVolume オブジェクト、または BVFigure オブジェクトにセットされている、Figure 全体の BoundingVolume オブジェクトの一部が視錐台の内側にあれば可視状態にあると判定し、true を返します。

/*
* 可視判定を行うメソッド。
*/
private void visibleCheck() {
if( viewVolume.isViewable( capsule ) )
strBuf.append( "capsule " );

if( viewVolume.isViewable( sphere ) )
strBuf.append( "sphere " );

if( viewVolume.isViewable( bvFig ) )
strBuf.append( "Figure" );
}