2007年09月25日
llEdgeOfWorld
llMoveToTargetの移動可能範囲を超えていた件で、関連してSIM超えの関数も使えるかな?と試してみた。
現在は内部的に計算してチェックしているが、この関数の方が良いだろうか?と思ったので試してみた。
結果は全く駄目だった。まずこの関数の仕様だが、
integer llEdgeOfWorld(vector pos, vector dir)
pos:現在の位置
dir:現在地からの移動距離(vector なので、Xに10m、Yに10mと言うように<10,10,0>とかで指定)
で、SIM内ならTRUEでSIM外だったらFALSEと書いてある。(多分。。。)
が、結果は何を指定してもFALSEが返ってくる。なんじゃこりゃ?と思いつつlslWikiのサンプルも見てみた。
integer wouldGoOffWorld(vector here, vector there)
{
if (there.x < 0 || there.x > 256 || there.y < 0 || there.y > 256)
{
return llEdgeOfWorld(here, there - here);
}
else
{
return FALSE;
}
}
こんな関数の例が載っていた。これって変だと思いません?
if文の条件だけど、目的地のX座標が0以下か又256以上又はY座標が0以下又は256以上の場合、llEdgeOfWorldの結果をリターン値で返し、それ以外ならFALSEを返している。
SIMの座標は、X軸、Y軸共に0~256になっているので、判定条件自体はSIM外の座標だったら?と言う事になる。
と言う事は、本当なら条件を満たした場合はFALSEで、それ以外ならTRUEであろう。
このサンプルも実におかしい。これを実行したら、何をやってもFALSEが返ってくるに決まっている。
面白いのは、else側にも同じreturn llEdgeOfWorld(here, there - here);を書いた場合も、必ずFALSEが返ってくる。つまりllEdgeOfWorldはFALSEしか返さない関数のようだ。これってやっぱBug?
実際に今の内部チェックロジックも基本的には同じような条件で、目的地がSIM内かどうか?判定している。だからllEdgeOfWorldは使っていないのだった。
今回の結果を見る限り、llEdgeOfWorldは使えないように思える。SIM境界判定はオウンコーディングのままにしよう。
現在は内部的に計算してチェックしているが、この関数の方が良いだろうか?と思ったので試してみた。
結果は全く駄目だった。まずこの関数の仕様だが、
integer llEdgeOfWorld(vector pos, vector dir)
pos:現在の位置
dir:現在地からの移動距離(vector なので、Xに10m、Yに10mと言うように<10,10,0>とかで指定)
で、SIM内ならTRUEでSIM外だったらFALSEと書いてある。(多分。。。)
が、結果は何を指定してもFALSEが返ってくる。なんじゃこりゃ?と思いつつlslWikiのサンプルも見てみた。
integer wouldGoOffWorld(vector here, vector there)
{
if (there.x < 0 || there.x > 256 || there.y < 0 || there.y > 256)
{
return llEdgeOfWorld(here, there - here);
}
else
{
return FALSE;
}
}
こんな関数の例が載っていた。これって変だと思いません?
if文の条件だけど、目的地のX座標が0以下か又256以上又はY座標が0以下又は256以上の場合、llEdgeOfWorldの結果をリターン値で返し、それ以外ならFALSEを返している。
SIMの座標は、X軸、Y軸共に0~256になっているので、判定条件自体はSIM外の座標だったら?と言う事になる。
と言う事は、本当なら条件を満たした場合はFALSEで、それ以外ならTRUEであろう。
このサンプルも実におかしい。これを実行したら、何をやってもFALSEが返ってくるに決まっている。
面白いのは、else側にも同じreturn llEdgeOfWorld(here, there - here);を書いた場合も、必ずFALSEが返ってくる。つまりllEdgeOfWorldはFALSEしか返さない関数のようだ。これってやっぱBug?
実際に今の内部チェックロジックも基本的には同じような条件で、目的地がSIM内かどうか?判定している。だからllEdgeOfWorldは使っていないのだった。
今回の結果を見る限り、llEdgeOfWorldは使えないように思える。SIM境界判定はオウンコーディングのままにしよう。
2007年09月25日
やっぱllMoveToTargetの制限を越えていた。
マンタのSuperBigが移動可能範囲を最大にした場合に、頻繁に停止すると言う現象に関して、昨日は仕様制限内の範囲しか移動しないと書いてしまったが、実際には仕様制限を越える移動距離が発生していた。
具体的に言うと、SuperBigの移動可能範囲はMAX30m指定できるが、この場合は基準座標を中心にして、+-30mの範囲を計算する。
従って、仮にXとYが最大の+30mづつの地点になっていた場合、次の目標座標でXとYが-30mになったら、なんと!約85m移動する計算になってしまう。だからSuperBigの場合は、移動距離が60mを超えるケースが多く発生するので、頻繁に停止する現象が起きていたのだ。

で、どうするか?
一応2点間の座標の距離を求める関数がLSLにはある(llVecDist(vector v1, vector v2))ので、次のターゲット座標を求めた際に、現在地との距離を求めて、距離が60m以上になった場合は再計算する仕様も考えられる。
又は、今のまま1分間停止していたら、強制的にターゲット解除して、新たなターゲットに変更して強制移動させるのも可能だ。
もう一つは移動可能範囲を25mまでにしてしまい、先のどちらかの対処を入れておくか?であろう。
まあ、理想はこの全てを入れ込む事だと思うが・・・
理論上はBigサイズの場合も最大値が25mなので、最大移動距離は72mになるから発生する可能性はある。だから25mにしたとしても、やはり何らかの対処は入れるべきであろう。発生しないのは、lslWikiにも書いてあったが、実質的には約65mまでは移動可能な事から、計算上65m以上になるケースがほとんど発生していないためと思われる。
と言う事で、当面はSuperBigは販売停止で、ちゃんと対処してから再開したい。場合によっては永久中止かも?
それも手だな。10mサイズはやっぱ大き過ぎる。
とりあえず、下手に修正すると二次バグを生み出しそうなので、慎重にテストしてからにしたい。
あ~。。。やっぱ色々と難しいものだな。良い勉強になった・・・かも?
具体的に言うと、SuperBigの移動可能範囲はMAX30m指定できるが、この場合は基準座標を中心にして、+-30mの範囲を計算する。
従って、仮にXとYが最大の+30mづつの地点になっていた場合、次の目標座標でXとYが-30mになったら、なんと!約85m移動する計算になってしまう。だからSuperBigの場合は、移動距離が60mを超えるケースが多く発生するので、頻繁に停止する現象が起きていたのだ。

で、どうするか?
一応2点間の座標の距離を求める関数がLSLにはある(llVecDist(vector v1, vector v2))ので、次のターゲット座標を求めた際に、現在地との距離を求めて、距離が60m以上になった場合は再計算する仕様も考えられる。
又は、今のまま1分間停止していたら、強制的にターゲット解除して、新たなターゲットに変更して強制移動させるのも可能だ。
もう一つは移動可能範囲を25mまでにしてしまい、先のどちらかの対処を入れておくか?であろう。
まあ、理想はこの全てを入れ込む事だと思うが・・・
理論上はBigサイズの場合も最大値が25mなので、最大移動距離は72mになるから発生する可能性はある。だから25mにしたとしても、やはり何らかの対処は入れるべきであろう。発生しないのは、lslWikiにも書いてあったが、実質的には約65mまでは移動可能な事から、計算上65m以上になるケースがほとんど発生していないためと思われる。
と言う事で、当面はSuperBigは販売停止で、ちゃんと対処してから再開したい。場合によっては永久中止かも?
それも手だな。10mサイズはやっぱ大き過ぎる。
とりあえず、下手に修正すると二次バグを生み出しそうなので、慎重にテストしてからにしたい。
あ~。。。やっぱ色々と難しいものだな。良い勉強になった・・・かも?


