月下電波

同人サークル「PhotonSystem」の電波

知ってる人は知ってる前作Overtureに登場した
ハウライトが使う魔法「イモータルフェザー」

簡単に言うとひし形の光が羽の様に展開したあとに
相手にめがけて突き刺さり爆発する魔法です
(なんて中二病)

最近こちらをConcertoに実装しようとした所でぶつかった課題が
   「突き刺さる方向をひし形が向いてくれない」
前回は2Dゲームなのでなんとかなったが
3Dは調べてもそれらしい解決方法がわからず苦戦しました|||orz



以下やり方


どうやら
・D3DXMatrixLookAtLHを使う方法
・クオータニオンを使う方法
の2種類があるようですが今回はクオータニオンを利用します。

D3DXMATRIX Vec2RotMat(D3DXVECTOR3 nor, D3DXVECTOR3 vec )
{
  D3DXVECTOR3 cross;
  D3DXQUATERNION q;
  D3DXMATRIX m;

  float d = D3DXVec3Dot( &nor, &vec );
  D3DXVec3Cross( &cross, &nor, &vec );

  D3DXQuaternionRotationAxis( &q, &cross, acosf(d) );

  D3DXMatrixRotationQuaternion( &m, &q );
  return m;
}



手順としては
 まず最初から向いている方向ベクトルをnor
 向かせたい方向ベクトルをvecとします

 その後二つの内積と外積を求め
 外積を軸に任意軸回転を行います。
 その後クオータニオンを回転行列に戻しておしまい


D3DXQuaternionRotationAxisの第三引数が一番厄介でした
どうやら内積の値をアークコサインに変換する必要があるようです












管理者にだけ表示

トラックバックURL↓
http://photons.blog71.fc2.com/tb.php/18-ae028140