2008年05月28日
二つづつ表情とアニメーションの同時実行スクリプトでござるよ!
ご無沙汰の間にGinji Hax殿より依頼を受けており申したが、そのスクリプトのエッセンスをお伝えするでござる。
依頼は男女にて同期するアニメボールで、男性が笑みを浮かべる女性を抱き上げてキスするというロマンチックな案件。
男女共に「座り」になれば同期アニメがスタート致し、どちらかが「立つ」になれば相方もアニメを止めて「立つ」というものでござった。
これは、ぎんちゃん(以後Ginji Hax殿の愛称にて)のショップ販売案件でスクリプトを公開するのは憚られる故、男女同期のない単独での表情とアニメの同時実行スクリプトを公開するでござるよ。
これは、同じくぎんちゃんの先の依頼にて完成しており申した、男女共に二つのアニメが連続同期するキスボールに、表情の組み込みをテストすべく書いたスクリプトなのじゃ。
オブジェクトへのタッチ時の動作は「座る」に設定してくだされ。
スクリプトにて連続させるアニメーションとしてmale1とmale2の名前を持つアニメーションが必要故用意致され、オブジェクトのコンテンツ内に入れるべし。
表情は組み込まれておるゆえ、スクリプトのみで動作するでござるよ。
male1はループなしの一回きり7.2秒(male2とのつなぎ調整によりタイマーは7.1秒設定)アニメ、male2は28.2秒のループアニメでござる。
アニメ時間は用意されたアニメの総フレーム数をフレームレート(一秒当たりのフレーム数)で割って算出。
ぎんちゃんの例ではフレームレートが10、male1が72フレームで7.2秒、male2は282フレームで28.2秒なのじゃ。
male1は男性が女性を持ち上げるアニメで、その後のmale2では男性が女性を抱き上げてキスするアニメをループして心ゆくまでキスを堪能致す趣向。
勿論male1とmale2はアニメの繋ぎがスムースになる様、制作時にmale1の最終フレームとmale2の第2フレーム(第1フレームはアニメ箇所判定のためのフレームでアップすると第2フレームからのアニメとなる)のポーズが調整されおり申す。
一回アニメとループアニメはアニメーションアップ時の画面で設定するでござるよ。
取り合えずの動作確認ということなら、用意致すアニメの繋ぎポーズと時間は出来合いの適当なものを用意致されれば良し。
但し、male1は一回アニメmale2はループアニメじゃよ。
そして、male1にmale2を続けてアニメ致すのにタイマーが設定されおる故、スクリプト冒頭部分グローバル変数のanim1_timeには新たなmale1アニメの秒数を設定して下され。
記事写真同様、適当なオブジェクトにスクリプトをコピペすれば完成。
タッチでも良いのじゃが、そこは依頼通り「座る」用のスクリプトに致しており申す。
スクリプト内のコメントを読めば処理の内容が判り申そう。
これをば流用致して男女同期複数アニメ&表情を完成致すはそなたの修行次第。
検討を祈り申す!!
string animation_name_m1="male1"; // 実行するアニメーション。ノンループアニメ
string animation_name_m2="male2"; // 実行するアニメーション。28.2秒をループアニメ。
float anim1_time=7.1;//anim1の再生時間
float anim2_time=7.05;//7.05×4=28.2秒でhyoujou_2とタイミングが合う。
key av_m;
vector sit_pos = <0.0, 0.01, 0.0>; // 座る位置,sit_posとsit_rotを全て0にすると普通の座りでsit_poseにならなかった
vector sit_rot = <0.0, 0.01, 0.0>; // 座る角度
integer anim_flag;//アニメーション判定フラグ
hyoujou_2(integer anim_flag){//ユーザー関数。anim2(28.2秒)に同期して「笑顔」と「ニッコリ」
if(anim_flag==1){
llStartAnimation("express_smile");//笑顔
llSleep(3.525);//3.525*2*4=28.2、anim2のサイクルに合うように設定
}
if(anim_flag==1){
llStartAnimation("express_toothsmile");//ニッコリ
llSleep(3.525);//hyoujou_2一回再生で7.05秒
}
}
default
{
state_entry()
{
av_m=NULL_KEY;
llSitTarget(sit_pos, llEuler2Rot(sit_rot * DEG_TO_RAD));//座り位置設定
anim_flag=0;
}
on_rez(integer i){
llResetScript();
}
changed(integer change){//anim1が始まり時か終了時かanim_flagで判定
if (change & CHANGED_LINK) {
anim_flag=!anim_flag;//「座り」「立ち」毎にanim_flagを反転
if(anim_flag==1){//「座り」時=anim1開始
av_m = llAvatarOnSitTarget();//この関数はllSitTarget関数を使って
//sit位置を設定しているオブジェクトでしか機能しない。
llRequestPermissions(av_m, PERMISSION_TRIGGER_ANIMATION);
}else{//「立ち」時=anim1終了
llStopAnimation(animation_name_m1);
av_m=NULL_KEY;
llSetTimerEvent(0.0);
}
}
}
run_time_permissions(integer perm) {//「座り」でanim1開始
llStartAnimation(animation_name_m1);
llStartAnimation("express_toothsmile");//ニッコリ
llSetTimerEvent(anim1_time);//7.1はanim1の時間。anim2のためにタイマーセット
}
timer(){//expression roop
llStopAnimation(animation_name_m1);
llStartAnimation(animation_name_m2);//anim2はループ設定されているのでタイマー不要。
llSetTimerEvent(0.0);
state anim2_smile;//anim2と笑顔・ニッコリループ用ステートへ
}
}
state anim2_smile{
state_entry(){
hyoujou_2(anim_flag);
llSetTimerEvent(anim2_time);
}
timer(){//7.05秒ごとにhyoujou_2をループ
hyoujou_2(anim_flag);//「笑顔」~「ニッコリ」
}
changed(integer change){//「立ち」でhyoujou_2とanim2終了してdefaultへ
if (change & CHANGED_LINK) {
anim2_flag=0;
llStopAnimation(animation_name_m2);
av_m=NULL_KEY;
llSetTimerEvent(0.0);
state default;
}
}
}
2008年05月20日
ご無沙汰!拙者のRLは「生き様ブログ」でご覧あれ!!
近頃更新が停滞してござったが死んでしまったのでも活動が止まったのでもござらんよ。
SLでもginnji Hax殿の依頼を受け前に制作したチークダンスボールを修正・改良にてキスボールに致して二つのアニメーションと二つの表情をなめらかに同時実行する仕事などもしており申した。
又、新たに拙者のRLを伝える「生き様ブログ」を新設致したのでそちら共々今後とも宜しくでござるよ。
SLでもginnji Hax殿の依頼を受け前に制作したチークダンスボールを修正・改良にてキスボールに致して二つのアニメーションと二つの表情をなめらかに同時実行する仕事などもしており申した。
又、新たに拙者のRLを伝える「生き様ブログ」を新設致したのでそちら共々今後とも宜しくでござるよ。


