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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     点と線の当り判定
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
smoke123
Åê¹ÆNo.24851
投稿日時: 2006-4-13 19:56
新米
居住地:
投稿: 17
使用環境:
Windows Vista
FLASH CS4
Flash Player 10
点と線の当り判定
こんにちは。

現在カーソルキーで動く「赤い点」と、静止している「壁(線)」の
当り判定で困っています。

制作途中ですが、こんな感じです。

反射させるところまではなんとかできたようですが、
移動量が減少していくと、赤い点が壁を「すりぬけ」てしまいます。


1回のループの中で、
「赤い点」の移動ベクトルが「壁」と交差したら、
  ・反射ベクトルを求める。(ベクトルによる移動は次のループから)
  ・交点に「赤い点」を強制移動。
「赤い点」の移動ベクトルが「壁」と交差していなければ、
  ・「赤い点」の座標を移動ベクトルによってふつうに移動。
のように処理しています。

正確には、1回のループの中で反射する壁がなくなるまで繰り返し当り判定を
行うことが必要だと思いますが、当り判定処理の軽減とそれっぽく見えればいい
という判断で、「反射処理は1回のループの中で1回だけ」としています。
この処理方法が原因なのか分かりませんが、気になっている部分です。

「それっぽく見えればいい」ので無理矢理「補正する」方向で考えています。
どうやら壁の法線方向の移動量が無くなるとすりぬけてしまうようなので、
反射ベクトルを求める時に法線方向の移動量をほんの少し足したりしてみましたが
「赤い点」がいつまでも静止せずに細かく振動する現象が起きてしまいました。

何か良い補正の方法はないものでしょうか。
また、処理方法に誤りがあるのでしょうか。
FLAファイルはこちら。参考まで。

参考にさせて頂いたサイト
・X-LABO:レーザー状に反射
・Flashゲーム講座&ASサンプル集:交差判定について
nabe_1234
Åê¹ÆNo.24887
投稿日時: 2006-4-15 13:37
新米
居住地:
投稿: 21
使用環境:
Windows Vista Home Premium SP1,Flash CS3
Re: 点と線の当り判定
またネタをパクってドキュメントを書いてみました。
http://www.geocities.jp/animecomic_pen_7380/note/reflect.html

> 反射ベクトルを求める時に法線方向の移動量をほんの少し足したりしてみましたが

その変形として「擬似的な斥力」を考えてみました。

点と線が接していて、速度も0のとき、
点が線のどちら側にあるのかは曖昧です。
この状態になったら既に手遅れです。

そこで、
点と線が近づいたときに斥力が発生し、
点と線が近い間はそのまま維持され、
点と線が離れたとき、消失すると考えてみます。

斥力は法線と平行(壁と垂直)です。
斥力の向きは点を元来た世界に押し戻す方です。

線分に対して非常に浅い角度で点が突っ込んできた場合は別処理が必要です。

なお、「消失」の話題が生じるのは、線分だからです。
線分を止めて細長い四角にすれば、斥力の方向は常に一定です。

サンプルでは画面右上にV字型の施設があり、
ここから点が落ちてこないようにするのが課題です。

V字ではなく、実は微妙にX字になっている、としても、
同時に2本の線に接し、速度0と成り得ます。

斥力の状態を少なくとも2本分は管理する必要があるかも知れません。

また、この斥力は、
「どっちから来たか曖昧にしない」ためだけに存在するので、
位置や速度に加算して振動してしまうなら、
計算中だけ補正用に使えば回避できるかも知れません。

なお、ここで書いてることは、実際には全然試してません。
的外れだったらごめんなさ?い!
smoke123
Åê¹ÆNo.24910
投稿日時: 2006-4-16 15:31
新米
居住地:
投稿: 17
使用環境:
Windows Vista
FLASH CS4
Flash Player 10
Re: 点と線の当り判定
不十分なところがあるかもしれませんが、一応できました。

FLAファイルはこちら、参考まで。

ドキュメント拝見しました。「移動についてのアルゴリズム?」で
線分が通過する格子を取得したのは、ご想像どおり、当り判定の高速化を考えているからです。
X-LABO:衝突判定高速化 ステージ区画分けで詳しく考察されています。
(高速化についてはいずれやってみたいと思います)

問題の「すり抜け」についてですが、
・点の移動量が「0」
・点が線分上にある
この2つの条件を回避すればいいので点と線が衝突したときに、
ほんの少し点を線分から離してあげればいいようです。
引用:
斥力は法線と平行(壁と垂直)です。
斥力の向きは点を元来た世界に押し戻す方です。

今回は点を線分から0.1ドット離すという方法をとりました。
(3年D組モチヲ先生:壁の当たり判定を参考にさせて頂きました)

力学的な運動について、衝突よりも静止を表現する方が難しいようです。
また、衝突と静止を分けて考えるのではなく、
「目に見えない非常に小さな衝突の連続で、静止しているように見せる」
と考えた方がいいみたいです。

前回、
引用:
「赤い点」がいつまでも静止せずに細かく振動する現象が起きてしまいました。
と書きましたが、重力に対する抗力を考えていなかったという別な問題が原因でした...。

「動く点」と「動かない壁」との当り判定はなんとかできたようですが、
「動く点」と「動く壁」との当り判定ができるようになると複雑な表現が
可能になるのではないかと思います。
nabe_1234
Åê¹ÆNo.24911
投稿日時: 2006-4-16 16:52
新米
居住地:
投稿: 21
使用環境:
Windows Vista Home Premium SP1,Flash CS3
Re: 点と線の当り判定
むむ、やっぱりちょっと問題を取り違えてたようです。

最初、横に引っ張った線分に対して、
下からぶち当たったときは下に跳ね返して、
上からぶち当たったときは上に跳ね返すのかと思い、

計算誤差に埋もれるような小さい値のとき、
どちら向きに補正掛けるかの判断方法を
問われているのかと思ったのですが、

途中で、薄々、
「あれぇこんなにごちゃごちゃやるくらいなら、
線じゃなくて長方形とかにして、
『図形の中に入らないように外に向かって補正』とした方が
補正の向きが一貫しててラクだなぁ」とは思い始めてたんですが・・・
smoke123
Åê¹ÆNo.24917
投稿日時: 2006-4-17 15:06
新米
居住地:
投稿: 17
使用環境:
Windows Vista
FLASH CS4
Flash Player 10
Re: 点と線の当り判定
重要な事を説明していませんでした...申し訳ありません。

線分ABと点の当り判定は
ベクトルABと点の移動量(ベクトル)によって行っていますが、
ベクトルABの右側にしか当り判定がありません。
左側から向かってくる点は、すり抜ける仕様になってます。
これが静止状態によるすり抜けと混同をまねかないように説明しなければいけませんでした。
引用:
『図形の中に入らないように外に向かって補正』とした方が
補正の向きが一貫しててラクだなぁ

おっしゃるとおりで、
ベクトルABの右側にしか当り判定がないので補正の向きは一貫してます。
図形を表現するときは、
図形を左周りに描くようにベクトルを配置すれば図形の内部に点が入ってきません。
また、両側に当り判定のある線分を表現するときは、
ぴったり同じ位置に逆向きのベクトルを配置します。

問題点を明確に説明できなくてすみませんでした。

両側に当り判定のある線分については実際にやってないので分かりませんが、
片側にしか当り判定のない線分という手抜き方法とは違って
難しい考え方が必要になるのかもしれません。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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