2009年08月02日

開閉ドア

こんばんわ。

タッチで開閉するドアについてなのですが、ドアの開閉するスピードを遅くすることは出来ますでしょうか?
バタン、と開くのではなく、ギ~~~~とゆっくり開かせたいのですが…

ドア自体のスクリはFreeのもので下記のものを左右に入れて両開きドアとして使います。

string notecard = "doorini"; // name of the notecard
integer line = 0;
key request_id1;

rotation new_rot;
rotation startrot;


integer door_pos;

dooropen(){
if (door_pos == 1)
{
rotation x_90 = llEuler2Rot( <0,0,-90 * DEG_TO_RAD> );
new_rot = llGetLocalRot()* x_90 ; // compute global rotation
llSetLocalRot(new_rot);
door_pos = 0;
}
}

doorclose(){
if (door_pos == 0)
{
rotation x_90 = llEuler2Rot( <0,0,90 * DEG_TO_RAD> );
new_rot = llGetLocalRot() * x_90 ; // compute global rotation
llSetLocalRot(new_rot);
door_pos = 1;
}
}

default
{
state_entry()
{
door_pos = 1;
vector startPoint = llGetPos();
startrot = llGetRot();
// distance to the point of rotation should probably be a
// function of the max dimension of the object.
}

touch_start(integer total_number)
{
if (door_pos == 1){
dooropen();
llMessageLinked(LINK_ALL_OTHERS, llGetLinkNumber(), "openOK", llDetectedKey(0));
}else if (door_pos == 0 ){
doorclose();
llMessageLinked(LINK_ALL_OTHERS, 0, "close", "");
}

}
link_message(integer sender_num, integer num, string str, key id)
{
if (str == "openOK"){dooropen();}
if (str == "close"){doorclose();}
}


}


宜しくお願いします。


同じカテゴリー(スクリプト関連)の記事画像
オブジェクトのリンクとタッチで開く扉
自動チャットを止めたい
テレポートするとアニメーションが解除される
同じカテゴリー(スクリプト関連)の記事
 テクスチェンジのHUDについて (2015-07-01 04:51)
 モール用のプリムカウンターを探しています (2014-11-29 20:09)
 連続するアニメーションの処理 (2014-08-24 03:23)
 オブジェクトの上にフローティングテキストを出す。 (2014-08-22 16:46)
 チャットログの盗聴について (2014-02-03 03:43)
 椅子に座った後で位置調整できるスクリプト (2013-03-24 16:37)

Posted by まおまお  at 02:21 │Comments(3)スクリプト関連

この記事へのコメント
いきなり90度向きを変えた状態にllSetLocalRotするのではなく、すこしづつ角度を変えてみればいいのではないでしょうか。
以下の例はdooropen関数をそのような発想で書き換えてみたものです。
この例では角度が5度づつ変わっていきます。
diff(何度づつ変えるか)とthreshold(どこでドアが「開ききった」と判断するか)は、試行錯誤で変更する必要があるかもしれません。

doorcloseも同様に考えればいいと思いますが、この二つの関数は、たぶんひとつにまとめられますよね。

dooropen(){
rotation goal_rot;
rotation x;
if (door_pos == 1){
float threshold=0.000001;
integer diff=5;
rotation x_90 = llEuler2Rot( <0,0,-90 * DEG_TO_RAD> );
goal_rot = llGetLocalRot()* x_90 ; // compute global rotation
rotation dx = llEuler2Rot( <0,0,-diff * DEG_TO_RAD> );
for(x=llGetLocalRot(); llFabs(x.z-goal_rot.z)>=threshold; x*=dx){
//llOwnerSay(llList2CSV([x.z, goal_rot.z]));
llSetLocalRot(x);
}
llSetLocalRot(goal_rot);
door_pos = 0;
}
}
Posted by Yoo at 2009年08月02日 12:01
少し前に、まわりでドアネタが流行りました

iNNXでまとめられているので、参考にされてはいかがでしょう

LSLでドアいろいろ
http://blog.innx.co.jp/vw/secondlife/lsl/2009-07-03-door-script-samples
LSLでドア、論点いろいろ
http://blog.innx.co.jp/vw/secondlife/lsl/2009-07-03-door2
ドアいじめ - アバターの見た目の位置とllDetectedPos
http://blog.innx.co.jp/vw/secondlife/lsl/2009-07-04-door-avatar-position
ドアのスクリプトサンプル - 滑らかに開閉するドア
http://blog.innx.co.jp/vw/secondlife/lsl/2009-07-05-smooth-door-script-sample
Posted by you Xiao at 2009年08月02日 12:29
Yooさま
なるほど!開閉速度をコントロールするという考え方ではなく、少しずつ動かすという考え方なのですね^^
ありがとうございました!

yoo Xiaoさま
これは大変参考になります^^
解説も入っていて自分で関数をいじるときにも期待通り動かせそうですね!
ありがとうございました!


両方を試してみて、自分にあった方式で作ってみようと思います^^
Posted by まおまお at 2009年08月02日 14:51
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。