ボーンの変換行列取得による物持たせ
歩いているキャラクタに別モデルの物を持たせる、というサンプルです。 キャラクタに物を持たせる場合、右手のボーンにあわせて物を設置することになります。このとき、ワールド座標系から右手のボーン座標系への変換行列が必要です。このサンプルでは、対象のボーンにバウンディングボリューム(BV)を設定し、BVの変換行列を取得することで、間接的にボーンの変換行列を取得しています。
目次
ボーン変換行列取得のサンプルコード
ここでは、ボーンの変換行列の取得を中心にサンプルコードを説明します。 まず、対象のボーンにBVを設定します。このBVは変換行列を取得するために設定するだけなので、ボーンにあわせて作成する必要はなく、適当な形状でかまいません。
// BVFigureの作成とアクションの設定
bvFigure = BVBuilder.createBVFigure( figure );
bvFigure.setAction( action, frame );
// 適当なBoundingVolumeを作成し、手に設定する
bvHand = new Sphere( 1.f );
bvFigure.setBV( bvHand, handBoneId );
bvFigure = BVBuilder.createBVFigure( figure );
bvFigure.setAction( action, frame );
// 適当なBoundingVolumeを作成し、手に設定する
bvHand = new Sphere( 1.f );
bvFigure.setBV( bvHand, handBoneId );
また、BVをボーンに合わせて動かすために、BVFigureにFigureと同じフレーム時間・変換行列を設定します。
// フレーム時間の設定
figure.setTime( frame );
bvFigure.setTime( frame );
// BVFigureにFigureの変換行列をセット
bvFigure.setTransform( trans );
figure.setTime( frame );
bvFigure.setTime( frame );
// BVFigureにFigureの変換行列をセット
bvFigure.setTransform( trans );
そして、ボーンに設定したBVから変換行列を取得し、アイテムを描画します。
// 手のボーンの変換行列の取得
player.bvHand.getTransform( Shape.TRANS_BV_WORLD_NOSCALE,
// アイテムの描画
g3.renderObject3D( itemGroup, itemTrans );
player.bvHand.getTransform( Shape.TRANS_BV_WORLD_NOSCALE,
itemTrans );
// アイテムの描画
g3.renderObject3D( itemGroup, itemTrans );

Hold Item実行画面

