以前投稿した記事で、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つ以上の表情で大きさを指定したり、
もっと大きくしたり、もっと小さくしたりできるようになります。
興味があればいじってみるのもアリ……かもしれません。