2012/06/15

むふふな変身


むふふな商品には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段階で変身
  }
 }
}