Scaleエフェクトで更に大きく/小さくしてみよう

以前投稿した記事で、Scaleエフェクトを改造して
複数のモデルの大きさを個別に変えられるようにしました。

今回はちょっと踏み込んで、
大きさの指定方法を変えてみようと思いました。
というわけで、勢い任せにメモっときます。

※命令文についての説明などはしません。
 できるほどの知識もないです。すまぬ。
※なんかこう、自己責任でお願いします。すまぬ。
MMDのエフェクトは基本C#らしいです。風の噂。


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


さて、何はともあれ、Scale.fxをメモ帳に投げ込みましょう。
難しいコトバの意味は各々調べてもらうとして、
今回も前回と同じ場所を見ます。

// PMDパラメータ
float3 Origin : CONTROLOBJECT < string name = "ScaleControl.pmd"; string item = "スケール原点"; >;
float3 ScaleXYZ : CONTROLOBJECT < string name = "ScaleControl.pmd"; string item = "スケール変更"; >;
float Expansion : CONTROLOBJECT < string name = "ScaleControl.pmd"; string item = "拡大"; >;
float Reduction : CONTROLOBJECT < string name = "ScaleControl.pmd"; string item = "縮小"; >;
static float3 Scale = float3( clamp( pow(10.0f, 0.1f*ScaleXYZ.x), 0.01f, 100.0f ),
                              clamp( pow(10.0f, 0.1f*ScaleXYZ.y), 0.01f, 100.0f ),
                              clamp( pow(10.0f, -0.1f*ScaleXYZ.z), 0.01f, 100.0f ) );
static float ScaleAll = (1.0f + 9.0f*Expansion)*(1.0f - 0.9f*Reduction);

……4つ頭の片隅に置いといてください。
命令文の最後に ; があること、
命令じゃない行の最初は // にする必要があること、
かけ算は * で、割り算は / で書くこと、
数字はとりあえず 1.0f のように書くこと。



「static float3 Scale = ~」のとこを見ると、
何やら「ScaleXYZ.x」とそれっぽいことが書いてありますね。

「ScaleXYZ」を頼りに周りを見ると、
"ScaleControl.pmd"の"スケール変更"ボーンとご関係を持っているようです。
後ろに.xなんて付く辺り、座標っぽい匂いがしますね。というか座標です。

……しかし、周りにはclampだのpowだの謎の呪文が書いてあります。


 clamp( pow(10.0f, 0.1f*ScaleXYZ.x), 0.01f, 100.0f )
 clamp(数値, 下限, 上限)

clamp」は数値を一定範囲内に制限する為に使う命令です。
直後にpowがいて分かりにくいですが、0.01 ~ 100の間に制限されています。
無尽蔵に大きくしてしまうと大変ですから、これは必要ですね。
(本音:無尽蔵に縮めたい)


 pow(10.0f, 0.1f*ScaleXYZ.x)
 pow(数値A, 数値B)

「pow」は敵をひっくり返す便利なブロックです(うそうそ)
これは"A"の"B"乗、になります。
……直感的かもしれないけど、計算しづらいです。うーむ。


static float3 Scale = float3( clamp( pow(10.0f, 0.1f*ScaleXYZ.x), 0.01f, 100.0f ),
                              clamp( pow(10.0f, 0.1f*ScaleXYZ.y), 0.01f, 100.0f ),
                              clamp( pow(10.0f, -0.1f*ScaleXYZ.z), 0.01f, 100.0f ) );

つまり、この部分では、
「掛け算*1 → 累乗*2 → 一定範囲内に制限*3」が行われています。

私は多少使いにくくても、
「XX倍にしたい時はボーンをXX動かす」みたいにしたい。
というわけでやってきました今回の本題。


static float3 Scale = float3( clamp( ScaleXYZ.x, 0.001f, 1000.0f ),
                              clamp( ScaleXYZ.y, 0.001f, 1000.0f ),
                              clamp( ScaleXYZ.z, 0.001f, 1000.0f ) );

……と言っても、こんな風に
powを無くして制限範囲を変えるだけで十分イケます。
制限範囲はひとまず 0.001 ~ 1000 にして、
1/1000から1000倍まで変えられるようになりました。

もし制限範囲を変えたければまた書き換えればいいし、
X,Y,Zそれぞれ動かすのがダルい人は
3つ全部「ScaleXYZ.x」とかにしちゃえばいいわけです。

私のやりたいことができました。やー、良かった。
これで解決ですね。めでたしめでたし。



……。



…………。



あともうひとつ、おまけ。
Scaleエフェクトは表情(モーフ)で大きさを変えることもできましたね。

float Expansion : CONTROLOBJECT < string name = "ScaleControl.pmd"; string item = "拡大"; >;
float Reduction : CONTROLOBJECT < string name = "ScaleControl.pmd"; string item = "縮小"; >;
static float ScaleAll = (1.0f + 9.0f*Expansion)*(1.0f - 0.9f*Reduction);

前半2行では、
"ScaleControl.pmd"の"拡大"モーフの数値(0~1)を「Expansion」にメモって、
同様に"縮小"モーフの数値を「Reduction」にメモしています。

後ろ1行は、メモした2つの数値をかけたり足したりして、
計算結果を「ScaleAll」にメモしています。

つまりこのへんを書き換えると、3つ以上の表情で大きさを指定したり、
もっと大きくしたり、もっと小さくしたりできるようになります。
興味があればいじってみるのもアリ……かもしれません。

*1:0.1×ボーン位置

*2:10の「0.1×ボーン位置」乗

*3:0.01から100の間にする