Japanese | English | Korean

Samples

障害物を透明にする

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

目次








1.障害物の判定

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


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

ここでは、Rayとの衝突による障害物の判定を中心として、サンプルコードを説明します。
まず、すべての物体のFigureにBVを設定します。BVは、Figure全体を包み込むように作成します。

// Figureを包み込むBVを作成する
for ( int i = 0; i < numObj; i++ ) {
bv[i] = BVBuilder.createBV( figure[i], 0, Shape.TYPE_BOX,
1.f );
}

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

// Rayの方向を、車→カメラとなるように求める
rayDir.set( position.getX() - car.position.getX(),
position.getY() - car.position.getY(),
position.getZ() - car.position.getZ() );

// Rayを更新する
ray.set( car.position, rayDir );

そして、各Figureに設定したBVとカメラ・キャラクタ間を結ぶRayの衝突から、障害物を判定します。障害物と判定されたFigureは透明度を上げます。

// 障害物を判定し、透明度を設定する
for ( int i = 0; i < block.numObj; i++ ) {
if ( col.isHit( ray, block.bv[i], false ) ) {
block.figure[i].setTransparency( 50.f );
}
}

Seethrough_Camera 実行時の画面