• ベストアンサー

当たり判定後に面に沿って動かしたい(壁ずり)

当たり判定後に面に沿って動かしたい(壁ずり) AABBとAABBの当たり判定後に面に沿って動かしたいんですが どうしたらよいでしょうか? まず衝突面を求めればよいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

恐らくなんらかのゲームを作っておられるのかと思いますが、 AABB、つまり各(x,y,z)軸に対して平行ということですから、 オブジェクト間の各軸の距離を求め、衝突していれば描画前に補正するといった処理を行えばよいでしょう。 AABB1(壁)とAABB2の中心座標を(x1,y1,z1)、(x2,y2,z2)、各辺の長さを(sx1,sy1,sz1)、(sx2,sy2,sz2) とした場合、衝突しているという事は条件が |x2 - x1| - ( sx2 + sx1 ) / 2 < 0 && |y2 - y1| - ( sy2 + sy1 ) / 2 < 0 && |z2 - z1| - ( sz2 + sz1 ) / 2 < 0 になると思いますが 例えばx軸で補正する場合 x2 - x1 - ( sx2 + sx1 ) / 2 = 0となるようにx2を補正すれば良いと思います。 ※どの軸で補正するかは、上記3つの条件式の左辺が最小になる軸に対して補正すれば良いと思います。 ※フレーム飛びなどを考慮するなら、その工夫が必用です。 wikipedia-衝突判定にAABB同士の衝突判定について書かれています。 http://ja.wikipedia.org/wiki/%E8%A1%9D%E7%AA%81%E5%88%A4%E5%AE%9A 下記ページの「衝突判定編」に「OBB同士の辺り判定」や 「その14 壁にめり込んだOBBを戻す」が書かれているので 参考になるかもしれません。 http://marupeke296.com/GameMain.html

その他の回答 (1)

回答No.1

質問中のAABBというのが何なのかわかりませんが…… (1)外的な作用が働かず、形状が固定して剛性のある物体の運動はまず質点に置き換えてから考えてみるのが良いでしょう。回転運動等を考えない場合、物体の基本運動は重心に質点があると考えた時の運動と等しくなります。これは衝突の極限においては衝突の接点に質点があるものと置き換えて考えることが出来ます。衝突が面で行われる場合は、その面上のどこか一点に対して考えます。 (2)衝突判定はリージョンの接触で行ないますが、基本的には接点での接触を考えます。一般的に衝突による反射が起こる場合は壁に対する物体の衝突速度の垂直成分が反射運動の垂直成分の初速に影響します。反射が行われない場合は、壁の材質の関係でこの初速が0になったか、あるいは継続的に壁の方向に力が働いているということになります。力が働いている場合は壁と物体との間に摩擦が発生します。 (3)一方、衝突速度の水平成分はそのまま衝突後の運動の初速になります。ここで摩擦が発生していると負の加速度として働き、減速運動となります。摩擦が無いなら壁面に沿った等速運動を続けます。 衝突判定は壁のリージョンに対し、物体のリージョンのどこか一点でも共有する場合は直ちに衝突ということになります。壁の位置が固定されているならその座標データ等を用いて直接計算するのも構いませんが、そうでない場合はリージョン同士の接触を判定する関数をどこかから拾って来るなり自作するなりして使うほうが良いでしょう。(互いに共有する座標があるかどうかの判定です)

関連するQ&A