ソラマメブログ
QRコード
QRCODE
アクセスカウンタ
読者登録
メールアドレスを入力して登録する事で、このブログの新着エントリーをメールでお届けいたします。解除は→こちら
現在の読者数 2人
オーナーへメッセージ

2007年10月04日

llMoveToTarget の特徴

フリームーブ・タイプに欠かせない、llMoveToTarget の特性を整理しておきたい。

1.ターゲットまでの距離
 一回の移動時に設定できるターゲットまでの距離は、仕様上60mまでになっている。ただし、実際には64.99999・・・mまでは動いたとの報告がLslWikiにも出ていた。
 正確には測っていないが、初期マンタの動きを見ていると、やはり65m以下と言う所だと思う。
 では、制限距離を超えて指定した場合はどうなるか?
 これは、移動できるところまで行って、その場で停止している。暴走したりする訳では無いようだ。

 この距離はあくまで1回のllMoveToTarget で移動可能な距離で、移動先へ到達後、再度新たなターゲットを制限内の距離で指定すれば、当然そのターゲット目指して移動する。
 例えばツアーライドのような物であれば、1回のターゲット範囲を60m以内にして、次々と移動場所を設定しておく方法をとるなら、1SIM内を全て移動させる事も当然可能となる。
 今、マンタの乗り物化にも取り組んでいるが、それが完成すればツアーライドとしてもマンタを活用する事が可能となる。

 ちなみに、もう一つの移動系関数であるllSetPosの場合は、1回の移動可能距離が10mとなっている。それ以上を指定しても、制限距離まで移動して静止するようだ。
 また、llSetPosは以前にも書いたように、移動スピードの指定ができない。10m離れていても、一瞬で移動するだろう。その意味ではハチとかトンボとかの昆虫類の移動には適していると思う。しかし、海洋生物の移動には早すぎて適合しない。これが使えれば、マンタももっと楽に作成できたのだが・・・
2.移動は直線
 llMoveToTarget では移動先ターゲット座標を指定する。ターゲットの指定にはllTarget(vector position, float range)を使用する。
 positionに移動先の形式座標を指定する。rangeは・・・良く分からない。サンプルに0.5が使われていたが、とりあえず1.0を使用している。英語の意味が分からんのじゃ~。。。(>_<)
 でも問題無く動いているから、結果オーライかな?
 で、本題の移動だが、弧を描くような移動はできない。ターゲットに直進する。本当はllTargetOmegaのような、綺麗な円運動も取り入れたかった。あるターゲットまでは直進し、目標に到達したら、そこで暫く円運動をしていて、その後また何処かへ向かって行って・・・と言う感じである。それがRLのマンタに一番近い動き方だ。
 でもllMoveToTarget だけでは駄目なようだ。

3.移動スピード
 llMoveToTarget ではllMoveToTarget(vector target, float tau)と言う具合に、tauと言うパラメータがある。これがどうやら目標地点までの秒数を示すようだ。実際にtauを小さくするとスピードは速くなる。
 lslWikiによると、tauは0.2以上が良いと書いてある。マンタでは10程度を使っている。(大きさにもよる)
 では、目標までの距離と秒数から、一定速度で進むか?と言うと、それは違う。見ていると、最初はビューと言う感じで動き出すが、目標地点に近づくに連れ、速度は遅くなり、最後は微調整でもしているように、ジワジワジワと言う動きになる。
 この辺の動きも、実はマンタらしさを出すのに役立っている。実際のマンタも泳ぐときはけっこう早い。が、クリーニング・ステーションとかではホバリング状態で非常にゆっくりとした動きになる。
 最初にマンタを作っていて、「おっ!なんてリアルな動きなんだ!」と自分で感心してしまった。
 が、これは狙ったものでは無く、偶然llMoveToTargetの仕様だったのだ。

 この事から、llMoveToTargetを使用するのに向いている物と、向いていない物が出てくる。
 例えば打ち上げ花火だが、llMoveToTargetで玉を動かして、目標地点に到達したらパーティクルをパーっと出す仕掛けは可能だ。しかし、実際に動かしてみると、最初はポーンと上がるが、最後はジワジワジワと言う動きで、どうも花火らしからぬ動きになってしまう。
 この場合はllApplyImpulseを使って、玉を移動させるのでは無く、玉を放り投げる感じで打ち上げた方が雰囲気が出る。
 打ち上げ花火に関しては、以下を参照すると良いでしょう。

http://kappa.slmame.com/e11472.html

4.移動中&到達したらどうなる?
 llMoveToTargetの場合は、関連して2つのイベントが用意されている。
 ・at_target:ターゲットに到達した時に発生するイベント
 ・not_at_target :ターゲットに到達していない間発生するイベント
 マンタではnot_at_target は使っていない。途中に芸をさせる予定が無いからだ。
 lslWikiのサンプルでは、not_at_target の中でllWhisper(0, "Still going");が記述されており、到達するまで「まだ移動中!」と叫び続ける内容だった。実に煩いので即コメントアウトしてしまったが。。。
 発生するタイミングは正確には調べていないが、ある程度一定間隔で叫んでいた。物によってはこれも使えるかな?と今は考えているが、まだ使用してはいない。

 ターゲットに到着した場合だが、llStopMoveToTargetを発行しなければ、その場に止まっている。llStopMoveToTargetを発行して何もしなければ、その場で転落する。物理オブジェクトなので当然であろう。
 マンタではターゲットクリアして、llStopMoveToTarget後に即次のターゲットを指定してllMoveToTargetを発行しているから、そのまま方向転換して泳ぎ続けるだけだ。
 時たまサーバ負荷が重くて、スクリプトの実行にタイムラグが発生すると、その場でガクンと落ちる時がある。その場合もターゲットへの移動が開始されれば、徐々に高さは戻っていく。

 問題はターゲットに到達して、何か芸をさせたい場合である。これはけっこう厄介な感じだ。
 マンボウ製作では、ターゲットに到達したら、ちょっと上を向かせて泡を出させるようにしている。
 最初の構想では、その場で何回か上を向いて泡を出し、その後に再度移動するようにと考えていた。が、実際にはタイマーイベントも正確には機能しないし、スリープを入れても思うような時間停止しない。結局1回だけ上を向いて泡を出すのが、現状では精一杯だった。
 この辺も物理属性なので、何かをさせるとガクンと落ちてしまうような状況になる。あまり違う動作をここに入れるのは厳しいように感じている。
 が、まだ細かくチェックまではしていないので、今後更に試してみて、何か分かれば報告したいと思う。

 衝突イベントに関しては、移動中でも検知され有効になる。ターゲットへの移動途中でも、地面との接触イベントを入れておき、その中で方向転換とターゲットの再設定をすれば、それは有効に機能した。

 タイマーイベントに関しては、どうも良く分からない。移動開始と同時にタイマー設定して、移動途中でタイマーイベントが有効かどうか?まだ実際には試していない。
 今の感触では移動が静止状態に入らないと、有効にはならないような感触を持っている。ただ、今の設定が、移動時間の秒数よりもかなり長い時間を設定しているので、そのせいかもしれない。1秒間隔とかに設定し、タイマーイベントで何か言わせれば分かる事だ。その内試してみる。

 基本的には、llMoveToTarget は命令を発行すれば開放されるように書いてあった。従って、移動中に他のイベントが発生すれば、それは有効なのだと思うのだが・・・正確に調査はしていないので、何とも言えない。

5.SIM外に出てしまう場合はどうなる?
 SIM外=ターゲットとして有りえない座標を指定した場合になる。
 実際にSIM境界でのテスト結果では、SIMの外には出ず、境界で停止してホバリング状態になっている。
 これも先の移動距離制限を越えた時と同様の対処で、強制的に方向転換して動かす事は可能であった。
 以前書いたllEdgeOfWorldは「世界の果て」をチェックするようで、「世界の果て」に入り込んだらどうなるか?は正直分からない。ただ、以前何かの障害時とは思うのだが、SLからメッセージが送られてきて、「returned to your inventory lost and found folder」になり、その理由が「世界の果て」に入ったからのような事が書いてあった。
 世界の果てと言うのは、SLの存在し得ない世界に入ったと言う事なのかも知れない。例えばスクリプト内でメモリー領域がおかしな状態になってしまい、その結果としてスクリプトが実行不能状態になった場合とかだ。この辺も正確な意味がまだまだ把握できていない。

 マンタは以前にも書いたように、SIM内だけがターゲット対象になるように、スクリプト内で補正している。だからSIM境界でも止まるような事は無いと思う。ただ、サーバの状態とか、何らかの障害等で移動が停止する場合は有り得ると思う。

6.エネルギー切れは?
 lslWikiを見ると、
 「この機能はタウ粒子パラメタによって制御された速度でエネルギーを使用します(物が目標位置にあっても)。 これはスクリプト実行と平行して起こります。 約800キログラムの固まりでは、物はllMoveToTargetが重力に抵抗できないくらい重くなるでしょう。 その時、重力はエネルギーが補給されるレートに打ち勝つでしょう、そして、物はたぶん地面に落ちるでしょう。」
 と言う様な意味が書かれている。(翻訳ソフトなので意味がわからんが・・・)

 要はllMoveToTarget は移動によってエネルギーを消費すると言う意味なのだろう。が、実際にエネルギーが途中で切れて落ちたと言う現象は無い。
 落ちるのは、llStopMoveToTargetを発行して、間が空いてしまうような状態の時だけだ。lslWikiではllStopMoveToTargetのtauパラメータを0.0にした時も落ちると書いてあった。それ以外の場合は浮力を維持し続けるような文章もあった。

 まあ、マンタで言えば、連続的にllMoveToTargetを発行し続けているので、エネルギー切れと言う事は無いのかもしれない。
 ただ、ずっと静止状態のまま放置しておくと、エネルギー切れを起こすのかもしれない。以前1昼夜静止状態で放置した事はあったが、その時は異常は無かった。何時まで静止し続けるか?再度テストしてみる必要は有るかも知れない。

7.オブジェクトの向きは?
 移動させる場合、当然オブジェクトの向きと言うのがある。魚の場合尻尾から進まれたら困るであろう。
 最初の頃に悩んだのが、オブジェクトの正面て何処?と言う事だ。
 正直言って未だに分からない。

 現在どうしているのか?と言うとllLookAtを使ってターゲット座標の方向を向かせている。llLookAtの場合はZ座標の方向が正面となるらしい。で、またもオブジェクトの正面は何処?となる。作成時に最初に出てきたプリムのZ軸方向になるのかもしれない。
 ただ今はSculptedを使っているので、その辺も把握しづらい。一応CGソフトで作成した場合、テクスチャ化する時にはZ軸方向に正面が向くように調整して使っている。それでアップロードするとちゃんと頭から移動する。
 もう一つllRotLookAtと言う関数も有るらしい。これはX軸方向が正面になるようだ。まだ使っていないが、こっちの方が良かったかもしれない。Z軸方向だとCGソフト側では扱いづらい位置関係になるので。そのうち試してみたいとは思う。
 ちなみに両関数ともパラメータの指定方法は同じようだ。だから単純に関数を入れ替えれば試せるであろう。

というところが、今日までに分かった事項である。
物理属性の移動に関しては、まだまだ不明な点も多い。マンタを発売するにあたっても、実に2ヶ月以上もテストを繰り返して、問題が発生しないか、継続的にウォッチしてきた。それでも一部は予期せぬ状態もあったが、幸いな事に致命傷となる現象は見られていない。
今後もお客様からの問い合わせ等も含めて、新たな現象等が見えれば対処して行こうとは思っている。
何か新しいことが分かり次第、こちらでも記載していくつもりだ。

ただ正直言うと一番嫌なのは、静止状態にした際に、スクリプトで物理属性を解除できない事だ。正確には解除はできるが、一旦解除するとオブジェクトをバラしてリンクし直さないと物理属性には戻せない。そしてスクリプトでは物理属性には出来ない事だ。この欠点が解消されると、もっと色々な芸を仕込む事が可能になるのだがな・・・
なかなか物理属性を制御しきる事は難しい。。。と言うのも実感だ。 

同じカテゴリー(スクリプトのお勉強メモ)の記事画像
llDetectedTouchST
llAddToLandPassList
【注意】Bulk Permissions機能は使っては駄目!
HTTP-INを使ってみた。
オブジェクトへの指示
ペットを作るには(6)
同じカテゴリー(スクリプトのお勉強メモ)の記事
 llDetectedTouchST (2009-07-24 14:05)
 llAddToLandPassList (2009-07-24 10:23)
 【注意】Bulk Permissions機能は使っては駄目! (2009-07-21 12:15)
 HTTP-INを使ってみた。 (2009-07-19 14:51)
 オブジェクトへの指示 (2008-10-22 12:42)
 ペットを作るには(6) (2008-09-25 10:38)
この記事へのコメント
海simの土地を衝動買いしたNullpoです(((( ;゚д゚))))アワワワワ
さっそくいろいろ買わせていただきましたm( _ _)m

さて今回のおせっかいはエネルギーについてですが…

ここで言うエネルギーはいわゆる「スタミナ」の様なものだと解釈しています。
物理オブジェクトが重力に反する動きをするとスタミナを継続的に消費し、
スタミナがゼロになると息切れを起こして動けなくなり落ちる、と。

消費する一方、回復もある程度の間隔で行われています。
(具体的な回復レートは把握してません orz)
なので回復>消費ならばエネルギー切れはおきません。

エネルギーの消費は重いものを速く動かすほど増大しますので、
例にある800kgの物体になると一瞬でエネルギーを消費し、
回復が追いつかないので浮かべることはできないわけですね。

以上のことから、おそらく静止状態の方が省エネだと思われます。
というより、マンタくらいの質量/動きならば全く問題なさそうです。

私もwikiを四苦八苦して読んだものですので、
どこか間違ってる可能性はあります orz
長々とすいませんでした m(_ _)m
Posted by Nullpo at 2007年10月07日 08:53
Nullpoさ~ん。コメントいただきありがとうございます。
こうして言ってくださると、少し安心できます。
wiki良く読んでから作れ!と言われそうですが、とにかく英語は苦手なもので。。。

そして・そして、一杯購入までしていただき、まことにありがとうございました。
何処の海SIMなんでしょう?一度是非見学にお邪魔したいと思います。

それと、水草&海草セットの件もありがとうございました。Libraryにちゃんと入ってましたね。それも海草とか水草と言う事で。。。

そこで、配布は中止しました。
配布より、「ここに入ってますよ!」と言う看板でも出した方が良さそうです。

何から何まで、ありがとうございました。
Posted by Gonbe ShanGonbe Shan at 2007年10月07日 12:29
もう一つ忘れてました。

llTargetのrangeは許容誤差だと思います。
positionからrangeメートル以内に入ったらat_targetが発生します。
ならばぴったりの位置まで行かせたかったらゼロにすればいいのかというと、
rangeがゼロだとllTargetが無効になってしまうようです。

これを応用して、rangeを広くしてpositionを実際の目標より深めに設定することで、
じわじわ動きに入る前にat_targetを発生させられたりします。
Posted by Nullpo at 2007年10月09日 14:00
毎度です。

これは凄い情報をいただきました。
rangeとはそう言う意味なのですね。
なるほど・なるほど。もう感心してしまいます。

今サメとかも製作予定なんですが、その際にはマンタと違って、切れの良い動きをさせたいと思ってました。
そちらでは、上手く値を設定すれば、ジワジワ動きを防げるかもしれませんよね。
これも近々試してみます。

今はマンボウを製作中で、こいつもマンタ同様にジワジワ動きの似合う奴なんで、そこまでは今のままで行けそうです。
その後の事を考えると、対策も必要と思ってました。

本当にありがとうございます。
しかし、Nullpoさん凄いですね。一度ジックリ教えを請いたいです。

今後も宜しくお願いします。
Posted by Gonbe ShanGonbe Shan at 2007年10月09日 15:54
move関連は、とあるイベントの手伝いで勉強したばかりだったので…他のことは全然^^;
こちらのblogを知ったのも、実は物理+フレキシの実現方法を探していた時だったりします。

スクリプトは勉強すればするほど、あれもこれも出来るんじゃないか~って夢が広がって楽しいですよね。
(大抵は先人が既にかなりのレベルにまで掘り下げてたりしますが…)

こちらこそこれからもお願いします&海洋生物楽しみにしてます m(_ _)m
Posted by Nullpo at 2007年10月15日 11:08
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。