Site search

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

2008年8月5日火曜日

空高く飛べるスクリプト

時々サンドボックスで放置して寝てたりするので、スカイボックスがリターンされてても落ちないようHUDにエアプレーン用スクリプトを入れてる千尋ですwww

アバターは普通に飛ぶと高度150mぐらいが限界ですよね。そこで今回はもっともっと高く飛べるようにするスクリプトです^^

装着したときにllGetMassで物理オブジェクト(装着したアバターも含む)の質量を出して、それに重力加速度(だと思います)を掛けた値を垂直方向にllSetForceで加えると高いところを飛行しても落ちなくなりますね。
default
{
    attach(key on)
    {
        if (on) {  // 装着したとき
            float f=llGetMass()*9.8;  // 質量×重力加速度
            llSetForce(<0,0,f>,TRUE);  // Z方向に力を加える
        }
        else {  // そうでないとき
            llSetForce(<0,0,0>,TRUE);  // 力をリセット
        }
    }
}

でも、これだけだと落下は防げますが上昇ができませんw


上昇させるにはUPキー押したときllSetForceでZ方向に加える力を増やすだけでいいんですが、乗り物みたいにキー入力コントロールの部分を書かなきゃいけないのでちょっと複雑になります^^;;
// 空高く飛べる
float gravity=9.8;  // 重力加速度

default
{
    attach(key on)
    {
        if (on) {  // 装着したらコントロールのパーミッションをリクエスト
            llRequestPermissions(on, PERMISSION_TAKE_CONTROLS);
        }
        else { // そうでないときは
            llReleaseControls();  // コントロール解除
            llSetForce(<0,0,0>,TRUE);  // 力をリセット
        }
    }

    run_time_permissions(integer perm)  
    {
        if (perm & PERMISSION_TAKE_CONTROLS)
        {  // コントロールが許可されたら
            llTakeControls(CONTROL_UP|CONTROL_DOWN, TRUE, TRUE);  // UP/DOWNキー受付
        }
    }

    control(key id, integer level, integer edge)
    {
        integer i=llGetAgentInfo(llGetOwner());  // アバターの状態を調べて
        if (i & AGENT_FLYING) {  // 飛んでるとき
            float f;  // Z方向の力の計算用
            if (level & CONTROL_UP) f=llGetMass()*gravity*2;  // UPキーが押されると加速度を増やす
            else if (edge & (CONTROL_UP|CONTROL_DOWN)) f=llGetMass()*gravity;  // UP/DOWNキーが戻ると加速度を戻す
            llSetForce(<0,0,f>,TRUE);  // 力を設定
        }
        else llSetForce(<0,0,0>,TRUE);  // 飛んでないとき力を0にする
    }
}

同じような要領で力をX方向やY方向に加えるようにすると高速移動させたりとかもできますね^^

2010年3月25日追記: ログインしたとき浮いてしまうことがあったので、コントロールが許可された直後にもアバターの状態をチェックするよう変更にしました。高くまで飛べるスクリプトは一般にフライトアシストって呼ばれてるようです。9.8の値を使うっていうのは昔フリービーで入手した、高速で飛び回れるマントか何かのスクリプトを見て知ってたんですが、このスクリプトを書いた頃はフライトアシストっていう言葉を知りませんでした^^;

2010年3月28日追記: 場所によってまだ浮いてしまうことがあるみたいなのでスリープを入れました。

2010年5月11日追記: 一度飛んで、高度3000m以上くらいの場所に降りたとき浮き上がるっていうご報告がありましたので、もう飛んでないときは0じゃなくて下向きに力をかけるよう変更してみました^^;

2011年6月24日追記: 時々浮き上がるのは llTakeControls(CONTROL_UP, TRUE, TRUE); でUPキーしか受付けてないのが原因でした。。。できるだけ簡単にしようと色々削ったのが失敗だったですね。それに今まで気がつかなかったのも、かなりいい加減ですけど。。。orz キーの受付けと加速度を戻す部分にもDOWNキーを追加して、去年いい加減に追加してた部分は元に戻しました。m(_ _;)m

0 件のコメント:

コメントを投稿