2009年08月11日
位置判定っす
お題はコレっす。
問題整理とかのために、図を作ってみたっす。
どうもぺんぎんっす( ◎v◎ )
簡単のために、赤い板をY軸周りにθだけ回転させた場合を考えるっす。
図はY=(赤い板の中心のY座標)でスパッと切った図っす。
O,P,Qはそれぞれボックスの中心を表してるっす。
ABが判定の有効範囲っす。
OK範囲がどこなのかによって、条件式は変わるっすね。
パターン1.AEFGで囲まれた部分
パターン2.ABCDで囲まれた部分
パターン3.ABCGで囲まれた部分
(実際には立体になってるっす。雰囲気っす)
1.から3.に向かって面倒くさくなる予感っす。
ここではパターン1.の範囲でやるっす。
ZERO_ROTATIONで、ある大きさの箱に入ってるかどうかの判別は、
X,Y,Zそれぞれで最小、最大と比較すれば良いっすね。
(x > X_MIN && x < X_MAX)
&& (y > Y_MIN && y < Y_MAX)
&& (z >Z_MIN && z <Z_MAX)
トドメはコレを使いたいわけっす。
回転前のQの中心をRとすると、
OQ = OR * (Y軸周りにθ回転)
という関係にあるっす。拡張して
OQ = OR * llGetRot() // 赤い板でGetRot
としても成り立ってるっす。
Oを中心に回したとして考えてるっすから、Oは回転の前後で動かないっす。
・・・一旦は書いたものの、本文が凄まじいことになったので、
説明は略するっす。
要するに以下略ってことっす。
自分の考えた方法っす。
STEP1.逆回転
「ボール」をOを中心に「赤い板のllGetRotの逆」回転させるっす。
(ボールの位置 - llGetPos) / llGetRot + llGetPos
STEP2.判定
STEP1.で求めた座標が、
<X範囲/2, 0, 0> + llGetPos // Rの座標
+ <±X範囲/2, ±Y範囲/2, ±Z範囲/2>
+ <赤い板のXサイズ/2, 0, 0,> // 厳密には必要っすね
(複合任意)で囲まれた範囲にあるかどうかを判定するっす。
<X範囲, Y範囲, Z範囲>は「半透明の箱」のサイズのことっす。
イメージとしては、全世界をOを中心に回した感じっす。
判定はZERO_ROTAION回転の箱に直してトドメっす。
問題整理とかのために、図を作ってみたっす。
どうもぺんぎんっす( ◎v◎ )
簡単のために、赤い板をY軸周りにθだけ回転させた場合を考えるっす。
図はY=(赤い板の中心のY座標)でスパッと切った図っす。
O,P,Qはそれぞれボックスの中心を表してるっす。
ABが判定の有効範囲っす。
OK範囲がどこなのかによって、条件式は変わるっすね。
パターン1.AEFGで囲まれた部分
パターン2.ABCDで囲まれた部分
パターン3.ABCGで囲まれた部分
(実際には立体になってるっす。雰囲気っす)
1.から3.に向かって面倒くさくなる予感っす。
ここではパターン1.の範囲でやるっす。
ZERO_ROTATIONで、ある大きさの箱に入ってるかどうかの判別は、
X,Y,Zそれぞれで最小、最大と比較すれば良いっすね。
(x > X_MIN && x < X_MAX)
&& (y > Y_MIN && y < Y_MAX)
&& (z >Z_MIN && z <Z_MAX)
トドメはコレを使いたいわけっす。
回転前のQの中心をRとすると、
OQ = OR * (Y軸周りにθ回転)
という関係にあるっす。拡張して
OQ = OR * llGetRot() // 赤い板でGetRot
としても成り立ってるっす。
Oを中心に回したとして考えてるっすから、Oは回転の前後で動かないっす。
・・・一旦は書いたものの、本文が凄まじいことになったので、
説明は略するっす。
要するに以下略ってことっす。
自分の考えた方法っす。
STEP1.逆回転
「ボール」をOを中心に「赤い板のllGetRotの逆」回転させるっす。
(ボールの位置 - llGetPos) / llGetRot + llGetPos
STEP2.判定
STEP1.で求めた座標が、
<X範囲/2, 0, 0> + llGetPos // Rの座標
+ <±X範囲/2, ±Y範囲/2, ±Z範囲/2>
+ <赤い板のXサイズ/2, 0, 0,> // 厳密には必要っすね
(複合任意)で囲まれた範囲にあるかどうかを判定するっす。
<X範囲, Y範囲, Z範囲>は「半透明の箱」のサイズのことっす。
イメージとしては、全世界をOを中心に回した感じっす。
判定はZERO_ROTAION回転の箱に直してトドメっす。
「半透明の箱」と「赤い板」の回転が同じことを利用してるっす。
異なっている場合でも変形に変形を重ねれば、
同じ形に帰着できると思うっす。
あと、X軸じゃなくて、最初にY軸を向いている場合もあるっすね。
えーっと・・・頑張ってくださいっす!
異なっている場合でも変形に変形を重ねれば、
同じ形に帰着できると思うっす。
あと、X軸じゃなくて、最初にY軸を向いている場合もあるっすね。
えーっと・・・頑張ってくださいっす!
Posted by ぺんぎん at 22:39│Comments(2)
│スクリプト
この記事へのコメント
私もいろいろぐねぐねしてみましたが
やっぱり逆回転しか無理みたいですのう
やっぱり逆回転しか無理みたいですのう
Posted by you Xiao at 2009年08月12日 06:41
「逆回転」じゃなくて、板の中心座標を原点とする「ローカル座標」で判定するということですよね。
やることは同じですがw
やることは同じですがw
Posted by Hidenori Glushenko at 2009年08月12日 12:13