ソラマメブログ

2007年04月26日

rez!(スクリプト初級第十八回)

初級者向けに説明すべきことはもはやほとんど残っていません(^^;
もちろん、lslに関してはまだまだ膨大な機能があり、触れていない部分は多いのですが、あくまでも「初級」ということであれば、残っているのは今回扱うrezを含めて2、3の項目くらいかと思います。

ちなみに今まで一切触れてこなかった機能として、物理系のスクリプトがあります。
物理系のスクリプトとは、SL内の物理的なオブジェクトを扱うための関数群のことです。
例えば加速させたり、重力を無くしたり、コマのように回転する力を加えたりできるのですが、これらの関数についてはスクリプトの知識というよりはSL内物理学の知識が必要になってきますので、初級者向けの対象外としました。
ちなみに、乗り物(ビークル)を作成する際には物理系スクリプトが必須です。
そのうち「乗り物を作ろう」の回があるかもと期待してた方、ごめんなさい(^^;
初級者さん向けとしてはちょっと難しいかもしれません。

また、HTTPを使った外部Webサービスとのやり取りに関しても言及していません。
lslの範疇を越え、Webサービスの構築についても説明しないとわかりにくいでしょうし、そうなると初級者の方には無用な混乱を引き起こしかねないからです。

残っているlslの機能の中で、説明しておくべきかもしれないと思っているのは、rez、衝突判定、サーチ、アタッチの4つです。
今回はその中のrezについて説明したいと思います。
rezの方法

オブジェクトをワールド内に出現させることをrezと言います。
rezとはresolvedの略です。
と言っても、コレ専門用語なんで、普通の英語としては通じません。

遥か昔、遠い銀河の彼方で、TRONという映画がありました。
確か史上初のコンピューターグラフィックムービーだったと思いますが、その映画の世界で使われていた用語です。
バーチャルリアリティの分野で一般的に使われているのかどうかは知りませんが、SLは多分意図的にTRONの用語を継承しているのでしょう。

rezは誰でも普通に行っています。
インベントリからオブジェクトをワールドにドロップするのがrezです。
また、スクリプトで制御してrezを行うことも可能です。

スクリプトからオブジェクトをrezするには、llRezObject()関数を使います。

  llRezObject(string inventory, vector pos, vector vel, rotation rot, integer param);

順番に引数を見ていきましょう。

string inventory

rezするオブジェクトの名前です。
コンテンツの中に入っているオブジェクトでなければいけません。

vector pos

rezする位置です。
絶対座標での指定になります。
ただし、rezを実行するオブジェクト(呼び出し元)の位置から10m以内でなければいけません。
遥か彼方にrezしようとしてもエラーにはなりませんが、何も起きません(いっそエラーにしてくれたほうがわかりやすいのですが(^^;)。

呼び出し元オブジェクトからの相対位置にしたい場合は、
  llGetPos() + <4.0, 4.0, 0.0>
のようにします。
この例だと呼び出し元のオブジェクトからX方向に4m、Y方向に4mの位置にrezされます。

vector vel

rezしたときにオブジェクトに加える力です。
弾丸などを作る場合にはここに弾の射出速度を指定します。
ただし、このパラメータは物理オブジェクトにしか効果がありません。
今回は物理オブジェクトを扱いませんので、このパラメータにはZERO_VECTORを指定します。

rotation rot

rezしたときのオブジェクトの回転角度です。
椅子を作ったときのオマジナイで指定するのがわかりやすいでしょう。

integer param

自由に設定できる数値パラメータです。
呼び出されたオブジェクトにスクリプトがあれば、ここで指定した数値を受け取ることができます。
これについては後述します。

具体的な例を挙げておきましょう。
例えば、"Kappamaki"という名前のオブジェクトを、呼び出し元のオブジェクトの1m上方に、回転させずにrezしたい場合は、

  llRezObject("Kappamaki", llGetPos() + <0.0, 0.0, 1.0>, ZERO_VECTOR, ZERO_ROTATION, 1);

このようになります。
引数の数は多めですが、それほど難しくはないかと思います。

rezされちゃったら

と、呼び出し元のほうで使うllRezObject()関数について説明しましたが、一方、呼び出されたほうのオブジェクトはどうなっているのでしょうか。
呼び出されたほうのオブジェクトでは、rezされたときにイベントが発生します。
このイベントをon_rezイベントと言います。

  on_rez(integer param){
    // rezされたときの処理
  }

引数paramは、llRezObject()関数の最後の引数を受け取ります。
先ほどの河童巻きrezの例で言うと、

  llRezObject("Kappamaki",llGetPos() + <0.0, 0.0, 1.0>, ZERO_VECTOR, ZERO_ROTATION, 1);

最後の引数には1が指定されているので、on_rezイベントの引数には1が入ってきます。

ちなみにこのon_rezイベント、インベントリからオブジェクトをドロップしたときにも発生してくれます。
その際には引数は常に0です。

しばしば見かける使い方ですが、

  on_rez(integer param){
    llResetScript();
  }

これはオブジェクトがrezされるたびにスクリプトをリセットしたいときの書き方です。
通常、オブジェクトの中に仕込まれたスクリプトは、オブジェクトがインベントリに収納された時点で動作を停止し、rezされると停止した状態から引き続き動き出します。
ですが時として、rezするたびにスクリプトを最初から実行したい場合があり、そんなときには上記のようにon_rezイベントの中でllResetScript()関数を実行します。
llResetScript()はスクリプトをリセットする関数です。

temp rez

さてさて。
llRezObject()関数を使って、有用なスクリプトを一つ作ってみましょう。
一般にtemp rezと呼ばれる仕組みです。

SLでは土地の上に置けるprim数に制限があり、狭い土地では置きたいものも思うように置けないと悩んでいる方もいらっしゃるかと思います。
temp rezを使うと、擬似的にprim数の上限を増やすことが可能です。
あくまでも擬似的に、です。裏技的な手法ですので、いかなる場合にも有効なわけではありません。

temp rezは一時的なオブジェクトを一定時間ごとにrezし、あたかもそのオブジェクトがその場所にずっと置かれているかのように見せかけるスクリプトです。
ご存知かもしれませんが、一時的オブジェクトは1分ほどで自動的に消滅します。
ですがスクリプトを利用して1分ごとに同じ位置に一時的オブジェクトをrezすると、見た目はずっと存在しつづけているように見えるのです。
一時的オブジェクトは、土地のprimの限界数を越えてrezすることができるので(無限ではありません。一時的オブジェクトの数にも限界があります)、prim数の少ない土地でも置き物などを配置することが可能になります。

一時的オブジェクトの作り方をご存知ない方のために簡単に説明しておきましょう。、
buildツールの「オブジェクト」タブで「一時的」の項目にチェックを入れると、そのオブジェクトは一時的なオブジェクトになります。
チェックを入れたらすぐにtakeか「コピーをとる」でインベントリに保存してください。
さもないと1分後にオブジェクトが消滅します(^^;

temp rezを行うには、まず配置したいオブジェクト(置き物や家具など)を「一時的」なオブジェクトに変更します。
オブジェクトをインベントリに確保しておき、新たに「呼び出し元」となるprimを一つ作ってください。
「呼び出し元」はどんなprimでも構いませんが、見栄えをよくするためには透明テクスチャなどで見えなくしておくと良いかと思います。
「一時的」にしたオブジェクトを、「呼び出し元」のコンテンツの中に入れます。

そして以下のスクリプトを「呼び出し元」のprimに組み込みます。

default{
  state_entry(){
    llSetTimerEvent(60.0);
  }

  timer(){
    llSetTimerEvent(0.0);
    llRezObject("Kappamaki", llGetPos() + <0.0, 0.0, 0.0>, ZERO_VECTOR, llGetRot(), 0);
  }

  object_rez(key id){
    llSetTimerEvent(60.0);
  }
}

やってることはごく単純です。
60秒ごとに"Kappamaki"という名前のオブジェクトを、自分と同じ位置・同じ角度(呼び出し元と同じ位置・同じ角度)で出現させているだけです。
"Kappamaki"の部分は皆さんの一時的オブジェクトの名前に合わせて書き換えて下さいね。

object_rezイベントについては説明してませんでした。
このイベントは、「オブジェクトをrezできたとき」に発生するイベントです。
on_rezイベントと混同しがちですが、on_rezイベントが「呼び出し先」で発生するのに対し、object_rezイベントは「呼び出し元」のスクリプトで発生します。

ここではobject_rezイベントを受け取った時点でタイマーを発動しています。
すなわち、「オブジェクトをrezできたとき」から60秒後に再びllRezObject()関数が動くようにしているのです。
rezはどうしてもラグの影響で遅れることが多く、前のrezが完了していないのに次々にオブジェクトをrezする事態を避けるためにこのようにしています。

うまく「一時的」オブジェクトがrezされることを確認したら、あとはbuildツールと使ってこの「呼び出し元」のオブジェクトの位置と角度を調整し、正しい位置と角度で「一時的」オブジェクトがrezされるようにすればOKです。

なお、temp rezには欠点もあります。
出現させるオブジェクトが「一時的」である以上、そこに座ったり、「一時的」オブジェクトの中でスクリプトを動かしたりするのに無理があります。
見かけ上は同じオブジェクトが存在しているように見えても、実際には違うオブジェクトに次々に摩り替わっているということをお忘れなく。

また、ひたすらにtimerを回し続けてllRezObject()を頻繁に使うのは負荷の原因と成り得ます。
多数のprimでできている「一時的」オブジェクトを呼び出したり、temp rezをいくつも設置したりすれば、それだけサーバーには負担になるのは間違いありません。
使用の際には十分に負荷に注意し、もしもラグが激しくなったと感じるようなら撤去して様子を見たりすべきでしょう。

さらに初歩的なミスですが、くれぐれもrezされるオブジェクトを「一時的」にし忘れないようにしてください(^^;
「一時的」にしておかないと、出現したオブジェクトはいつまで経っても消えません。
にも関わらず、1分ごとに新たなオブジェクトがrezされてきますので、土地のprim数は一気に食いつぶされ、何も置けない状態になります。
前に私はこの初歩的ミスをやらかし、土地に無数の鉄人28号を出現させたことがありますw

言うまでもありませんが、人の土地や公共の場で、許可も得ずに大量のオブジェクトをrezするのはスパム行為とみなされます。
テストの際はきちんと土地のオーナーに許可を取っておくか、あるいは自分の土地など、迷惑のかからないところで試したほうが無難です。

今回のポイント

・オブジェクトをrezする:
  llRezObject(string inventory, vector pos, vector vel, rotation rot, integer param);

・rezされたときのイベント:
  on_rez(integer param){
    // rezされたときの処理
  }

・スクリプトのリセット:
  llResetScript();

・オブジェクトがrezできあたときのイベント:
  object_rez(key id){
    // rezできたときの処理
    // 引数idはrezできたオブジェクトのUUID
  }

やや駆け足な感はありますが、rezについてはこれで一通り説明しました。
llRezObject()はまるで魔法のようにオブジェクトを出現させることができるので、使い方によっては非常に表現の幅が広がります。
この記事では作りませんが、銃から発射される弾丸などもこの方法で出現させています。

では、また次回。



同じカテゴリー(初級スクリプト)の記事画像
衝突判定(スクリプト初級第二十三回)
カメラ制御(スクリプト初級第二十二回)
センサーを使おう(スクリプト初級第二十回)
HUDを作ろう(スクリプト初級第十六回)
prim間通信(スクリプト初級第十五回)
アニメさせよう(スクリプト初級第十三回)
同じカテゴリー(初級スクリプト)の記事
 衝突判定(スクリプト初級第二十三回) (2007-05-08 12:15)
 カメラ制御(スクリプト初級第二十二回) (2007-05-07 14:36)
 デモ商品を作ろう(スクリプト初級第二十一回) (2007-05-02 12:15)
 センサーを使おう(スクリプト初級第二十回) (2007-05-01 12:15)
 ステートのこと(スクリプト初級第十九回) (2007-04-27 12:15)
 音を鳴らそう(スクリプト初級第十七回) (2007-04-25 13:35)
この記事へのトラックバック
この間リリースしたばかりのクリスマスツリー記事にも書きましたが、ライトの数だけプリム数が増えていくので、20プリムぐらいがまあ限度かなーということでライト数は、12個でし...
クリスマスツリーをバージョンアップしちゃいました^^【jinkoさんSL日記】at 2007年11月11日 09:31
この記事へのコメント
rez の起源ですが、ログイン時に出る tips で TRON が元ネタだと出てきたことがありました。
Posted by Tak Nishi at 2007年04月26日 14:29
Mizさん,おつかれさまです。

実は以前「tempRezされたものについては土地のPrim制限にはひっかからない」ということだったらしいのですが,そのことを「悪用(笑)」する人が増えたために「現在は制限にひっかかるようになっている」とどこかで読んだ覚えがあるのです。で,私は店舗でサンプルをtempRezするようにしてるのですが,実際さっき試したところAboutLandのObject数はtempRezしても変化がありませんでした(上限にひっかかってない?)一番いいのは上限ギリギリの土地で上限超えてtempRezできるか試すことだとは思うのですが。

このあたり,Mizさんもお聞きになったことありますか?
Posted by のてす at 2007年04月26日 16:58
>Tak Nishiさん

そうですね、やはり元ネタはTRONなんでしょうね。

>のてすさん

確かにtemp rezの制限についてはいろいろと憶測が混じっている部分もあります。
記事に書いちゃった以上、ちゃんと検証はすべきかもしれません(^^;
私が前に試したときは、temp rezしたときに土地のobject数はきっちりカウントされていたようでした。
今度実験してみますね。
Posted by Miz at 2007年04月27日 09:30
はじめまして
SL誕生2週間ちょっとの Jvn Writer と申します。
スクリプター志望です。
いつもmizさんの記事を参考にさせていただいています

質問させてください。
Flip の応用版で、文字を泡にいれて
ひとつずつ射出したいと思っています。
(llSetText でうまいことやるつもりです)
射出といってもふわりと出したいのですが。

on_rez を使って泡を生成した場合
ひとつひとつの泡に文字を設定しなければいけないと思うのですが
文字を渡すうまい方法があるでしょうか?
リッスンの方法は、オブジェクトが増えるので負荷の観点からよくないように思います。

on_rez するオブジェクトを親オブジェクトにリンクさせるとか。。?
可能なんでしょうか(^^;
Posted by Jvn Writer at 2007年07月05日 12:57
>Jvn Writerさん

現実的なのはやはりリッスンだと思います。
rez時に文字列の設定をして、以降文字列を変えることがないのであれば、一時的にリッスンをONにして文字列を聞き取り、設定後はllListenRemoveしてやるようにすれは負荷は多少軽減できるかと思います。
負荷という観点から言うなら、リッスンよりもrezを多用する負荷のほうが高そうです。

>on_rez するオブジェクトを親オブジェクトにリンクさせる

アタッチメントだとリンクをいじることができないので、これは無理ですね。
Posted by Miz at 2007年07月05日 14:28
迅速なお返事ありがとうございます
しかもご丁寧に
感激です

やはり負荷がかかってしまいますね
スクリプトの練習のためだけに作って
実用は控えるようにします

アドバイスありがとうございました
Posted by Jvn Writer at 2007年07月05日 21:48
おつかれさまですー
いつも拝見させてもらってますー

ついていけたり、ついていけなかったりの日々ですが。。。^^;


ひとつ質問です。

on_rezでオブジェクトにスクリプトでアニメを入れているのですが、
そのオブジェクトを保持したまま、他のアニメが入ってしまうと止まってしまいます。
ずっと、もしくは、後から入ったアニメ終了後に、またアニメを再生させたいのですが、どのようにすればよいのでしょうか。

たとえば、あおぐアニメの入ったうちわを右手にもち、座るアニメが入った椅子に座ると、座ったときにアニメがとまり、立っても復活しません。

よろしければご教授いただけると嬉しいです。

では、ひきつづきガンバってくださいませ^^
Posted by Motty at 2007年07月08日 06:07
>Mottyさん

アニメーションには優先順位があって、優先順位の高いアニメーションが再生されると、それまで再生されていた優先順位の低いアニメーションは「裏に」隠れてしまいます。

通常であれば優先順位の高いアニメーションが終了すれば、裏に隠れていた優先順位の低いアニメーションが復活するのですが、復活しないということは、例えば椅子のスクリプト内で「実行中のアニメーションを全部止める」ような処理が行われているのだと思われます。

優先順位の高いアニメーションが終了したかどうかを判定する方法はありませんが、例えばタイマーイベントを使って、定期的に「うちわのアニメ」が実行されているかどうかをチェックし、実行されていなければ再実行するようにしてやることはできます。

timer(){
key uchiwa_uuid = llGetInventoryKey("uchiwa anime");
list animations = llGetAnimationList(avatar);
if (llListFindList(animations, [uchiwa_uuid]) == -1){
llStartAnimation("uchiwa anime");
}
}

llGetInventoryKey("uchiwa anime")・・・"uchiwa_anime"という名前のアニメーションのUUIDを取得
llGetAnimationList(avatar)・・・avatar(key型変数)が実行中の全アニメーションのUUIDを取得
llListFindList(animations, [uchiwa_uuid]) ・・・全アニメーションのUUID内に"uchiwa_anime"のUUIDがあるかどうかチェック
Posted by Miz at 2007年07月09日 12:13
早速のご連絡ありがとうございますー。

そうですねー、椅子に仕組まれていることは考えたのですが、
オーナーの違う椅子に修正をもとめることはできず悩んでました^^:

そうですね、タイマー、
言われれば、あー、ってな感じですが、思いつかず^^;

ありがとうございました。早速やってみます^-^

では、またブログの更新楽しみにしてまーす。
Posted by Motty at 2007年07月09日 19:21
コメントは初めてですが、いつも拝見させていただいております。

TempRezに関してなんですがリンクさせた複数のPrimからなるオブジェクトで
そのオブジェクト内に回転軸が0以外のPrimがあると、その部分(Prim)のみ
回転軸0座標にもどってRezされるんですがこれは仕様でしょうか?


4か月ほど前に同じくTempRezで作った時は複数のPrimからなるオブジェクトで
うちいくつかのPrimの回転軸変更していても問題なくRezされてました。

スクリプトはいじってません。

LSLの仕様が変更されたんでしょうか

ご存知ですか?
Posted by 3mas at 2007年09月04日 08:49
>3masさん

初耳です。
しかし、一部のprimの回転が狂うというのは、ラグがひどいときに起こるプリム・ドリフトに似ている気もします。

その現象はどんなオブジェクトでも起こりますか?

仕様が変わるというのは無さそうな気がしますが(暴動が起きそうですw)、念のため今夜にでも試してみます。
Posted by MizMiz at 2007年09月04日 09:05
ありがとうございます。

以前ソファーセット(54Prim)をtemp rezで作った際は
リンクされたPrimの中に回転軸のずれている(背もたれ部分の斜めなど)Primがあっても
問題なくRezされました。

ちなみにそのソファーセットは今でも正常にRezされます。

現在建築物を作っているのですが、まず10分の1サイズで作り、すべてをリンクさせてから
拡大させて臨時設定にして持ち物にTakeし、Rezzerに仕込んでます。

その建築物は階段(45度回転)や窓の枠(中空90度回転)などで回転軸をいじったものもあり
それらがRezされた時に軸がすべて0になってしまっています。

って書きながら原因がわかりました・・・・・orz


原因はリンクですね。

通常大きなサイズの建築物などをすべてリンクすることは
Prim間の距離等の問題からかすべてのリンクは出来ないですよね、

なので自分はミニチュアを作りそれを拡大して対応しているんですが
今回その建築物をRezzerに仕込みRezさせている状態です。
ですがRezされたオブジェクトはリンクが外れてしまっています。

リンクした状態でRezされた場合は親Primの回転軸が基礎になってるので
一部分のみ軸が戻ってしまうようなことはないんですが
Rezの際にリンクが外れてしまっていると全てのPrimが軸0でRezされるんですね。(スクリプトで指定しているため)

リンクされたミニチュアから拡大してもリンクはされたままですが
拡大した建築オブジェクトをインベントリにいれてRezするとリンクは外れています。

同じようにRezzerのコンテンツに入れてRezされた建築オブジェクトも
リンクが外れてしまっており単品として処理されるため
スクリプトで指定している軸0の状態でRezされているってことだと思います。

ソファーなどは普通にリンク出来る小さいものなためこういった現象が起きないってことですね。。。。。


要はRezするオブジェクトが普通にリンク出来るサイズなら問題ないけど
通常でリンク出来ないサイズのオブジェクトの場合リンクが外れてRezされるってことですね。。


すんません、、自己解決しました。。。。orz
Posted by 3mas(長くなっちゃいました) at 2007年09月04日 09:36
>3masさん

なるほど、詳細なコメントありがとうございます。

>要はRezするオブジェクトが普通にリンク出来るサイズなら問題ないけど
>通常でリンク出来ないサイズのオブジェクトの場合リンクが外れてRezされるってことですね。。

これは知りませんでした。
注意しないとはまりそうな落とし穴ですね。
Posted by MizMiz at 2007年09月04日 10:22
近々知人のSIMオーナーのご厚意で、
TempRezを使用した際のSIMにかかる負荷の計測と
土地の通常状態のPrim制限とTempPrimの制限の関係性なんかを
調べれるかもしれないので調査結果が出たらまた報告します。

あと、別の検証結果なのですが

TempPrimは通常土地情報のPrim制限にカウントされませんが
TempPrimに座ったりした場合座ったオブジェクトのPrim数はカウントされます。

なので椅子やソファーなどでTempRezを使用した場合、座ってる間はカウントされてしまうため土地Prim数ギリなんかの場合痛い目を見ることがあります。

ここで自分が使用する方法なんですが、椅子にポーズボールやSitスクリプトは使用せず逆に座れないスクリプト(UnSit)を仕込みます。

で、椅子本体とは別にポーズボールを通常Primで用意、配置します。

これで椅子本体には座れずにポーズボールにしか座れませんのでカウントの問題は回避されます。

また、人により面白がって家具やテーブルに座る人もいたりしますが
それらの家具やなんかにもUnSitのスクリプトを仕込んでおきます。

UnSitスクリプトはMizさんのこのページの
スクリプト小技⇒鍵をかける⇒サトルさんのコメント にある
「オーナーしか座れないイス」をいじって誰も座れないように作りなおしました。

これで100Prim近いリンクされたTempオブジェクトに間違って座られそうになっても
制限オーバーなんかの危険を回避することができます。

またほかにもわかることがあったら報告したいと思いますm(_ _)m
Posted by 3mas at 2007年09月08日 05:41
毎度毎度もうしわけありません。

TempPrimRezzerによるSIMに対する負荷調査なんですが
なにか有効な調査方法、負荷確認方法などはご存じないでしょうか?

スクリプトのみの負荷だけではなく臨時オブジェクトのRezによる全体的な負荷も気になるので何か確認方法等ご存知でしたら教えていただきたいです。

よろしくです
Posted by 3mas at 2007年09月10日 00:56
>3masさん

クライアントの上部メニュー「view(表示?)」>「show statistical bar(統計バーの表示)」を選ぶと、SIMの負荷状態をモニタするウインドウが開くので、それを使ってはいかがでしょう?

メニューの名称はうろ覚えですので正確ではないかもしれません(^^;
Posted by MizMiz at 2007年09月10日 11:23
初めまして。ベンダーの記事に誘われてこのブログにたどり着いた
SL歴3ヶ月足らずの者です。

ベンダー製作に関して質問なのですが、Rezを使用してベンダーを
作れないものでしょうか?

Rez元箱の中に商品の箱をつめておいて、元箱をタッチするごとに
商品の箱をRezしたいのです。購入者はその商品の箱を右クリック>Buy
すればいいので、こちらがお金の処理を気にせずに済みますから。

で、Rezについては記事を読めばできるのですが・・・
問題は、元箱をタッチした際に前にRezされていた箱を消して、
次の箱を出す方法なのです。コンテンツから物を出す方法があるのですから
物を消す・または引っ込める方法もあると思うのですが・・・見当たりません。
Posted by Nishi Aki at 2007年09月18日 00:03
>Nishi Akiさん

残念ながら、直接的にRez後のオブジェクトを消去する方法はありません。

対策としてはいくつか考えられますが、一番簡単な方法は、Rezする箱を「一時的オブジェクト」に設定しておいて、自動的に消滅するようにする方法です。
しかしながら、消滅するまで1分かかりますので、複数の購入者がその間にベンダー本体から箱をRezすると、ベンダー前に大量の箱が出現する事態にはなり、どれが自分の購入しようとしている商品なのかわからなくなるということも考えられます。

より厳密にやるのであれば、Email機能を使って以下のように処理することもできます。
(1)箱をRezすると本体側でobject_rezイベントが発生し、箱のUUIDがわかる
(2)別の箱がRezされたタイミングで前の箱のUUID宛てにEmailを送信
(3)箱はEmailを受信したらllDieで自殺(=消滅)

Rezする場所を、購入者の足元(llDetectedPosを使うとタッチした人の位置を取得可能です)にするなどすれば、自分が呼び出した箱を見失いにくくなりますので、一時オブジェクトを利用した方法でも実用は可能かもしれません。
Posted by MizMiz at 2007年09月18日 10:21
>Nishi Akiさん

追記です。
あえて書きませんでしたが、listenを使っても実現できます。
Emailは遅いので、listenを使ったほうが素早く除去はできるはずです。

(1)箱はRezされたらlisten開始
(2)本体側で次の箱を呼び出す前にllWhisperやllSayでコマンドを発言
(3)コマンドを聞いた箱はllDieで自殺
(4)次の箱をRezする

どんな方法をとるにしても、箱が放置されたままになる可能性がありますので、一時オブジェクトにするか、一定時間で自殺コマンドを発行する必要はあるかと思います。
Posted by MizMiz at 2007年09月18日 13:47
Mizさま、回答ありがとうございます。

そうですか・・・直接的な方法はないのですね。
UnRezなんてあったらいいのに。

仰られた方法を含めて含め、いろいろ試してみます。
Posted by Nishi Aki at 2007年09月18日 19:29
遅くなりました。

TempRez検証結果報告です。

基本的にはSIMに対する負荷はRezのタイミングに関係するようです。

複数をRezする場合などは数秒ずらして(Sleepなどで)Rezすることにより
負荷軽減することができるみたいです。

同タイミングで数百Primの臨時オブジェクトをRezすると結構な負荷がかかるみたいなので注意が必要みたいです。

また、土地に対する臨時Prim制限ですが
土地のPrim制限の倍+αくらいです。

制限以上出すと古い臨時Primから削除されていきます。

オープン前の空きSIMでSIMオーナーの立ち会いのもと確認を取った時は
10000オーバーの臨時PrimをRezできました。

ただ、それ以上はPrim数の確認等クライアント側で処理しきれないため
SIM全体での臨時Prim制限は確認取れませんでした。

検証は64Primの臨時オブジェクトを0.5秒ごとに位置をずらしてRezする
といった方法で確認したため、区画の制限は64の倍数でしか確認取れませんでした。


結果

TempRezはRezのタイミングをずらすことで負荷軽減は可能
(ただ、使用する方がSIM負荷などを考えて使ってくれるかは微妙)

土地区画の臨時Prim制限はPrim制限の倍+数十


こんな感じでした。


TempRezに関してはもっと細かくまとめて日記等にしようとも思いましたが
結構もろ刃の剣なのでやめておきます。

また何かあれば報告します^^
Posted by 3mas at 2007年09月24日 05:47
>3masさん

おお、これは素晴らしい情報ですね(^^
調査お疲れさまです。とても参考になります。

確かに大量のオブジェクトを同時にrezするのはとても重そうですが、時間差つけることでそれなりに負荷回避できるということですね。

制限数が倍というのはすごいなぁ(^^;;
現実問題として、そこまでtemp化するとrezが大変そうですが、リミットが具体的にわかったというのは大収穫ですねぇ~。

ありがとうございました。
Posted by MizMiz at 2007年09月25日 11:35
TempRezを使ったベンダーはlistenとノートカードを使って上手く出来ました。
有難うございます。

さて、TempRezのリミット数ですが、LSL Wikiに具体的な数字が出ています。
http://rpgstats.com/wiki/index.php?title=TemporaryOnRez

The formula is currently "temp_prim_limit = 0.5 * regular_prim_limit + 20", or 500 temp-on-rez prims, whichever is smaller.

「0.5×土地のプリムリミット+20」
または
「500プリム」のどちらかで少ない方がリミットになるとのことです。
Posted by Nishi Aki at 2007年10月09日 23:22
>Nishi Akiさん

おお、そんな情報が。
どちらか少ないほうということは、
土地の制限数が960以上の場合は500、
960未満の場合は500以下になるということですね・・・。

となると3masさんが検証なさっている10000という数字は一体(^^;

LSL Wikiには続けて
"the limit may be tweaked in later versions."
(バージョンアップで限界値は引き伸ばされるかもしんない)
という記述もありましたので、現時点でのリミットは増加している可能性もありますね。

・・・tweakedの訳があってれば、ですがw(^^;
Posted by MizMiz at 2007年10月10日 10:47
いつも参考にしています。llmove to target の関数で分からない事があったのでお聞きします。
例えば目標を坂道を滑り落ちる板にしてそれを追わせたいのですがうまくいきません。アバターでは成功してるのですがそれ以外にはついてこないのでしょうか?
Posted by kuwatto at 2007年10月13日 13:56
>kuwattoさん

llMoveToTargetの目標はあくまでも座標ですので、その座標がアバターなのかオブジェクトなのか、はたまた何もない空間なのかは問いません。
ですのでアバターでしか使えないようなことはありません。

具体的にコードを見れば的確なアドバイスはできるかもしれませんが、うまく動かない原因として考えられそうなのは、

1、エネルギー不足
 llMoveToTargetで動くオブジェクトが物理の場合、エネルギーが足りなくなって動かなくなることがあります。
 エネルギーは時間で回復します。

2、移動目標が遠すぎる、またはtauが小さすぎる
 目標までの距離が60m以上あったり、tau(目標到達までの秒数)が極端に小さい(0.0001とか)と、うまく移動できないことがあるようです。

一般的な話として、上記2つはありえます。
Posted by MizMiz at 2007年10月15日 13:32
いつもいつもこのブログに大変お世話になっています。
今回、temp rezの手法のおかげで、
イメージどおりのものが作れました。

3masさんの詳細なレポートも本当に助かりました。

簡単ですがお礼まで。
Posted by jinkojinko at 2007年11月11日 09:31
I believe this really is excellent information. Most of men and women will concur with you and I ought to thank you about it 感謝
Posted by Rosetta Stone Spanish at 2011年08月26日 18:22
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。