風船で遊んでみました^^

jinko

2007年09月20日 20:33


Maroaさんから宙に浮かせてプカプカさせたいという問い合わせがあって
いろいろ遊んでみました。

もう、解決したみたいですけど、こんな感じですかね。


腰の位置で上下するようなアニメーションで、浮いている感じを出しています。
風船は、アタッチされているので、アニメーションにあわせて上下します。

んで、ここからそれていくのですが・・・

なんか本物っぽい風船をつくれないかなーーって思って、いろいろやってみました。
そのものをプカプカ浮かせるには、
物理属性にして浮力(Buoyancy)を設定します。

テスト用のスクリプトは以下のとおりです。
(適当な風船のカタチを作って、以下のスクリプトを設定してみてください。)

おくとフワフワ浮ぶ風船スクリプト

//===============================================
// [Balloon.lsl]
// Floating Balloon
// ver 1.0 Sep 20, 2007 by Jinko Spitteler
//===============================================
// Ref http://wiki.secondlife.com/wiki/LlSetBuoyancy

float fBalloonLife = 300.0; //[sec]
init () {
    llSetPrimitiveParams([PRIM_PHYSICS, TRUE]);
    llSetBuoyancy(1.05);
    llSetTimerEvent(fBalloonLife);
}
ending () {
    llOwnerSay("Bang!!");
    llSetTimerEvent(FALSE);
    llDie();
}
default {
    state_entry () {
        init();
    }
    touch_start (integer num_detected) {
        ending();
    }
    timer () {
        ending();
    }
}


地面に置くとふわふわあがってなくなりやすいので、
タッチするか、300秒後に勝手に消滅するようにしてます。

浮力の設定ですが、
llSetPrimitiveParams([PRIM_PHYSICS, TRUE]);
で、物理属性にして、
llSetBuoyancy(1.05);
で浮力をセットしています。
パラメータは、1.0のとき無重力、
1より小さいときは落ちていって(沈む)、
1より大きいと浮びます。



ひものところをフレキシにしたいところなんですが、
物理属性のときは、フレキシをあきらめないといけませんね^^
過去記事

このままでも、結構遊べるのですが、なくなってしまいますので、
おいたらフワフワあとをついてくるように改良してみました。

おくとフワフワついてくる風船
//===============================================
// [Balloon.lsl]
// Floating Balloon Following AV
// ver 1.1 Sep 20, 2007 by Jinko Spitteler
//===============================================
// Ref http://wiki.secondlife.com/wiki/LlSetBuoyancy
// Ref http://kappa.slmame.com/e19525.html
// Ref http://sabro.slmame.com/e28777.html

key keyOwner;
float fSensorRange = 30.0; //[m]
float fSensorInterval = 2.0; //[sec]
float fTargetRange = 0.1; //[m]
vector vecTargetOffset = ;
float fBalloonLife = 300.0; //[sec]

init () {
    llSetPrimitiveParams([PRIM_PHYSICS, FALSE]);
    llSetBuoyancy(1.0);
    keyOwner = llGetOwner();
    llSetTimerEvent(fBalloonLife);
    llSensorRepeat("", keyOwner, AGENT, fSensorRange, PI * 2, fSensorInterval);
}

move(vector vecTargetPos) {
    vector vecCurrentPos = llGetPos();
    llSetPrimitiveParams([PRIM_PHYSICS, TRUE]);
    llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, FALSE);
    llMoveToTarget(vecTargetPos, 1.0);
}

ending () {
    llOwnerSay("Ban!!");
    llSetTimerEvent(FALSE);
    llDie();
}

//-------------------------------------------------------------
// Default State
//-------------------------------------------------------------
default {
    state_entry () {
        init();
    }
    sensor (integer num_detected) {
        move(llDetectedPos(0) + vecTargetOffset);
    }
    touch_start (integer num_detected) {
        ending();
    }
    timer () {
        ending();
    }
}


かっぱさんのところの、ペットの記事を大いに参考にさせていただきました。オリジナルは、ハチのカタチのペットがついてきて頭の上でグルグルまわってかわいいんです。
また、姿勢制御は、sabroさんの物理オブジェクトの回転を防ぐという記事を参考にさせていただきました。設定結果の実験動画付です。
どうもありがとうございました>かっぱさん、sabroさん



本当は、風船を手にもって、プカプカできるといいのに~と思ってます。

これは、できませんでした^^;

プカプカといいながら、止まっているときは実はプカプカしていません。
アタッチメントをフワフワ動かすには、どうしたら・・・・

Harayokiさんの記事アタッチメントをフワフワ動かすの続きを楽しみにしておきたいと思います♪
(↑他力本願ですね^^)

(追記)
Harayokiさんの記事をあたらめて読むと、そっか、llSetPosをtimerイベントで動かせばいいんだってわかりました。ありがとうございました>Harayokiさん
Tips