ポリラインとビルボードビーム
ポリライン と ビルボードビーム
曲がるビームを表現したいと思い、ポリラインを使ったビームをやってみました。(´ω`)ノ
『ゲームプログラミングのための3Dグラフィックス数学 p_254』と
『もんしょの巣穴 http://monsho.hp.infoseek.co.jp/index.html』さんの「DirectXの話 第86回」を参考にしました。
(もんしょの巣穴さんは、すごいサイトです!!勉強になります!)
結果:
以下のことを確認できました。
1:ビームの進行方向から見たりすると、変なギザギザが表示されたり、ただの板とバレてしまう。カメラの位置に影響を受ける。(´・ω・`)
2:ポリラインは、四角形ストリップで構成されているため、先端と尻尾が四角形で見栄えが悪い。(ビームの先端は、普通、丸っこくなっているはず。)
1は仕方ないとして、2は先端と尻尾に、丸っこいのを表示するビルボードをくっつければ良いと思い、先端と尻尾にビルボードをくっつけてみました。
このとき、ただ単にビルボードを追加しても意味がないので、『Game Programming Gems 3 p_408』に載っている、ビルボード行列を使い、先端と尻尾にビルボードをくっつけてみました。
先端と尻尾にビルボードをくっつけたことで、ビームの先端と尻尾を丸っこくできました。また、ビルボード行列を使っているため、ビームの進行方向にカメラがあっても、いい感じに表示されます。(・∀・)
また、ビームが大きいときよりも小さい時のほうがギザギザが目立たないことがわかりました。
結局、ポリラインを使った曲がるビームを使う時は、「カメラとビームの位置関係」「ビームの大きさ」に気をつける必要があるようです。(´・ω・`)
ビルボード行列を求めるコード↓
//=======================================
//ポリラインの先っぽと尻尾にくっつけるビルボード
//行列を計算する関数。
//=======================================
bool Test::CulcSpecialBBMat(D3DXVECTOR3 &start_pos_W, D3DXVECTOR3 &end_pos_W, D3DXVECTOR3 &set_pos_W,
D3DXVECTOR3 &camera_pos_W, D3DXMATRIX &view, D3DXMATRIX &out_bb_mat)
{
bool check = true;
//ビームの方向ベクトルを求める。
D3DXVECTOR3 beam_dir = end_pos_W - start_pos_W;//ビームの開始位置から終了位置までのベクトル。
//視線ベクトルを求める。
D3DXVECTOR3 eye = camera_pos_W - start_pos_W;
//ビームの方向ベクトルと垂直な方向ベクトルを求める。
D3DXVECTOR3 temp_p;
D3DXVec3Cross(&temp_p, &beam_dir, &eye);
//フロントベクトル。カメラをワールド座標系においた時に向いてる方向。
D3DXVECTOR3 the_front(view._13, view._23, view._33);//大きさは1です。
//ビルボード行列用のUPベクトルを求める。
D3DXVECTOR3 the_up;
D3DXVec3Cross(&the_up, &the_front, &temp_p);
D3DXVec3Normalize(&the_up,&the_up);//正規化する。
//右方ベクトルをもとめる。
D3DXVECTOR3 the_right;
D3DXVec3Cross(&the_right, &the_up, &the_front);
//ビルボード行列を作成する。
out_bb_mat = D3DXMATRIX(the_right.x, the_right.y, the_right.z, 0.0f,
the_up.x, the_up.y, the_up.z, 0.0f,
the_front.x, the_front.y, the_front.z, 0.0f,
set_pos_W.x, set_pos_W.y, set_pos_W.z, 1.0f);
return check;
}
表示した犬、猫モデルは『メタセコ素材! - メタセコイアで使える3D素材を公開 -』様
より使わせていただきました。ありがとうございます。