レーザー状に反射
二点を結ぶ線分をレーザー状に反射させる為の処理を作成。
レーザー反射処理が作成できたことにより、1フレーム間での1対多数のオブジェクトの衝突判定と反射処理が可能になります。
【 サンプル 】
紺色・青色の点はドラッグ&ドロップが可能です。両点は1フレーム間に移動する点の始点と終点をイメージしています。このサンプルでは紺点が始点、青点が終点としています。
両点を繋ぐ緑色の線がどこかの赤い線に交差すると青い線に変化し、反射位置となる赤点(次フレームの始点)と緑点(次フレームの終点)が表示されます。
画面の交差対象となる背景オブジェクトには、それぞれ反射率が設定しており、このサンプルでは線に反射すると0.9倍、円に反射すると1.1倍の反射率が反射量に加算されるようにしております。
円の中に紺色の点(始点)を移動させると、円の中で反射を行います。しかし、今回のレーザー反射処理のサンプルでは円の内部での反射は対象としておらず、最適化を図るために円の内部では一度までしか反射されません。1フレーム間で円内部での多数反射処理を実現するためには別途反射処理を作る必要がでてきそうです。
【 処理概要 】
1フレーム間での1対1の衝突・反射処理に対し、1対複数の処理がやっかいだなあと感じた点は以下の三つほどありました。
(1)複数の衝突対象オブジェクトに衝突している場合、どのオブジェクトと衝突しているか求める必要がある
全ての衝突したオブジェクトに対する衝突点(交点)を一覧で取得し、紺点(始点)から衝突点(交点)までの距離が一番短いオブジェクトが一番先に衝突したオブジェクトとすることで解決しました。
(2)反射後、衝突点(交点)から反射位置(次フレームの始点:赤点)までの間にも他の衝突対象オブジェクトと衝突する場合がある
衝突対象のオブジェクトが一つだけならば、反射後、赤点・緑点の位置を求めれば終わりです。しかし、衝突対象のオブジェクトが複数ある場合、衝突点(交点)から赤点までを形成する線分(以下線分Lとする)がさらに他のオブジェクトに衝突している場合があることを考えなくてはいけません。もし線分Lがどこかのオブジェクトに衝突していた場合、再度その線分Lで反射処理を行う必要があり、尚且つ赤点から緑点を形成する線分の移動方向も変更する必要がでてきます。
これは反射処理が行われた際、反射量を成す線分Lがどこにも交差していないと判断できるまで、再帰的に処理を繰り返す必要がでてきます。
(3)オブジェクトの反射率の影響を考える
反射率を1として考える場合(3)は無視できますが、衝突後の反射量を1.1倍に加速させる処理を行うとした場合、(2)の処理が複雑になってきてしまいます。反射しただけ反射量に反射率の計算をする必要が出き、次フレームの線分となる赤点と緑点の移動量も、中途反射した分だけ反射量の計算をする必要がでてきます。
反射処理を行う新たに作成したクラスはもう少し練り上げバグ検証を行った後、後にblogに記します。今まで作成したものはバグが結構あったりメソッド名のスペルがおかしかったりと色々問題があることがわかりました。