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();}
}
}
宜しくお願いします。
タッチで開閉するドアについてなのですが、ドアの開閉するスピードを遅くすることは出来ますでしょうか?
バタン、と開くのではなく、ギ~~~~とゆっくり開かせたいのですが…
ドア自体のスクリは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について
モール用のプリムカウンターを探しています
連続するアニメーションの処理
オブジェクトの上にフローティングテキストを出す。
チャットログの盗聴について
椅子に座った後で位置調整できるスクリプト
モール用のプリムカウンターを探しています
連続するアニメーションの処理
オブジェクトの上にフローティングテキストを出す。
チャットログの盗聴について
椅子に座った後で位置調整できるスクリプト
以下の例は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;
}
}
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
なるほど!開閉速度をコントロールするという考え方ではなく、少しずつ動かすという考え方なのですね^^
ありがとうございました!
yoo Xiaoさま
これは大変参考になります^^
解説も入っていて自分で関数をいじるときにも期待通り動かせそうですね!
ありがとうございました!
両方を試してみて、自分にあった方式で作ってみようと思います^^