

rotationで、回転させたオブジェクトとの当たり判定は、どうやったらいいのでしょうか？

runstant サンプル  
<http://goo.gl/4E2dYw>

rotationが反映されて無い状態で判定されてるみたい。  
（もしかして未対応？）

tmlib.jsだけでは、無理なら普通はどのように判定するのがいいのかとか参考になるものがあったら教えてください。


CC BY-SA 3.0
2015-03-11T13:03:22.840
7797
2015-03-12T03:49:21.997
2015-03-11T13:18:55.817
7926
4419
question
javascript tmlib.js
回転させたオブジェクトの当たり判定方法は？


tmlib.js 側では未対応ですね.

OBB と OBB の衝突判定は複雑でかつ処理負荷も高いので  
対応予定ではありますが, まだ先になるかと思います!


CC BY-SA 3.0
2015-03-12T03:24:25.367
7816
2015-03-12T03:24:25.367
2162
7797
answer


他所で回答したのでこちらも。

[tmlib.js Document](http://phi-
jp.github.io/tmlib.js/docs/source/collision2.html#tm-collision-method-
testRectRect)

[code]

    return (rect0.left < rect1.right) && (rect0.right > rect1.left) &&
           (rect0.top < rect1.bottom) && (rect0.bottom > rect1.top);
    
[/code]

見た感じ、tmlib.js は回転した矩形の対応はしてないですね。  
この解法はいくつもありますし、一般的な "これ" と言えるものがありません。  
なのでどうしても主観的な回答になってしまいます。

## 解き方の 1 例

  1. 矩形自体をベクトルの集合体として考える.

矩形は 4 辺ありますので、 v1, v2, v3, v4 といった 4 つのベクトルとして定義することができます.  
この時、右回りに v1, v2, v3, v4
として定義されていると矩形の内側に他図形の頂点が入った場合は、どのベクトルから見ても右側にあるように見えます。左回りはこの逆です.  
↓ v1 ～ v4, どのベクトルから見ても内側の点は右側にある状態ですね.

[code]          v1→

      ┏━━━┓
    ↑ ┃  ・ ┃ v2
    v4┃     ┃ ↓
      ┗━━━┛
        ←v3
    
[/code]

  2. あるベクトルに対して左右のどちらにあるかは外積で求める.

例えば、上記 v1 の始点を (v1x1,v1y1) とします.  
そして、同様に終点を (v1x2,v1y2) とします.  
調査対象の頂点を P (Px,Py) とした時に外積を用いて、その結果を見てみます.

`(v1x2-v1x1)*(Py-v1y1) - (Px-v1x1)*(v1y2-v1y1)`

上記の結果、 + の値であれば頂点 P は v1 の左側に位置している、と言えます.

## まとめ

上記のように右回り矩形として考えた場合、全頂点 (A も B も)に対して上記計算を行い、外積の結果 + であれば未衝突、どれか 1 つでも -
であれば衝突している、と言えます。

このように、衝突判定という処理自体は非常に効率が悪いものになります。  
最適化の方法等を知りたい場合は、他に衝突判定を行っているライブラリを覗いてみると良いかもしれません。


CC BY-SA 3.0
2015-03-12T03:49:21.997
7818
2015-03-12T03:49:21.997
7926
7797
answer