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)以下である。
が成立し、攻撃が当たっていることになる。