ソラマメブログ
< 2025年05月 >
S M T W T F S
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Mail

2007年08月06日

物理属性に変化時の注意

physics links
物理属性に変化時の注意

ワケあって、またもやモジュールを作りました。
物理属性関係のモジュールです。
それをエントリーにまとめる前に、
まず物理属性に変化させる際の注意点などについて
自らの復習がてらまとめてみます。

オブジェクトを物理属性に変化させるとき、
他のオブジェクトやアバタに重なっていると、アラートが出て失敗するのは
みんな知っていると思います。(よね?)

物理属性に変化時の注意
この画像ではアバタと重なっているboxを物理属性にしようとして怒られています。

このように物理属性変更が反映されない現象は
llSetStatus(STATUS_PHYSICS,TRUE);

もしくは
llSetPrimitiveParams([PRIM_PHYSICS,TRUE])

のようにscriptで設定したときも起こります。
ここで問題なのが、その際、アラートも出なければランタイムエラーもでず、
単に物理属性が変化しないだけなので、属性変更に失敗した事に気づきにくい、と言う事です。

アバタが近くにいたらプログラムが誤動作した、とか、けっこう起こりそうな感じですね。
物理属性になったという前提でプログラムが走り続けると
意図しない動作をしまくりです。
よって、確実な動作を保障するためには
llGetStatus(STATUS_PHYSICS);

もしくは
llList2Integer(llGetPrimitiveParams([PRIM_PHYSICS]),0);

で物理属性が変化したかどうかを調べて処理を続けなくてはいけません。
面倒くさいですね。

…という事で、その辺をいい感じに処理してくれるモジュールを作りました。
次エントリーで解説します。

ちなみに。llRezObjectでオブジェクトを動的に作って、
その後レズされたオブジェクトの物理属性をONにするようなプログラムを組むと
上記のように何かと重なっていた際に、物理属性がついてくれません。

今まで自分は、そのような不具合が起きないように、
rezするオブジェクトは前もって物理属性パラメータをONにしてから
llRezObjectを行うプリムの中に仕込んでおく、という対抗手段を行っていたのですが、
その場合でも物理属性がrezした後になくなってしまう!という現象に
確かに出会うことがありました。

が、しかし、先ほど実験した限りでは、
物理属性に変化時の注意
円錐状のプリムをタッチすすと物理属性のボールがrezされる実験の様子

他プリムに重ねても、アバタに重ねても、
他、どうやっても、rez後に物理属性が取れてしまう不具合を再現することができませんでした。

なにか条件が足りないのか…
それともSL側がアップデートして直った?

詳細がわからないとちょっと気持ち悪い感じです。

 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。