数値表示エフェクトを使ってみよう

以前、針金Pさんの数値表示エフェクトを使って、
その時々の身長を表示したを投稿しました。

実はこのエフェクト、デフォルトで表示される数値は
「再生時間」「ワールドビュー行列」などです。
違う数値を出したい場合は中身を書き換えなければいけません。

そんなわけで、数値表示エフェクトをいじります。

※詳しいわけではないので、間違えてたらすまん。
※なんかこう、自己責任でお願いします。すまん。


……私が改変したモノでよければ、ここからどーぞ。
bowlroll.net



何はともあれ、「pmdver」フォルダにある
「NumbersPmd_Float.fx」をメモ帳で開きましょう。

////////////////////////////////////////////////////////////////////////////////////////////////
//
//  NumbersPmd_Float.fx ver0.0.4 数値データの表示(float型)
//  作成: 針金P
//
////////////////////////////////////////////////////////////////////////////////////////////////
// ここのパラメータを変更してください
float time : Time;

// ここに表示させる数値、または変数,式を代入(正確に読めるのは全7桁程度)
static float Value = time;

int FractCount = 3;  // 少数以下桁数

//#define PLUS  // +表記する場合はコメントアウトを外す


// 解らない人はここから下はいじらないでね

////////////////////////////////////////////////////////////////////////////////////////////////

というわけで、今回はこの辺を触ります。
あちこち色々説明が書いてありますね。ありがたい。

めくるめく機械の世界へ飛び込む前に、C#の超基本的なことを。

  • // 以降は注釈になり、実際に動かす時は無視される
  • // を書くことで命令文を残しつつ無視させるテクニックを「コメントアウト」と呼ぶ
  • 命令文の最後には基本的に ; を付ける



変わらざる数値の終わりに

// ここのパラメータを変更してください
float time : Time;

さてさて……。いきなり注釈に
「ここのパラメータを変更してください」と書いてあるので、
試しにちょっと書き換えてみましょう。*1

// ここのパラメータを変更してください
float time = 50.0f;

……50って書いたら、50って出ましたね。
これで思いつく限りの数字を用意……うーん、だるい。
何かの座標をそのまま出せればいいのに。


座標ちゃんはどこからくるの?

ところで、このエフェクト、
もう少し下の方を見ると、こんな風になっています。

// 解らない人はここから下はいじらないでね

////////////////////////////////////////////////////////////////////////////////////////////////
// パラメータ宣言

float PmdSi : CONTROLOBJECT < string name = "(self)"; string item = "スケール"; >;
float PmdTr : CONTROLOBJECT < string name = "(self)"; string item = "透過"; >;
float3 PmdPos : CONTROLOBJECT < string name = "(self)"; string item = "センター"; >;

static int iValue = round(Value * pow(10.0f, FractCount));

int TexCount = 15;  // テクスチャ文字種類数

以前扱ったScaleエフェクトでも見たコトバがいますね。

float3 PmdPos : CONTROLOBJECT < string name = "(self)"; string item = "センター"; >;

この一行で「PmdPos」に、
自身(self)のセンターボーンの座標をメモっています。

……自身(self)って誰?と思うかもしれませんが、
エフェクトを読み込む時に
MMDへ読み込ませるモデル・アクセサリが(self)です。
エフェクト自体には座標も表情もありませんからね。*2

さて。
行頭の「float3」はメモる場所、変数の型指定です。
どういうタイプの電卓を取り出すか、みたいなもので、
float3は小数点を含む数値を3つ同時に入れられる電卓です。
表情や大きさ、透明度は数値が1つなので「float」で十分です。

次の「PmdPos」はメモる場所の名前です。電卓の名前ですね。
名前は自由ですが、一文字間違えただけでも別物扱いなので
なるべく分かりやすい名前を心がけたいものです。……うん……。

「CONTROLOBJECT」はモデル・アクセサリの
あんなことやこんなことを赤裸々に暴露するコマンドです。
その直後に「 < >; 」で何を調べるかを指定しています。

「string name = "(self)";」で
どのモデル・アクセサリを調べるか指定します。
Scaleエフェクトの時は"ScaleControl.pmd"と書いてあったとこ。

「string item = "センター";」で
どのボーン・表情を調べるか指定します。
今回はセンターボーンの座標をチェックだ。


本題の戦士

……で、えっと、なんだっけ。そうだそうだ。

// ここのパラメータを変更してください
float time : Time;

50とか書いたのは元に戻して、と。
改めてここに帰ってきました。

さあさあ、座標を拾ってみましょう。

// ここのパラメータを変更してください
float3 time : CONTROLOBJECT < string name = "(self)"; string item = "センター"; >;

はい。
さっきまでの雑な説明はどこへいったのか。ほぼコピペです。
早速、MMDに読み込ませて試してみましょう。

……。…………。

ダメですね。
X座標が表示されるようにはなりましたが、
X座標に応じて表示位置が変わるので、見づらいです。

Y座標も表示位置を指定する為に使っているので、
残っているのはZ座標だけです。
厳密にはZ座標も使われているんだけど、今回は見なかったことにします。


というわけで次です。これが最後です。

今この「time」は「float3型」です。数値が3つ入ってます。
3つある数値のどれのコトなのか明確にしたい時は、
後ろに「.x」「.y」「.z」のどれかを付けて指定します。

// ここに表示させる数値、または変数,式を代入(正確に読めるのは全7桁程度)
static float Value = time.z;

これでセンターボーンのZ座標の数値が表示されるようになりました。
後は表示させたい数値をセンターボーンのZ座標に放り込むだけです。
やったね!!






書き換えた後のものがこちら。

////////////////////////////////////////////////////////////////////////////////////////////////
//
//  NumbersPmd_Float.fx ver0.0.4 数値データの表示(float型)
//  作成: 針金P
//
////////////////////////////////////////////////////////////////////////////////////////////////
// ここのパラメータを変更してください
float3 time : CONTROLOBJECT < string name = "(self)"; string item = "センター"; >;

// ここに表示させる数値、または変数,式を代入(正確に読めるのは全7桁程度)
static float Value = time.z;

int FractCount = 3;  // 少数以下桁数

//#define PLUS  // +表記する場合はコメントアウトを外す


// 解らない人はここから下はいじらないでね

////////////////////////////////////////////////////////////////////////////////////////////////

たった2行しか変わってないけど、大事な2行です。

ちなみに。もうちょっと頑張ると
表示する数値を指定する専用のボーンを用意して、
「X座標×Y座標÷Z座標 の結果を表示する」とかもできます。

気が向いたらレッツ・チャレンジ。

*1:機械は堅苦しい子なので「time」と「Time」は別物として扱われます。この「Time」はMMDの方から教えてもらえる経過時間なのです。

*2:MMMだとエフェクト自体にも座標があります。あれはアクセサリに近い扱いなのかな…?