むふふな商品には2種類あって、男性用と女性用です。
めんどくさいのは男性用で、元気なときと休憩のときでは、形がかなり違うので、「変身」させなければなりません。
例によって写真はお人形?で代用してます。
この変身の命令は、チャットで「/8*」のように言いますが、本体スクリプトがチャットを聞き、変身専用のスクリプトに「Transform:10」のような連絡を送り、変身はこの専用スクリプトが行います。
変身スクリプトには、あらかじめ元気なとき(オン)と休憩中(オフ)の各プリムパーツの位置・大きさ・角度などのパラメータが記録されています。
オンとオフの数字の切り替えが「変身」というわけですが、実際には一気に替えるのではなく、何段階かのステップを踏んで少しづつ変えます。
こうすると見た目には、にょきーっと立ち上がったり、ふにゃ~としぼんだり、アニメーションのように見えるのですね。
変身スクリプト(全部は長いので、かなり省略しています)
list Params = [
<3.8,0,-2.4>,<6,6,5>,<0,40,0>, <7,0,-0.2>,<15,6,5.5>,<0,0,0>, // 体
<4.5,0,-4>,<6,5,6.5>,<0,0,90>, <12,0,0>,<7,8,6>,<0,0,90> // 頭
]; // オフのときの位置・大きさ・角度、オンのときの位置・大きさ・角度
stepForm( float step ) { // 変身中の各段階の形
list rules;
integer link = 2;
for ( ; link<=3; ++link ) { // リンクしている各部品に
rules = [PRIM_POSITION, stepParams(link,step,0) * Ratio]; // 各数字の設定
rules += [PRIM_SIZE, stepParams(link,step,1) * Ratio];
rules += [PRIM_ROT_LOCAL, llEuler2Rot(stepParams(link,step,2)*DEG_TO_RAD)];
llSetLinkPrimitiveParamsFast(link,rules); // 各部品にパラメータを設定
}
}
transForm(integer n) { // n段階で変身
integer i = 1;
float step;
for ( ; i<=n; ++i ) {
if (Active == 1) step = (float)i/(float)n; // オフ→オンのとき
else step = (float)(n-i)/(float)n; // オン→オフのとき
stepForm( step ); // 変身中の各段階の形
}
}
default {
link_message(integer from, integer script, string msg, key id) {
list info = llParseString2List( msg, [":"], [] );
if ( llList2String(info,0) == "Transform" ) { // 「変身」の連絡を受ける
integer n = (integer)llList2String(info,1); // 変身の段階数
if (Active == 1) Active = 0; // オン/オフの切り替え
else Active = 1;
transForm(n); // n段階で変身
}
}
}