Site search

Google
WWW を検索 backup-beta.blogspot.com を検索

2009年4月2日木曜日

長距離用高速テレポーターのスクリプト

高度300m以上移動するテレポーター http://backup-beta.blogspot.com/2008/07/300m_13.htmlllSetPosで可能な距離(10m)ずつ動かせていくので、長距離になると移動にかかる時間が気になるんですね。

速く移動させる方法はWarpPosが有名かなって思いますが、原理はllSetPrimitiveParamsに移動させる距離を10m以下に分割した位置をリストにして指定したらいいんですよ。あっという間に移動できます^^
例えば<10,10,10>の位置から真上に30m移動させるとき、こんな感じになりますね。
llSetPrimitiveParams([PRIM_POSITION,<10,10,20>, PRIM_POSITION,<10,10,30>, PRIM_POSITION,<10,10,40>]);

それで今回は速く移動できるテレポーターのスクリプトを書いてみました。


使い方は http://beta.slmame.com/e303741.html http://backup-beta.blogspot.com/2008/07/300m.html と同じで、目的地の位置に置いてスクリプトをリセットすると目的地の座標が設定されますので、あとはテイクして出発地に持って行って置くだけです。(SIM内専用です)
// 長距離用の高速テレポーター
vector dest;
vector pos;

default
{
    state_entry()
    {
        llSitTarget(<0.2,0,0.55>, ZERO_ROTATION);  // 座る位置
        dest=llGetPos();  // 現在位置の座標を目的地に設定
        llOwnerSay("Destination = "+(string)dest);
    }

    changed(integer change)
    {
        if (change & CHANGED_LINK) {  // リンクが変わったとき
            key id=llAvatarOnSitTarget();  // 乗ってるアバターのキー
            if (id) {
                if (pos) return;  // 出発地座標が設定されてるとき(動作中)はリターン
                pos=llGetPos();  // 現在位置を出発地の座標に設定
                vector v=dest-pos;  // 目的地と出発地のベクトルの差
                float f=llVecDist(dest,pos);  // 移動する距離
                list l;  // llSetPrimitiveParams用のリスト
                integer i;
                integer j=llCeil(llFabs(f/10));  // 移動距離を10mで何分割になるか計算
                vector p=v/j;  // 1回に移動させるベクトル値
                for (i=0; i <= j; i++)
                {  // 分割した回数分ループ
                    l+=[PRIM_POSITION,pos+p*i];  // 分割した座標をリストアップ
                }
                llSetPrimitiveParams(l);  // テレポート開始
                llUnSit(id);  // 目的地でアバターを降ろす
                l=[];  // リストをクリア
                for (i=j; i >= 0; i--)
                {  // 行きと逆順のリストにする
                    l+=[PRIM_POSITION,pos+p*i];
                }
                llSetPrimitiveParams(l);  // テレポーターを出発地に戻す
                pos=ZERO_VECTOR;  // 出発地の座標をクリア
            }
        }
    }
}

自分の土地から出ないように使ってくださいね。スクリプト禁止になってる他の人の土地とかを通過するとアバターが降りた後テレポーターが戻ってこなくなりますのでwww
あと、地形の隆起してるところとか途中で地面に接触するようなポイントがあると、目的地もテレポーターの戻る出発地も大きくズレてしまうみたいです^^;

一瞬で移動なので座る位置はテキトーな小さめの値でオッケーだと思いますが、<0,0,0>にしてしまうとllAvatarOnSitTargetが反応しないので動かなくなりますw


2012年3月14日追記: 新関数llSetRegionPosに変更したものを載せました。
新関数を使った長距離用高速テレポーターのスクリプト

3 件のコメント:

  1. ☆ななほし☆2009年8月18日 20:33

    千尋さん
    千尋さんのブログ、及び商品をたびたび利用させていただいています。
    ありがとうございます。
    ところでこの高速テレポーターですが指定したアバターだけが使えるようには出来ませんでしょうか?

    返信削除
  2. ご利用頂きありがとうございます^^
    許可するアバターをリストにして、リストに出てないアバターが乗ったときは立たせて中断させるようにしたらいいですかね。
    スクリプトの最初に許可するアバター名のリストを置いて
    list avatar=["アバター名1","アバター名2"];
    それで
    if (id) {
    の後に
    integer i=llListFindList(avatar,[llKey2Name(id)]); // リストをチェック
    if (i < 0) { // 乗ったアバターがリストになかったら
    llUnSit(id); // 立たせて
    return; // リターン
    }
    を入れてください。
    ただアバターのリストを頻繁に変更することがある場合は、その度に座標の設定をし直さないといけないので、リストはノートカードで読み込ませるようにしたほうがいいかもですね^^;

    返信削除
  3. ☆ななほし☆2009年8月19日 2:28

    千尋さん、ご丁寧にありがとうございます。
    悪戦苦闘の末。。。友達の力を借りて
    設定することが出来ました^^;
    もっともっと、勉強しなければと思いますが
    スクリプトの壁は高いです><
    ほんとうに、ありがとうございます
    商用ブログ有料化・・・あたしもとても残念で仕方がありません

    返信削除