1 #include "hx3d/physics/2d/manifold.hpp" 3 #include "hx3d/physics/2d/collisions.hpp" 5 #include "hx3d/math/vector_utils.hpp" 23 value =
checkCollisions(*
this, std::dynamic_pointer_cast<colliders::Circle>(
a), std::dynamic_pointer_cast<colliders::Circle>(
b));
25 value =
checkCollisions(*
this, std::dynamic_pointer_cast<colliders::Circle>(
a), std::dynamic_pointer_cast<colliders::Polygon>(
b));
27 value =
checkCollisions(*
this, std::dynamic_pointer_cast<colliders::Polygon>(
a), std::dynamic_pointer_cast<colliders::Circle>(
b));
29 value =
checkCollisions(*
this, std::dynamic_pointer_cast<colliders::Polygon>(
a), std::dynamic_pointer_cast<colliders::Polygon>(
b));
41 for (
unsigned int i = 0; i <
contacts.size(); ++i) {
61 for (
unsigned int i = 0; i <
contacts.size(); ++i) {
67 float contactVelocity = glm::dot(rv,
normal);
68 if (contactVelocity > 0)
74 float invMassSum =
a->massData.invMass +
b->massData.invMass + (raCross * raCross) *
a->massData.invInertia + (rbCross * rbCross) *
b->massData.invInertia;
80 glm::vec2 impulse =
normal * j;
81 a->applyImpulse(-impulse, ra);
82 b->applyImpulse(impulse, rb);
89 float jt = -glm::dot(rv, t);
96 glm::vec2 tangentImpulse;
98 tangentImpulse = t * jt;
102 a->applyImpulse(-tangentImpulse, ra);
103 b->applyImpulse(tangentImpulse, rb);
110 const float kSlop = 0.05f;
111 const float percent = 0.4f;
113 glm::vec2 correction = (std::max(
penetration - kSlop, 0.f) / (
a->massData.invMass +
b->massData.invMass)) *
normal * percent;
115 a->position -= correction *
a->massData.invMass;
116 b->position += correction *
b->massData.invMass;
122 a->velocity = {0, 0};
123 b->velocity = {0, 0};
bool epsEqual(T v1, T v2)
Test values equality with epsilon.
Manifold(const Ptr< Collider > &a, const Ptr< Collider > &b)
Create a manifold.
std::vector< glm::vec2 > contacts
Contact points.
float squareLength(glm::vec2 vec)
Compute the square length of a 2D vector.
Ptr< Collider > b
Second collider.
friend bool operator<(const Manifold &m1, const Manifold &m2)
Compare two manifolds using their penetration coefficients.
bool disabled
Is the contact disabled ?
void initialize()
Initialize the manifold.
float mixedStaticFriction
Mixed static friction (sf)
float penetration
Penetration coefficient.
bool solve()
Solve the contact.
float mixedDynamicFriction
Mixed dynamic friction (df)
Contact manifold definition.
void positionalCorrection()
Do positional correction on the colliders.
const float kEpsilon
Float epsilon.
void applyImpulse()
Apply impulses to the colliders.
bool checkCollisions(Manifold &m, Ptr< colliders::Circle > a, Ptr< colliders::Circle > b)
Collision test between two circles.
void infiniteMassCorrection()
Do infinite mass correction on the colliders.
Ptr< Collider > a
First collider.
glm::vec2 normalize(glm::vec2 vec)
Normalize a 2D vector.
float mixedRestitution
Mixed restitution (e)
glm::vec2 cross(glm::vec2 vec, float v)
Calculate the cross product vector between a 2D vector and a scalar.
std::shared_ptr< T > Ptr
Quick-typing shared ptr.
glm::vec2 normal
Normal vector.