I'm using this code to detect intersections between two OBBs. The problem is that i don't know what to do after detecting it. I tried using a simple algorithm:

    if (collision detected) {
        move character back to its position on previous frame

But this is not what i need, because the character is rotating and moving to certain points (usually to mouse click position). When it's close to an object with OBB and it rotates to a point, its OBB updates (the position of all OBBs corners is recalculated) and most of the time the updated OBB intersects with an object that is near, so the charecter gets stuck at its position.

How can i deal with the rotation problem or what other methods can you offer for stoping character when its OBB itersects with another?

  • 1
    \$\begingroup\$ As soon as your moving objects rotate, it is a lot harder to use Axis-Oriented Bounding Boxes well. Also, in general it is better to check for collisions before movement(and prevent the movement from happening if there will be a collision), instead of trying to resolve overlap after movement. \$\endgroup\$ – Qqwy Jan 29 '13 at 20:11
  • \$\begingroup\$ I have an idea, but i dont know how to implement it... What about finding the shortest way out of the obb? \$\endgroup\$ – Qualphey Jan 29 '13 at 20:18
  • 1
    \$\begingroup\$ Maybe you can use the Euclidean distance and 2 radii of your 2 objects, so you can test spheres intersection instead of bounding boxes. Everything would be much easier. \$\endgroup\$ – Ivan Kuckir Jan 29 '13 at 21:45

You need to find penetration distance and an axis of resolution. The axis of resolution will be the axis of least penetration between the two objects. Finding this information is non-trivial and makes for a much more in-depth implementation than the one you currently have.

See Box2D Lite for an example of an OBB to OBB test. For a working generalized polygon to polygon test, I suggest studying this: https://github.com/tutsplus/ImpulseEngine/blob/master/Collision.cpp

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.