2009年03月31日

オブジェクトのリンクとタッチで開く扉

みなさま、またお知恵をお貸し下さいませ。

現在、建物を造っていて困ったことがあります。

オブジェクトのリンク(全選択してCtrl+L)のことなのですが、一部ファントムの部分を作ってリンクさせるとファントムにならないのですが、これはどう解決したらいいのでしょうか?

また、同じようにタッチで開閉するドアをリンクさせるといつの間にか開く方向が変化してしまい、思うようになりません。
オブジェクトのリンクとタッチで開く扉
 ↑これくらい角度がずれてしまうのはまだ良い方で…><

またXYZ軸で回転を指定をしているため、当然ですが建物を移動させるとずれてしまいます。

ちなみに扉に入れているスクリプトはWEBで頂いてきた物で

rotation rot;
key sound_open = "Door_Op";
key sound_close = "Door_Clo";

default
{
state_entry()
{
rot = llGetRot();
state close;
}
}

state open {
state_entry()
{
llTriggerSound(sound_open, 1.0);
llSetRot(rot * llEuler2Rot(<0.0, 0.0, 90.0> * DEG_TO_RAD));
llSetTimerEvent(30.0);
}

touch_start(integer total_number)
{
state close;
}

timer(){
llSetTimerEvent(0);
state close;
}
}

state close {
state_entry()
{
llSetRot(rot);
llTriggerSound(sound_close, 1.0);
}

touch_start(integer total_number)
{
state open;
}
}

です。

ファントムも扉も今のところリンクさせなければ都合が悪くないのですが、
商品として売ろうと思ったときにリンクしていないとバラで梱包することになり不都合なので、うまくリンクをさせて持ち物のフォルダ内に収納させたいのですが…

最近買ったものではオモチャ箱みたいな物をREZするとダイアログが現れ、そこに建物と、位置の記憶をさせたリンクさせないオブジェクトを展開するシステムは便利で良いなぁ、とは思ったのですがサッパリやり方が分かりませんでした。



それと、これとは関係ないのですが、奥のテクスチャーを張ったオブジェクトが、手前のオブジェクトを抜けて一番手前に見えてしまうのは避けられないものなのでしょうか?
テクスチャを張ったテーブルの上にスカルプで作った物やテクスチャを張ったコップなどを置くと消えて見えなくなってしまいます。
勿論、テーブル面が重ならない方向から見るとちゃんと見えているのですが…
これにはかなり困ってしまっています。


同じカテゴリー(スクリプト関連)の記事画像
自動チャットを止めたい
テレポートするとアニメーションが解除される
同じカテゴリー(スクリプト関連)の記事
 テクスチェンジのHUDについて (2015-07-01 04:51)
 モール用のプリムカウンターを探しています (2014-11-29 20:09)
 連続するアニメーションの処理 (2014-08-24 03:23)
 オブジェクトの上にフローティングテキストを出す。 (2014-08-22 16:46)
 チャットログの盗聴について (2014-02-03 03:43)
 椅子に座った後で位置調整できるスクリプト (2013-03-24 16:37)

Posted by まおまお  at 21:36 │Comments(9)スクリプト関連

この記事へのコメント
90度廻して戻すだけのスクリプトを貼り付けて、これを何とかしろというのは要求きつすぎますね。

答えを書く人も、ここはスクリプト自体を添削する場ではないので、さらに良くすることは望めない。

必要な関数を示してチャレンジするように質問者を促すことが良いのではないかと思います。
Posted by えーと at 2009年04月01日 07:25
>えーと さん
質問欄がスクリプトではなく、また、扉のスクリプトを張り付けたのはスクリプトの添削をして欲しかったのではないのですが(スクリプト自体がコピペなので^^;)、この問題がスクリプトなのか、オブジェクトの結合の方法なのか分からなかったからなのです。

ただ、結合のことに関しての質問を書いて「スクリプトはどうなってるの?」と言われた場合も考慮して一応張り付けたのです><

結局この問題はスクリプトだったみたいですね。
ご指摘感謝いたしますm(_ _)m


>ささぴ さん
ありがとうございました!リンク先の記述は大変参考になりました。
これを参考に扉のスクリプトを書き換えてみようと思います。

やっぱりファントムはリンクさせられないのですね…
なるほど。。。相対位置にREZするスクリプトなのですね~!

建物を建てるのが最近は楽しくなってきて、それなら売ってみようか、と思っていたのですが…なかなか建物はクリアすべき部分が多いものですね^^;

テクスチャの件も何となく原因が分かった気がします。
私は透明部分をよく使うので画像の統合をせず、レイヤーのままPNGで保存してUPしていたので、それも原因なのでしょうね…
Posted by まおまお at 2009年04月01日 18:54
■ささぴさんのコメントの(2)の補足
実はリンクされてるプリムをファントムにするテクニックがあるのです!エープリルフールのネタではないですが・・・笑

同じサイズのプリムを用意して、以下のスクリプトを子プリムに入れてみてください。子プリムをタッチするとそのプリムだけがファントムになって通り抜けできます。親プリムはそのまま通り抜けできない壁になっていると思います。


integer link_num=0;
integer flex_flag = FALSE;


default
{
state_entry()
{
link_num = llGetLinkNumber();
llSetPrimitiveParams([PRIM_FLEXIBLE, FALSE, 0, 0.0, 0.0, 0.0, 1.0, <0, 0, 0>]);
llSetPrimitiveParams([PRIM_PHANTOM, FALSE]);
}

touch_start(integer total_number)
{
if( llDetectedLinkNumber( 0 ) != link_num ) return;
if( flex_flag == FALSE ) {
llOwnerSay("FLEX:ON");
llSetPrimitiveParams([PRIM_FLEXIBLE, TRUE, 0, 0.0, 0.0, 0.0, 1.0, <0, 0, 0>]);
flex_flag = TRUE;
} else {
llOwnerSay("FLEX:OFF");
llSetPrimitiveParams([PRIM_FLEXIBLE, FALSE, 0, 0.0, 0.0, 0.0, 1.0, <0, 0, 0>]);
llSetPrimitiveParams([PRIM_PHANTOM, FALSE]);
flex_flag = FALSE;
}
}
}


■ささぴさんの(3)の部分の補足
透過テクスチャを重ねる場合の透過バグの回避方法です。
薄い壁を2枚用意して、中空95%などで中身をくり抜き、中の部分のテクスチャを100%透明にします。(ライブラリにはいってますよね)
表面のテクスチャを使用されている透過テクスチャにします。
Posted by pao at 2009年04月01日 20:14
>pao さん
なんと!そんな裏技(?)が!!
貴重な情報ありがとうございます!早速試してみます!
ありがとうございました~^^
Posted by まおまお at 2009年04月02日 17:02
テクスチャの透過バグは中抜き+透明レイヤーにして、表面のテクスチャを(透過がない場合)PNGからBMPにしたところ、ほぼ、透過バグは起きなくなりました。
これで心置きなく制作が出来ます!

あとはREZの座標指定のスクリプトです…^^;
Posted by まおまおまおまお at 2009年04月03日 02:03
今更ですが、、、
一度BMPで保存して、透明レイヤーを消したあと、PNG形式で保存しなおすと、透過レイヤーを持たない画像になると思います。

ネットワークの負荷軽減のためにも、、無駄にファイルサイズの大きな画像はやめた方がいいかと。

テクスチャの貼ってある面を選択した状態で、Ctrl+Alt+Shift+T を押すと、
Texture Infoが表示されます。

それで、
512x512 opaque on face 0
512x512 alpha on face 0
などとでますので、alphaなら、透過テクスチャー、opaqueなら、透過を持たないテクスチャーだと確認できます。


ライブラリーの利用や、256x256など、なるべく、ファイルを軽くしよう。。。
(あと、SetTextだけのスクリプトは、削除しよう。。。)
Posted by Zafira at 2009年04月14日 03:33
PNGやTGAは、見た目には透過を使ってなくても、透過情報付の画像になってる場合がありますね。
その場合にも重ね合わせでの表示バグは発生してしまいますので、保存時に注意が必要です。

Zafiraさんの指摘で気になったのですが、アップロード後にサーバーに保存されてる画像のファイルサイズというか読み込み速度が、元の画像の形式によって違うと聞いたことがありますが、実際のところどうなんでしょうか。

同じ画像サイズ(ピクセル)で中身もほぼ同じなら、ロスなしでアップできない512とか1024の画像なんかは圧縮でほとんど同じサイズになるかと思ってたんですが・・・。

まったく同じ画像をBMPとPNGとTGAで作ってアップした場合、テクスチャの表示速度や表示される品質には差が出るんですかね?
Posted by RoyalTurkey Marksetin at 2009年05月15日 04:29
paoさんの情報に補足です。

以前この記事を見たときに、子プリムだけのファントム可をいずれ自分でも使いたいと思っていて、この情報を頭の片隅においていたんですが、今回機会があったので試してみました。

しかし、最初はうまく出来ませんでした。
原因はすぐわかったのですが、子プリムがスカルプであったためです。

子プリムをボックスに変更>paoさんの記事のスクリプトを実行>子プリムをスカルプに戻す

この手順で、問題なくスカルプの子プリムのみをファントム化できました。

このスクリプトをよく読むと、ファントムを直接設定するのではなく、子プリムにフレキシの設定を与えることで、結果的にファントムになってしまうという、半分バグ技に近いような感じですね。
私が最初失敗したのも、スカルプがフレキシの設定を受け付けなかったということのようです。

また、今後ずっとこの技が使えるかどうかもちょっと怪しいですね。(おそらくは大丈夫でしょうが)
少なくとも、既にこの方法でファントム化済のものに関しては、そのままいけそうですが。
Posted by RoyalTurkey Marksetin at 2009年07月19日 19:00
かなり古い記事ですが、ちょっと補足しておきます。

上記の裏技でリンクされたオブジェクトの一部の子プリムのみをファントム化した場合、スカルプかどうかに関係なく、SIMリスタート等、何かの拍子で実体に戻ってしまっている場合があるようです。

また、オブジェクトがREZされた場合なども、実体に戻ります。

と言うより、全ての子プリムが親プリムと同じステータスにリセットされるようです。

販売用の建築物などに利用する場合、長めのタイマーで定期的にファントム化を行うなどして対処するしかなさそうです。

(できるだけ使わないほうがいいと思いますが・・・)

どのような場合に子プリムのファントム設定がリセットされるかは、まだ実験していないのでなんとも言えませんが、どなたか情報をお持ちじゃないでしょうか?
Posted by RoyalTurkey Marksetin at 2010年06月20日 01:29
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。