トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     事前にオブジェクト同士の衝突を判定
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
monoq
Åê¹ÆNo.32948
投稿日時: 2007-4-16 11:11
新米
居住地:
投稿: 13
使用環境:
Flash MX2004 10.4
事前にオブジェクト同士の衝突を判定
みなさま、いつもお世話になります。


現在、動いているオブジェクト同士の接触判定を作っています。

悩んでいるのが、衝突判定をリアルタイムではなくオブジェクトを動かす前に
衝突するかしないかを検知したいのですが、うまい方法が思いつきません。

始めは、両方の始点と終点の線分(軌跡)が交差するかしないかで考えていましたが、
「点」の接触しか検知できないため、二つの線分が平行の時に、オブジェクト
自体(例えば200pxの円)は重なってみえても、線分が交差していないから接触
していないという残念な感じになってしまっています。

先ほど思いついたのが、以下の(3)の方法ですが数学が得意ではないので、
この先をどうやってスクリプトに落とし込めば良いかと悩んでおります。
(本当に数学が必要なのかどうかは、分かりませんが。。)



仮に3つのオブジェクト(AとBとC)があるとします。

【条件】
・A、B、Cは3秒後に目的地に到達
・常に衝突検知の対象となるのはA。(BとCが当たりにいく感じ)
・BとCの衝突検知は必要ない


【やりたい事】
・Aに対してBまたはCは衝突するのかを検知
・a衝突する場合、何秒後に衝突するのかを調べたい


【現状と思いついた案】
(済)と書いてあるモノは解決しています

1) オブジェクトがどこに移動するかをxmouse/ymouseでクリックした場所(目的地)に指定 (済)
  (始点と終点の確保)


2) 簡易交差判定で線分同士が交差しているかを走査 <font color=red">(済)
  (こちらのHPを参考にしました→ http://snipurl.com/1d193)


3) <B>対象Aの軌跡を矩形と見なし、そことBの線分と交差しているかを判定→交点の算出</B>
  (これまではAとBの線分(軌跡)から連立方程式で交点を算出していました)


4) 3秒後に到達する終点までの距離から、交点にたどり着く時間を算出 (済)


イメージ図→ http://www.monoq.net/image.gif




この(3)の矩形と線分の交差の判定の方法をご教授いただけると助かります。
若しくは全く別に、良い方法があればそちらも教えていただける幸いです。


以上、よろしくお願いいたします。


【環境】
Flash8/MacOS X(10.4)
あにぃ
Åê¹ÆNo.32950
投稿日時: 2007-4-16 16:59
職人
居住地: 北海道
投稿: 250
使用環境:
Flash8
FlashCS3
WinXP
FlashLite1.1 / 2.0
Re: 事前にオブジェクト同士の衝突を判定
初心者的考え方かもしれませんが、ひとつ思いついたので、一応書いておきます。

A,B,Cの上に同形の透明MCを配置し、
透明MCをうごかす

Aの透明MCと当り判定を行う

あたっていなければ、A,B,Cを動かす

あたっていれば、透明MCを元に戻す。

というのはだめなのでしょうか?
monoq
Åê¹ÆNo.32952
投稿日時: 2007-4-16 17:18
新米
居住地:
投稿: 13
使用環境:
Flash MX2004 10.4
Re: 事前にオブジェクト同士の衝突を判定
あにぃさん、レスありがとうございます!

透明MC:A',B',C'みたいなのを生成して、一度リアルタイムで
衝突の検知をするという事でしょうか?

この場合、仮に今設定している「3秒で到達」という事がありまして
3秒間シミュレートしなくてはならないのが、難です。

後付けで大変申し訳ないのですが、これが10秒や20秒だと
とてつもないタイムロスになるので、できれば方程式などを
使った方法で、交差を検出したいというのが現状です。
あにぃ
Åê¹ÆNo.32953
投稿日時: 2007-4-16 17:22
職人
居住地: 北海道
投稿: 250
使用環境:
Flash8
FlashCS3
WinXP
FlashLite1.1 / 2.0
Re: 事前にオブジェクト同士の衝突を判定
MCの形が両方円だとすれば可能かもしれませんが、
その形によって、変わりますからね。


引用:

monoqさんは書きました:
とてつもないタイムロスになるので、できれば方程式などを
使った方法で、交差を検出したいというのが現状です。

>このような形であれば、ここに書くのはどうかとおもいますよ。
flashの内容ではありませんから。
monoq
Åê¹ÆNo.32955
投稿日時: 2007-4-16 19:33
新米
居住地:
投稿: 13
使用環境:
Flash MX2004 10.4
Re: 事前にオブジェクト同士の衝突を判定
あにぃさん

引用:

あにぃさんは書きました:
>このような形であれば、ここに書くのはどうかとおもいますよ。
flashの内容ではありませんから。


すいません、場違いかとも思って気が引けておりましたが、
やはりそうでしたね。

Flashならではの何か良い解決方法があればと思って藁をもつかむ思いでした。


マナー違反かもしれませんが、この質問に適したフォーラムを探しております。
(お勧めがあれば教えていただけると幸いです)

とりあえず、結果が出た際にはご報告したいと思います。


それまで、とりあえずこのトピックスを残させてください。
(別の方が何かアドバイスをご用意して、下さっているかもしれませんので)


貴重なお時間を割いていただき、ありがとうございました。
野中文雄
Åê¹ÆNo.32963
投稿日時: 2007-4-16 22:27
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 事前にオブジェクト同士の衝突を判定
Aの軌跡の式がわかっているのでしたら、Aの半径の分だけy切片をプラスマイナスすれば、幅を見込んだ上下の式が求められるのではありませんか?

参考:「直線の式
引用:
monoqさんは書きました:
3) 対象Aの軌跡を矩形と見なし、そことBの線分と交差しているかを判定→交点の算出
  (これまではAとBの線分(軌跡)から連立方程式で交点を算出していました)
...[中略]...
イメージ図→ http://www.monoq.net/image.gif


----------------
 

monoq
Åê¹ÆNo.32968
投稿日時: 2007-4-17 11:51
新米
居住地:
投稿: 13
使用環境:
Flash MX2004 10.4
Re: 事前にオブジェクト同士の衝突を判定
野中さん、ありがとうございます。

教えていただいて、ハッとしました。
確かにその通りですね。


但し、これは線分(を中心とした線の矩形)の傾きを考慮しない場合ですよね?
傾きを考えた場合、

1)線分Aを直交する方程式「A'」を算出

2)線分Aを中心とした(任意の半径Rの)円とA'との交点e(ex,ey)とf(fx, fy)を求める

3)傾きはAと同じなので、交点e/fからそれぞれのy切片を求める

といった感じでしょうか。



昨日、衝突判定や「矩形と線分の交差」などずっと検索していましたが、
なるほどなと思ったのが『矩形の対角線と線分の交差』というのを見つけました。

厳密な交差とは言えませんが、それもアリかなと思いました。


話が少しずれてしまいましたが、これで進展を迎えられそうです。
ありがとうございました。
nabe_1234
Åê¹ÆNo.33069
投稿日時: 2007-4-20 8:11
新米
居住地:
投稿: 21
使用環境:
Windows Vista Home Premium SP1,Flash CS3
Re: 事前にオブジェクト同士の衝突を判定
点の等速直線運動を考える。
点Aの時刻t=0における位置をA0、
t=1における位置をA1とする。

点Aの時刻tにおける位置A(t)は、
A(t) = A0 * t + A1 * (1 - t)で表せる。

2つの円の直線運動を考える。
円Aの半径をAr、時刻tにおける円の中心の位置をA(t)とする。
円Bについても同様にBr、B(t)とする。

ここで、ある時刻t=Tにおいて、
条件「A(t)とB(t)の距離≦Ar+Br」が成立するなら、
この時、2つの円は接触している。

ちゃんと確認してないけど、
条件式の両辺を自乗すれば、
tの2次式になるのでは?

場合分けは必要だろうけど
(例:元々t=0時点で条件式が成立している。)
1)tの2次方程式が実数解を持つか?
2)その解は0?1の間か?
みたいになるのでは?
monoq
Åê¹ÆNo.33110
投稿日時: 2007-4-23 17:39
新米
居住地:
投稿: 13
使用環境:
Flash MX2004 10.4
Re: 事前にオブジェクト同士の衝突を判定
nabe_1234さん、レスありがとうございます。
Flash-JPを覗く暇がなくて、返信遅くなりましてすみません。


引用:
nabe_1234さんは書きました:

ここで、ある時刻t=Tにおいて、
条件「A(t)とB(t)の距離≦Ar+Br」が成立するなら、
この時、2つの円は接触している。



なるほどです!
2点の距離と円と円の半径を足した長さ=距離で判定するという事ですね?

問題は「ある時刻T」をどう算出するかが、検討つきません。。
算出というか、リアルタイムでの計算ではないために、↑の条件を満たす
時刻がいつになるかが、分からないのです。



とはいえ、貴重なご意見、ありがとうございました!
nabe_1234
Åê¹ÆNo.33120
投稿日時: 2007-4-24 0:16
新米
居住地:
投稿: 21
使用環境:
Windows Vista Home Premium SP1,Flash CS3
Re: 事前にオブジェクト同士の衝突を判定
まず、最初にごめんなさい。
> A(t) = A0 * t + A1 * (1 - t)で表せる。
A1とA0が逆で、A(t) = A1 * t + A0 * (1 - t) = A0 + t * (A1 - A0)でした。

また、1秒後ではなく3秒後の位置A3で考える場合、
A(t) = A0 + t * (A3 - A0) / 3などと読み替えてください。


> リアルタイムでの計算ではないため
というのがどういう状況か分からなかったのですが、

まず、tの2次方程式|B(t) - A(t)|^2 = (Ar + Br)^2を
解いてみてください。

もし、tが実数解t1、t2を持つならば、
tがt1?t2の間、2つの円が接触していることになります。

ただし、たとえば、t1、t2<0の場合、
「これから衝突する」のではなく
「もし今の弾道を過去に向かって延長したら過去の時点で衝突していた」ことを表します。

また、たとえば、オブジェクトが3秒おきに動きを変えているような状況で、
t1、t2>3だったならば、
「もし向きを変えずに動き続けていれば衝突した」ということを表します。

さっき、tの2次方程式と書きましたが、
もし、A、Bが同じ向きで同じ速さで動いている場合、
tの方程式にはなりません。
(時間が経っても距離は近くも遠くもならない。)
(衝突しているなら衝突しっ放し、
 していないなら永遠に接触しない。)
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops