2007年07月29日
phantomイスの変な挙動
sit2avator links

#2で述べた妙な挙動の話はいったん置いておいて
それとは別にちょっとバグ???ぽい挙動を見つけました。
-=-=-=-=-=-=-=-=-=-=-=-=-=-=
いつだったかわすれましたが、
プリムをphantom属性(すり抜ける状態)にすると
そのプリムにはもはや座れなくなるという事に気づきました。
(setSitTargetで指定する座標ベクトル値はデフォルトのゼロベクタである必要があります)
これはバグではなく、仕様だと思います。
けっこう便利かな?と思いつつ使う機会がなかったのですが
今、ちょうどイスについて色々検証しているので、
ついでにそれについても詳しく調べてみました。
結果、ですが、どうも完璧に座れなくはできないようですね。
というよりもちょっと挙動がおかしいのです。
以下、その実験の詳細です。
まず実験用にタッチすると"通常プリム&sitTragetあり"、"phantom&sitTragetなし"
を切り替えるscriptを組みました。
(ソースはエントリーの最後にあり)
下記の画像の青いプリム(なつかしのワンプリムイス)にそのscriptが仕込まれています。

phantomでないときの見た目

phantom時は分かりやすいように、プリムを半透明にしました
この2つの状態と周りの状況を変化させつつ、
何度もイスに座ってみます。
ひさびさに映像で確認どうぞ。

#2で述べた妙な挙動の話はいったん置いておいて
それとは別にちょっとバグ???ぽい挙動を見つけました。
-=-=-=-=-=-=-=-=-=-=-=-=-=-=
いつだったかわすれましたが、
プリムをphantom属性(すり抜ける状態)にすると
そのプリムにはもはや座れなくなるという事に気づきました。
(setSitTargetで指定する座標ベクトル値はデフォルトのゼロベクタである必要があります)
これはバグではなく、仕様だと思います。
けっこう便利かな?と思いつつ使う機会がなかったのですが
今、ちょうどイスについて色々検証しているので、
ついでにそれについても詳しく調べてみました。
結果、ですが、どうも完璧に座れなくはできないようですね。
というよりもちょっと挙動がおかしいのです。
以下、その実験の詳細です。
まず実験用にタッチすると"通常プリム&sitTragetあり"、"phantom&sitTragetなし"
を切り替えるscriptを組みました。
(ソースはエントリーの最後にあり)
下記の画像の青いプリム(なつかしのワンプリムイス)にそのscriptが仕込まれています。

phantomでないときの見た目

phantom時は分かりやすいように、プリムを半透明にしました
この2つの状態と周りの状況を変化させつつ、
何度もイスに座ってみます。
ひさびさに映像で確認どうぞ。
この映像で検証していること
1)普通にイスに座る 問題なし
2)イスを他プリムに埋め込んで座る 問題なし
3)イスをファントムに切り替える
4)なんどか試すがイスに座れない たぶん問題なし
5)イスを他プリムに埋め込むと、座れてしまう
さらにCHANGED_LINKイベント時に取得できるllAvatarOnSitTarget()の値が
座ったアバタのキー値ではなくNULL_KEYを返してくる
6)再度イスを空中に浮かすとイスに座れなくなる

プリムが埋まっていると座れちゃったぞ、の図
まとめると、
座れないはずのphantom(かつsitTragetの設定がない)プリムは、
地面や他プリムに重なっているとなぜか座れてしまう。
かつ、その時起こるCHANGED_LINKイベントにおいては
イスに座っているアバタのキー値が取れない。
です。
なんでしょうね~これ。
絶対に座れないプリムというのはいずれ必要になりそうですが
この方法だとしょっちゅう座れてしまってダメですね。
ほかの方法を探しましょ…。久々にlslWiki読み漁ろうかな。
イスに仕込まれているscript
integer debug = TRUE;
Trace(string s){
if(debug) llOwnerSay(s);
}
vector SIT_POS = <-1,0,-0.2>;
integer bSitEnabled = TRUE;
Init(){
Trace("Init");
SetSitEnabled(bSitEnabled);
}
SetSitEnabled(integer b){
Trace("SetSitEnabled");
list l = [PRIM_PHANTOM,!b];
llSetPrimitiveParams(l);
if(b){
llSetAlpha(1.0,ALL_SIDES);
llSitTarget(SIT_POS,llEuler2Rot(<0,-90,0>*DEG_TO_RAD));
}else{
llSetAlpha(0.5,ALL_SIDES);
llSitTarget(ZERO_VECTOR,ZERO_ROTATION);
}
}
default{
state_entry(){
Init();
}
on_rez(integer num){
llResetScript();
}
touch_start(integer total_number){
bSitEnabled = !bSitEnabled;
SetSitEnabled(bSitEnabled);
}
changed(integer che){
if(che & CHANGED_LINK){
key av = llAvatarOnSitTarget();
if(av!=NULL_KEY){
Trace(llGetObjectName()+" sit "+llKey2Name(av));
}else{
Trace("unsit");
}
}
}
}
Posted by harayoki at 03:13│Comments(0)
│椅子(sit)の挙動