CodeZine(コードジン)

特集ページ一覧

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

MikuMikuEffectで学ぶHLSL入門(6)

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

編集を行った頂点シェーダ部分

 以上で頂点シェーダ部分はひとまず完成になります。以下に頂点シェーダ部全文を記載します。

// 頂点シェーダ
VS_OUTPUT Line_VS(float4 Pos : POSITION, float2 Tex : TEXCOORD0)
{
    VS_OUTPUT Out = (VS_OUTPUT)0;
   
    //ターゲット用座標
    float3 TargetPos = float3(0,0,100);
   
    //出力用座標
    float4 LastPos = 1;
    //---現在の座標取得---//
    //ワールド行列の4行目からワールド座標を取得
    float3 ZeroPos = WorldMatrix[3].xyz;
   
    //原点と目標点の間を線形補間で座標を取得
    //補間用係数はモデルのZ座標
    float3 NowPos = lerp(ZeroPos,TargetPos,Pos.z);
   
    //出力用座標に保存
    LastPos.xyz = NowPos;
   
    //---ビルボード計算---//

    //現在座標から少しだけ先に進めた座標を取得
    float3 NextPos = lerp(ZeroPos,TargetPos,Pos.z+0.01); //変更
   
    //カメラへの視線ベクトルを計算する
    float3 EyeVec = normalize(CameraPosition - NowPos); //変更
   
    //現在の座標と先の座標から正面方向のベクトルを得る
    float3 FrontVec = normalize(NextPos - NowPos); //変更
   
    //正面ベクトルと視線ベクトルの外積からサイドベクトルを得る
    float3 SideVec = normalize(cross(EyeVec,FrontVec));
   
    //現在処理している頂点を左右に割り振る
    //すべての頂点のX座標は0.5もしくは-0.5
    if(Pos.x > 0)
    {
        LastPos.xyz += SideVec;
    }else{
        LastPos.xyz -= SideVec;
    }
   
   
    // カメラ視点ビュー射影変換
    Out.Pos = mul( LastPos, ViewProjMatrix );
   
    // テクスチャ座標
    Out.Tex = Tex;
   
    return Out;
}

 TargetPos変数を書き換えると、0点からその位置に向かってラインが描かれることが確認できます。

ラインビルボードの動作確認
ラインビルボードの動作確認

(頂点シェーダによって、本来正方形だったものがシェーダで変形し、動作する)

始点、終点を操作してみる

 少々横道にそれて、MMD上で始点、終点を操作できるようにしてみましょう。

 モデル操作パネル、読込、Modelフォルダ内より、ダミーボーン.pmdを選択、読み込みます。

ダミーボーン読み込み
ダミーボーン読み込み

 モデル操作パネルでカメラ・照明・アクセサリを選択、アクセサリ操作パネルからLine.xを選択します。

 「地面」と表示されているタブを選択し、先ほど読み込んだ「ダミーボーン」を選び、登録ボタンをクリックします。

 再度モデル操作パネルからダミーボーンを選択し、ボーン操作パネルの移動を選択、画面に表示される移動用UIをマウスでドラッグしてみましょう。

伸びます
伸びます

 ラインの始点が移動し、ビルボードの効果が確認できました。

 次に、サンプルファイルのフォルダからtarget.xをMMDに読み込み、再びダミーボーンに関連付けます。

 ここでは先ほど操作を行わなかった、ボーン01と表示されているタブからボーン02を選択してください。

ボーン02の選択
ボーン02の選択

 ソースコード上部にこのような項目があります。

//ターゲットオブジェクトから座標を取得
float3 TargetPos2 : CONTROLOBJECT < string name = "Target.x"; >;

 この、:CONTROLOBJECT~ という部分は、MMEの機能の一つで、こうすることで指定した名称のモデルの座標を取得し、変数に格納することができます(詳細はMME本体同梱の「REFFERENCE.txt」を参照)。

 TargetPos2をTargetPosに代入します。

// 頂点シェーダ
VS_OUTPUT Line_VS(float4 Pos : POSITION, float2 Tex : TEXCOORD0)
{
    VS_OUTPUT Out = (VS_OUTPUT)0;
   
    //ターゲット用座標
    float3 TargetPos = TargetPos2; //修正

 これで、ダミーボーンのボーン02(target.xがくっついている)を操作することで赤いターゲットが移動し、その位置が終点となりラインが描画されます。


  • 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