サンプル

障害物を透明にする

カメラとキャラクタの間に入ってくる障害物を透明にして、キャラクタが見えなくなるのを防ぐ、というサンプルです。物体がカメラ・キャラクタ間にあるかどうかの判定は、カメラ・キャラクタを結ぶ Ray( 半直線 )と、物体との衝突判定により行ないます。それぞれの物体に対して透明度を設定し、障害物と判定された物体で透明度を上げるようにしています。

障害物を透明にする

目次










1. 障害物の判定

障害物の判定は、カメラ・キャラクタを結ぶ Ray と物体に設定したバウンディングボリューム ( BV ) の衝突判定により行ないます。物体のバウンディングボリュームと Ray が衝突している場合、物体がカメラ・キャラクタ間に存在すると考えられるため、障害物と判定します。


2. 障害物透明化のサンプルコード

ここでは Ray との衝突による障害物の判定を中心として、サンプルコードを説明します。
まず、すべての物体の Mesh にバウンディングボリュームを設定します。このときバウンディングボリュームは各 Mesh 全体を包み込むように作成します。

/* 障害物に バウンディングボリューム を設定 */
for ( i = 0; i < BLOCK_NUM; i ++ ) {

pmcx -> pBV [ i ] =
( mcxBoxf * ) IMICRO3Dv4es_mcx_BVBuilder_createBVf (
pMe -> pIM3D, pMe -> pAlc, pmc -> pBlock [ i ], 0,
MCX_SHAPE_TYPE_BOX, 1.f, &pMe -> e );

/**
  * 各障害物の Mesh からワールド座標への変換を設定
  * ここでは恒等変換を指定
  */
IMICRO3Dv4es_mcx_Shape_setTransformf ( pMe -> pIM3D, ( mcxShapef * ) pmcx -> pBV [ i ], NULL, &pMe -> e );

}

また、 Ray が車からカメラを向くように設定します。

/**
  * float ray_start [ 3 ];
  * float ray_dir [ 3 ];
  * float car_position [ 3 ];
  * float cam_position [ 3 ];
  */


/* Ray の方向ベクトルがモデルとカメラを結ぶよう更新 */
for ( i = 0; i < COORD_NUM; i ++ ) {
pmcx -> ray_start [ i ] = pmc -> car_position [ i ];
pmcx -> ray_dir [ i ] = IMICRO3Dv4es_m3dFloatCalc_f_sub (
pMe -> pIM3D, pmc -> cam_position [ i ], pmc -> car_position [ i ] );
}

/* Ray の更新 */
IMICRO3Dv4es_mcx_Ray_setf ( pMe -> pIM3D, pmcx -> pRay, pmcx -> ray_start, pmcx -> ray_dir, &pMe -> e );

そして、各 Mesh に設定したバウンディングボリュームとカメラ・キャラクタ間を結ぶ Ray の衝突から、障害物を判定します。障害物と判定された Mesh は透明度を上げます。

/* Ray と バウンディングボリューム の当たり判定 */
for ( i = 0; i < BLOCK_NUM; i ++ ) {
/* 毎描画ごとに一旦アルファファクタを初期化 */
IMICRO3Dv4es_m3dNode_setAlphaFactor ( pMe -> pIM3D, ( m3dNode * ) pmc -> pBlock [ i ], 1.f );

/* 衝突判定 */
isHit = IMICRO3Dv4es_mcx_Collision_isHitShapeToShapef (
pMe -> pIM3D, pCollision, ( mcxShapef * ) pmcx -> pRay,
( mcxShapef * ) pmcx -> pBV [ i ], &hitData, &pMe -> e );

if ( isHit == HI_TRUE ) {
/* 衝突していたモデルは透過させる */
IMICRO3Dv4es_m3dNode_setAlphaFactor ( pMe -> pIM3D, ( m3dNode * ) pmc -> pBlock [ i ], 0.5f );
}
}


このページの先頭へ戻る