E3DWikiに当たり判定についての質問を投げた後・・・

注:今日のエントリーは面白くないです(汗)



E3DWikiに当たり判定についての質問を投げた後、
自分でもどうしたらいいかを考えてました。



質問の概要:
武器の攻撃は素早く、フレーム間で武器の描画に「スキマ」ができる。
だから、敵と武器の当たり判定をしても、「すり抜けてしまう」ことがある。
この問題をどう解決すればよいか?



いただいた回答
1.ダミーオブジェクト(武器の軌跡)を用意して、
  ダミーオブジェクトと敵の当たり判定する
2.敵と武器の位置から計算する
3.線分との当たり判定を使う



1.の方法が一番、無難な感じです。
ただ、任意の攻撃の軌跡を全部用意するとなると大変です。
(以前は、E3DSetVertPosした形状にも
 E3DConflictが効いたので有効な手段でしたが)


追記:ぶちさばさんに簡単なダミーオブジェクトの設置方法を
   詳しく教えていただきましたm(_ _)m



今回、2の方法でいい方法がないか考えたので、メモしておきます。


たとえば、以下のように剣を振ったとします。




このとき、
前フレームの剣先の点をA、
後フレームの剣先の点をB、
自キャラの位置をCとします。







これをわかりやすいように、
下の図のような座標系に直します。






図で、AxをAのx座標、
   BxをBのx座標とします。




この図を見ると、以下の条件で当たり判定ができそうです。



1.敵と自キャラの角度が∠ACB以下である。
2.敵の座標のx座標が Ax以上、Bx以下である。
3.敵のz座標が 0以上、f(x)以下である。


1は内積、2はif文判定で簡単にできるので、
問題は3.のf(x)をどうやって定義するかだけ考えればよさそう。



f(x)の例として、一番有名なのは、スプライン補間。
でも、アルゴリズムがよくわからんかったので、却下。


サイクロイドやクロソイドは、関数⇒座標はわかるが、
座標⇒関数はわからんので却下(というより、複数引けると思う)



そこで、武器を振り回すときは、その軌跡は、円運動で
あることと仮定すると、




上記の、ABDを通る円は、
その半径は、三角形ABDの外接円の半径に等しい。



したがって、正弦定理より、
1/R=2sinA/|BD|


さらに、外接円の中心は、2つの弦の垂直二等分線の交点だから、
A(Ax, Az)
B(Bx, Bz)
D(Dx, Dz)
より、
直線AB: z = ( Az-Bz ) / ( Ax-Bx )x + b1
直線BD: z = ( Bz-Dz ) / ( Bx-Dx )x + b2


だるいので、
( Az-Bz ) / ( Ax-Bx ) = 1/α
( Az-Bz ) / ( Ax-Bx ) = 1/β
とおくと、

直線ABの垂直二等分線
z = -αx + b3
z = -βx + b4



したがって、交点(xs, zs)は、
xs = ( b4 - b3 ) / ( β-α )
zs = -αxs + b3


となる。


さて、
円の中心が( xs, zs )の半径Rの円の公式は、

(x - xs )^2 + (z - zs ) ^2 = R^2






したがって、この式から、敵のx座標を代入し、
得られたz座標<=敵のz座標 ならば、


3.敵のz座標が 0以上、f(x)以下である。



が成立し、攻撃が当たっていることになる。