サンプル
障害物を透明にする
カメラとキャラクタの間に入ってくる障害物を透明にして、キャラクタが見えなくなるのを防ぐ、というサンプルです。物体がカメラ・キャラクタ間にあるかどうかの判定は、カメラ・キャラクタを結ぶ Ray( 半直線 )と、物体との衝突判定により行ないます。それぞれの物体に対して透明度を設定し、障害物と判定された物体で透明度を上げるようにしています。
目次
1. 障害物の判定
障害物の判定は、カメラ・キャラクタを結ぶ Ray と物体に設定したバウンディングボリューム ( BV ) の衝突判定により行ないます。物体のバウンディングボリュームと Ray が衝突している場合、物体がカメラ・キャラクタ間に存在すると考えられるため、障害物と判定します。
2. 障害物透明化のサンプルコード
ここでは Ray との衝突による障害物の判定を中心として、サンプルコードを説明します。
まず、すべての物体の Mesh にバウンディングボリュームを設定します。このときバウンディングボリュームは各 Mesh 全体を包み込むように作成します。
/* 障害物に バウンディングボリューム を設定 */
for ( i = 0; i < BLOCK_NUM; i ++ ) {
}
for ( i = 0; i < BLOCK_NUM; i ++ ) {
pmcx -> pBV [ i ] =
/**
* 各障害物の Mesh からワールド座標への変換を設定
* ここでは恒等変換を指定
*/
IMICRO3Dv4es_mcx_Shape_setTransformf ( pMe -> pIM3D, ( mcxShapef * ) pmcx -> pBV [ i ], NULL, &pMe -> e );
( mcxBoxf * ) IMICRO3Dv4es_mcx_BVBuilder_createBVf (
pMe -> pIM3D, pMe -> pAlc, pmc -> pBlock [ i ], 0,
MCX_SHAPE_TYPE_BOX, 1.f, &pMe -> e );
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 ++ ) {
/* Ray の更新 */
IMICRO3Dv4es_mcx_Ray_setf ( pMe -> pIM3D, pmcx -> pRay, pmcx -> ray_start, pmcx -> ray_dir, &pMe -> e );
* 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 (
}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 ++ ) {
for ( i = 0; i < BLOCK_NUM; i ++ ) {
/* 毎描画ごとに一旦アルファファクタを初期化 */
IMICRO3Dv4es_m3dNode_setAlphaFactor ( pMe -> pIM3D, ( m3dNode * ) pmc -> pBlock [ i ], 1.f );
/* 衝突判定 */
isHit = IMICRO3Dv4es_mcx_Collision_isHitShapeToShapef (
if ( isHit == HI_TRUE ) {
}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 );
( mcxShapef * ) pmcx -> pBV [ i ], &hitData, &pMe -> e );
if ( isHit == HI_TRUE ) {
/* 衝突していたモデルは透過させる */
IMICRO3Dv4es_m3dNode_setAlphaFactor ( pMe -> pIM3D, ( m3dNode * ) pmc -> pBlock [ i ], 0.5f );
}IMICRO3Dv4es_m3dNode_setAlphaFactor ( pMe -> pIM3D, ( m3dNode * ) pmc -> pBlock [ i ], 0.5f );


