2007年11月28日
プリムの動きをループさせるスクリプト
どうもお世話になります
本日は、プリムにA~Bの角度をループさせるスクリプトについて質問です。
(パタパタする感じ)
【現状】
------------------------------------------------------------
default {
state_entry()
{
rotation A = llGetRot();
A *=llEuler2Rot(<50,0,0>*DEG_TO_RAD);
llSetRot(A);
rotation B = llGetRot();
B *=llEuler2Rot(<-50,0,0>*DEG_TO_RAD);
llSetRot(B);
}
}
------------------------------------------------------------
動きの指定は、できたのですが、、、
これをA-Bと、ループして動かすには、あと何を足したらよいのでしょうか?
もしくわ、もっと良い書き方がありますか?
本日は、プリムにA~Bの角度をループさせるスクリプトについて質問です。
(パタパタする感じ)
【現状】
------------------------------------------------------------
default {
state_entry()
{
rotation A = llGetRot();
A *=llEuler2Rot(<50,0,0>*DEG_TO_RAD);
llSetRot(A);
rotation B = llGetRot();
B *=llEuler2Rot(<-50,0,0>*DEG_TO_RAD);
llSetRot(B);
}
}
------------------------------------------------------------
動きの指定は、できたのですが、、、
これをA-Bと、ループして動かすには、あと何を足したらよいのでしょうか?
もしくわ、もっと良い書き方がありますか?
Posted by sadayuki1667
at 14:12
│Comments(4)
まあ、行動することはいいことかなと、書き込むことにしてみましたw
あまり凝らないで本当に最小限の変更で動かすのであれば
こんな書き方で実現できるのではないかと思います。
//------------------------------------------------------------
integer pata_pata_flag=FALSE; //patapata flag
default{
state_entry(){
llSetTimerEvent(0.5); //0.5 sec cycle timer event
}
//timer event
timer(){
if(pata_pata_flag==FALSE){
pata_pata_flag=TRUE;
rotation A = llGetRot();
A *=llEuler2Rot(<50,0,0>*DEG_TO_RAD);
llSetRot(A);
}else{
pata_pata_flag=FALSE;
rotation B = llGetRot();
B *=llEuler2Rot(<-50,0,0>*DEG_TO_RAD);
llSetRot(B);
}
}
}
//------------------------------------------------------------
0.5秒毎に回転方向が切り替わってます。
使用したのは0.5秒毎にタイマーイベントが発生する
llSetTimerEvent(0.5); と
そのタイマーを実行する場所 timer()の追加
あとはパタパタがどちらの向きになるかを記す
pata_pata_flag が追加されています
タイマーイベントが起きるたびに pata_pata_flagが
TRUE と FALSEを行ったりきたりしながら
ぱたぱたと動くと思います。パタパタの周期を遅くしたい場合は
llSetTimerEvent(1.0); というように数値を大きくすればOKです
とりあえずトライしてみてね~ん
汎用性ないけどw
(未コンパイルなのでお気をつけて)
integer deg_speed=0;
rotation rot_tmp;
vector def_vec=<50,0,0>;
vector cos_vec;
default
{
state_entry()
{
deg_speed=0;
llSetTimerEvent(0.1);
}
timer()
{
rot_tmp = llGetRot();
cos_vec = def_vec*llCos(deg_speed*DEG_TO_RAD);
rot_tmp *= llEuler2Rot(cos_vec*DEG_TO_RAD);
llSetRot(rot_tmp);
deg_speed+=1; //cos deg++ speed
if(deg_speed>360)deg_speed=0; //deg limit
}
}
回転の方向をtimerイベントで定期的に入れ替えてやればOKだと思います。
じゃとりあえずチョイ書き込みで
llRotLookAt(rotation target, float strength, float damping)
という命令が実験したとき動いてる途中が見えたと記憶してます。
ガクガクと動くのがいやであればこれで・・・
書き方は
llSetRot(rotation rot) にたいして回転力とダンピングが
付いただけですので単純に置き換えて、たとえば このように
llRotLookAt(rot_tmp,1.0,0.2);
とりあえず書き換えるだけで動くはずです
今ソース出せる状態で無いので実際のソースと
検証は後の人にバトンタッチw
ではでは~