egg chair や bar chair 回転椅子で使っているスクリプト
モデリング時は全体が回転するため椅子の脚部のデザインは回転体である必要があります。
アニメーションごとの位置調整はしていません。アニメ制作時最初のコマのデフォルトポーズを同じばしょからはじめて位置をあわせて作る必要があります。
ポーズの数にあわせて、修正が必要です。(タブが消えてしまいすみません。)
string animation_name0="mm_chair5_pose1"; string animation_name1="mm_chair5_pose2"; string animation_name2="mm_chair5_pose3"; string animation_name3="mm_chair5_pose4"; string animation_name4="mm_chair5_pose5"; rotation startrot; rotation newrot; vector xyz_angles = <0,0,10.0>; vector angles_in_radians; key siton1 = NULL_KEY; vector sit_pos1 = <0.0, 0.4, -0.4>;//adjust the position vector sit_rot1 = <270.0, 0.0, 270.0>;//adjust the rotation and tilt integer animax = 5;//The total number of animation files integer animanum = 0; animachange() { list anms1 = llGetAnimationList(siton1); integer i1; for (i1 = 0; i1 < llGetListLength(anms1); i1++) { if(llList2Key(anms1, i1) != NULL_KEY) { llStopAnimation(llList2Key(anms1, i1)); } } if (animanum == 1) { llStartAnimation(animation_name1); } if (animanum == 2) { llStartAnimation(animation_name2); } if (animanum == 3) { llStartAnimation(animation_name3); } if (animanum == 4) { llStartAnimation(animation_name4); } //Number of animation only add if statement else //animation pose last { llStartAnimation(animation_name0); } } default { state_entry() { llSitTarget(sit_pos1, llEuler2Rot(sit_rot1 * DEG_TO_RAD)); } changed(integer change1) { if (change1 & CHANGED_LINK) { key av1 = llAvatarOnSitTarget(); if (siton1 != NULL_KEY) { if (av1 == NULL_KEY) { list anms1 = llGetAnimationList(siton1); integer i1; for (i1 = 0; i1 < llGetListLength(anms1); i1++) { if(llList2Key(anms1, i1) != NULL_KEY) { llStopAnimation(llList2Key(anms1, i1)); } } siton1 = NULL_KEY; animanum = 1; newrot = startrot; llSetRot(startrot ); } } else { if (av1 != NULL_KEY) { angles_in_radians = (xyz_angles * DEG_TO_RAD); startrot = llGetRot(); newrot = startrot; siton1 = av1; llRequestPermissions(siton1, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS); } } } } run_time_permissions(integer perm1) { key perm_key1 = llGetPermissionsKey(); if (perm_key1 == siton1) { if (perm1 & PERMISSION_TRIGGER_ANIMATION) { list anms1 = llGetAnimationList(siton1); integer i1; for (i1 = 0; i1 < llGetListLength(anms1); i1++) { if(llList2Key(anms1, i1) != NULL_KEY) { llStopAnimation(llList2Key(anms1, i1)); } } } llStartAnimation(animation_name0); llTakeControls(CONTROL_UP | CONTROL_DOWN | CONTROL_RIGHT | CONTROL_LEFT, TRUE, FALSE); } } control(key id, integer held, integer change) { vector mlinear; vector mangular; if(change & CONTROL_UP && held & CONTROL_UP) { if(animanum < animax) { animanum++; animachange(); } else { animanum = 1; animachange(); } } if(change & CONTROL_DOWN && held & CONTROL_DOWN) { if(animanum > 1) { animanum--; animachange(); } else { animanum = animax; animachange(); } } if(held & CONTROL_RIGHT) { newrot = (newrot * llEuler2Rot(angles_in_radians) ); llSetRot(newrot); } if(held & CONTROL_LEFT) { newrot = (newrot / llEuler2Rot(angles_in_radians )); llSetRot(newrot ); } } }
2014/5/3ごめんなさい、スクリプト中にゴミを発見、コピーペーストしたときに余計なものまでもってきちゃいました、llSetTimerEvent(15);のとこを削除、不要に負荷をつくってたようで。訂正。以上 みちえ