SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

MikuMikuEffectで学ぶHLSL入門

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

MikuMikuEffectで学ぶHLSL入門(6)


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

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

これではいけない…

 

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

 計算を行うには以下の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;
    }

次のページ

修正履歴

この記事は参考になりましたか?

MikuMikuEffectで学ぶHLSL入門連載記事一覧

もっと読む

この記事の著者

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/6517 2012/11/13 11:11

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー