CodeZine(コードジン)

特集ページ一覧

3DCGツール「MikuMikuDance」のエフェクトを拡張する「MikuMikuEffect」
専用モデルを利用したエフェクト

MikuMikuEffectで学ぶHLSL入門(6)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2012/11/12 14:00
目次

ラインビルボードの計算方法

 現在でも一応ラインを引くことには成功していますが、カメラを操作するとペラペラの板であることがすぐに分かってしまいます。

これではいけない…

 

 この問題を解決するために、先ほど紹介した「ラインビルボード」の計算を行います。

 計算を行うには以下の2つの情報が必要です。

  1. 視線ベクトル(視点から現在座標への方向)
  2. 進行ベクトル(現在の点が向いている方向)
視線ベクトル

 視線ベクトル(カメラの方向)は、「normalize(カメラの座標 - 現在の頂点座標)で求められます。

視線ベクトル
視線ベクトル

 コード化するとこのようになります。

float3 EyeVec = normalize(CameraPosition-NowPos);
進行ベクトル

 進行ベクトルは、"現在の座標"と"次の座標"を元に計算します。"次の座標"の取得には先ほどのlerp関数を利用します。

進行ベクトル
進行ベクトル

 コード化するとこのようになります。

//現在座標から少しだけ先に進めた座標を取得
float3 NextPos = lerp(ZeroPos,TargetPos,Pos.z+0.01);

//現在の座標から先の座標から正面方向のベクトルを得る
float3 FrontVec = normalize(NextPos - NowPos);

 現在の位置(Pos.z)に少し値を足すことにより、先の座標を取得しています。

ビルボード計算

 視線ベクトルと進行ベクトル、2つのベクトルを利用してビルボード計算を行います。このような計算を行うには、外積(cross関数)を利用します。

外積を使った計算
外積を使った計算

 こと3Dプログラミングにおける外積の主な使い方としては、「ベクトルAとベクトルBからなる平面に対して直角のベクトルを得る」ことに使われることがほとんどです。

 これで視線に対して常に90度の角度のベクトルを得ることができました。

 このベクトルを頂点座標に足してやることで、目的である、常にカメラの方向を向くための座標を得ることができます。

ラインビルボード!
ラインビルボード!

 モデルの初期X座標は0.5、もしくは-0.5なので(当記事、モデルデータ構造参照)、それを参照して頂点を左右に振り分ければ、ラインビルボードの計算は終了です。

    //現在処理している頂点を左右に割り振る
    //すべての頂点のX座標は0.5もしくは-0.5
    if(Pos.x > 0)
    {
        LastPos.xyz += SideVec;
    }else{
        LastPos.xyz -= SideVec;
    }

  • LINEで送る
  • このエントリーをはてなブックマークに追加

修正履歴

  • 2012/11/13 10:49 Lerp関数の利用 画像のurlを修正

  • 2012/10/18 02:31 記事完成

  • 2012/10/15 23:44 アドバイスに従い間違い修正および文章、画像追加

バックナンバー

連載:MikuMikuEffectで学ぶHLSL入門

著者プロフィール

  • ビームマンP(ビームマンピー)

    ニコニコ動画等でMikuMikuEffect用シェーダプログラム開発者として活動。 開発を始めた理由はカッコいいビームやミサイルが作りたかった為。 エフェクト配布用サイト http://www43.atwiki.jp/beamman/

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5