2008年03月28日
スポットライトの改造その2
昨日スポットライトに回転の動きを加えたのですが、いろいろと問題があることがわかってきました。
1)回転が途中で止まってしまう。
ずいぶんいろんな実験をしたのですが、原因は謎です。
回転速度によるわけでもありません。かぼちゃを高速回転させてみましたが、止まりませんでした。
オブジェクトの大きさでもありません。巨大かぼちゃを回転させてみましたが、止まりませんでした。
オブジェクトの数でもありません。かぼちゃを20個ほど回転させてみましたが、止まりませんでした。
オブジェクトが複雑な形をしているということでもありません。
オブジェクトが他のオブジェクトにめり込んでいるということでもありません。
どうもシンプルな回転をしているものは、止まらないようです。ただなにがシンプルで、なにがシンプルでないのか。このあたりがわかりません。
2)回転を止めたあと、命令に従わない。
今回はアバターを追いかけたり、特定の方向を向けられるスポットライトに、回転の機能を足しています。ところが回転を行ったあとに、特定の方向を向けることができなくなります。完全にできなくなるわけではないので、これがまた謎です。
おもしろいのは方向が動かなくなったライトを右クリックすると、パイメニューの中身を選ばなくても、(つまり右クリック一回だけ)あわてて眠りから覚めたように向けたはずの方向に向きます。
回転にはllTargetOmegaを使っています。方向を向けるにはllLookAtを使っています。推測ですがこの二つの命令の相性が悪いようです。
llTargetOmegaは回転しろという命令をPCに与えるだけで、その後の処理はサーバー側では追いかけていません。だからライトがどこを向いているのかサーバーは知らないのです。
その状況の中でllLookAtを使うと、どこからどこにライトを向けていいのかわからなくなります。つまり方向を向けることができません。そして人間がクリックすると(そのクリックが右1回だけクリックでも)ライトの場所がわかってあわてて方向を制御する。そういう状態を推測したのですが、正直言って謎です。
ただ面白いのは回転を止めて、もういちど回転の命令を与えると、オブジェクトの最初の位置からではなく、回転の続きを行うのです。これは目の錯覚かなぁ?
対処方法はうーん。そうですね。回転を中止するときにllResetScriptを実行してスクリプトをリセットしてみたらなんとかなるかもしれません。今度やってみましょう。このときstate_entryの中で、ライトの座標と、真上と、真下の座標を求めるのを忘れないように。これは自分へのメモ。
「回っているものは、止めてはならない」 by リンデン・ドール
追記
回転を止める処理の代わりにllRestScritpを入れました。もともとstate_entryの中にはライトの座標を覚えて、真下に向けて、オンにするスクリプトが入っています。改造は4行コメントアウトして1行入れるだけでした。リセットの動作も予想以上に軽いので、ライトの下向きストップのコマンドは削除してしまってもいいかもしれません。
しかし、回転はやっぱり止まってしまう! 謎。
1)回転が途中で止まってしまう。
ずいぶんいろんな実験をしたのですが、原因は謎です。
回転速度によるわけでもありません。かぼちゃを高速回転させてみましたが、止まりませんでした。
オブジェクトの大きさでもありません。巨大かぼちゃを回転させてみましたが、止まりませんでした。
オブジェクトの数でもありません。かぼちゃを20個ほど回転させてみましたが、止まりませんでした。
オブジェクトが複雑な形をしているということでもありません。
オブジェクトが他のオブジェクトにめり込んでいるということでもありません。
どうもシンプルな回転をしているものは、止まらないようです。ただなにがシンプルで、なにがシンプルでないのか。このあたりがわかりません。
2)回転を止めたあと、命令に従わない。
今回はアバターを追いかけたり、特定の方向を向けられるスポットライトに、回転の機能を足しています。ところが回転を行ったあとに、特定の方向を向けることができなくなります。完全にできなくなるわけではないので、これがまた謎です。
おもしろいのは方向が動かなくなったライトを右クリックすると、パイメニューの中身を選ばなくても、(つまり右クリック一回だけ)あわてて眠りから覚めたように向けたはずの方向に向きます。
回転にはllTargetOmegaを使っています。方向を向けるにはllLookAtを使っています。推測ですがこの二つの命令の相性が悪いようです。
llTargetOmegaは回転しろという命令をPCに与えるだけで、その後の処理はサーバー側では追いかけていません。だからライトがどこを向いているのかサーバーは知らないのです。
その状況の中でllLookAtを使うと、どこからどこにライトを向けていいのかわからなくなります。つまり方向を向けることができません。そして人間がクリックすると(そのクリックが右1回だけクリックでも)ライトの場所がわかってあわてて方向を制御する。そういう状態を推測したのですが、正直言って謎です。
ただ面白いのは回転を止めて、もういちど回転の命令を与えると、オブジェクトの最初の位置からではなく、回転の続きを行うのです。これは目の錯覚かなぁ?
対処方法はうーん。そうですね。回転を中止するときにllResetScriptを実行してスクリプトをリセットしてみたらなんとかなるかもしれません。今度やってみましょう。このときstate_entryの中で、ライトの座標と、真上と、真下の座標を求めるのを忘れないように。これは自分へのメモ。
「回っているものは、止めてはならない」 by リンデン・ドール
追記
回転を止める処理の代わりにllRestScritpを入れました。もともとstate_entryの中にはライトの座標を覚えて、真下に向けて、オンにするスクリプトが入っています。改造は4行コメントアウトして1行入れるだけでした。リセットの動作も予想以上に軽いので、ライトの下向きストップのコマンドは削除してしまってもいいかもしれません。
しかし、回転はやっぱり止まってしまう! 謎。
Posted by takuto at 17:34│Comments(0)
│Script / Camp Timer