Kigs Framework  Doc version 0.8
Open source multi purpose Rapid Application Development framework
Static Public Member Functions | Static Protected Member Functions | List of all members
Collision Class Reference

#include <Collision.h>

Static Public Member Functions

static bool CollideSphereSphere (const Point3D &Sphere1Center, const Vector3D &Sphere1Velocity, const kfloat Sphere1Radius, const Point3D &Sphere2Center, const Vector3D &Sphere2Velocity, const kfloat Sphere2Radius, kfloat &IntersectionTime)
 compute collision time between two moving spheres given 2 spheres radius, position, and velocity, return true if the sphere collide or false if not. If the sphere collide, return the intersection time More...
 
static bool CollideSphereTriangle (const Point3D &SphereOrigin, const Vector3D &SphereVelocity, const kfloat SphereRadius, const Point3D &P1, const Point3D &P2, const Point3D &P3, kdouble &IntersectionDistance, Vector3D &InteresectionNormal, Point3D &IntersectionPoint)
 compute collision between a moving sphere and a single triangle given the sphere origin, radius and velocity, and 3 points, return if there is a collision, and if yes, give the intersection distance (time?), the intersecting point and normal More...
 
static bool CollideSphereAABBTreeNode (const Point3D &SphereOrigin, const Vector3D &SphereVelocity, const kfloat &SphereRadius, AABBTreeNode &pAABB, Mesh *pMesh, kdouble &IntersectionDistance, Vector3D &InteresectionNormal, Point3D &IntersectionPoint)
 compute collision between a moving sphere and a mesh using an already existing AABBTree given the sphere origin, radius and velocity, the mesh and its AABBtree, return if there is a collision, and if yes, give the intersection distance (time?), the intersecting point and normal More...
 
static bool CollideRaySphere (const Point3D &RayStartingPoint, const Vector3D &Raydirection, const kfloat &SphereRadius, kdouble &IntersectionDistance, Vector3D &IntersectionNormal)
 compute collision between a ray and a sphere given the ray origin, ray direction in sphere local coords, and sphere radius return if there is a collision, and if yes, give the intersection distance (time?), the intersecting point and normal
 

Static Protected Member Functions

static bool CheckPointInTriangle (const Point3D &point, const Point3D &A, const Point3D &B, const Point3D &C)
 return true if point is in triangle given by A,B and C More...
 
static Point3D closestPointOnLine (const Point3D &A, const Point3D &B, const Point3D &P)
 return the closest point to P on the line (A,B)
 
static Point3D closestPointOnTriangle (const Point3D &A, const Point3D &B, const Point3D &C, const Point3D &P)
 return the closest point to P on the triangle (A,B,C)
 
static bool CollideSphereAABBTreeNode (const Point3D &SphereOrigin, const Vector3D &SphereVelocity, const kfloat &SphereRadius, AABBTreeNode &pAABB, Mesh *pMesh, const BBox &MovingSphereBBox, kdouble &IntersectionDistance, Vector3D &InteresectionNormal, Point3D &IntersectionPoint)
 internal collide computation used by the public CollideSphereAABBTreeNode method More...
 

Detailed Description

Encapsulate useful collision calculation methods.

Member Function Documentation

◆ CheckPointInTriangle()

bool Collision::CheckPointInTriangle ( const Point3D &  point,
const Point3D &  A,
const Point3D &  B,
const Point3D &  C 
)
staticprotected

return true if point is in triangle given by A,B and C

check if a point (Point, P) is inside a triangle defined by points (A,B,C) the given point is in the triangle plane. Use the angles sum : APB + BPC + CPA. If sum is near 2*PI then the point is in the triangle else it is out. This method use 3 vector normalize, 3 acos, 3 dot product and one abs, perhaps other faster method is possible

◆ CollideSphereAABBTreeNode() [1/2]

bool Collision::CollideSphereAABBTreeNode ( const Point3D &  SphereOrigin,
const Vector3D &  SphereVelocity,
const kfloat &  SphereRadius,
AABBTreeNode pAABB,
Mesh pMesh,
const BBox &  MovingSphereBBox,
kdouble &  IntersectionDistance,
Vector3D &  IntersectionNormal,
Point3D &  IntersectionPoint 
)
staticprotected

internal collide computation used by the public CollideSphereAABBTreeNode method

check collision between a moving sphere (position, radius, movement vector, bbox along trajectory) and mesh given its AABBTree. this method is recursive

first test current node bounding box against moving sphere bounding box

if the bounding box are intersecting

if this node is a leaf then check each triangles and return

if this node is not a leaf then recurse to sons

◆ CollideSphereAABBTreeNode() [2/2]

bool Collision::CollideSphereAABBTreeNode ( const Point3D &  SphereOrigin,
const Vector3D &  SphereVelocity,
const kfloat &  SphereRadius,
AABBTreeNode pAABB,
Mesh pMesh,
kdouble &  IntersectionDistance,
Vector3D &  IntersectionNormal,
Point3D &  IntersectionPoint 
)
static

compute collision between a moving sphere and a mesh using an already existing AABBTree given the sphere origin, radius and velocity, the mesh and its AABBtree, return if there is a collision, and if yes, give the intersection distance (time?), the intersecting point and normal

check collision between a moving sphere (position, radius, movement vector) and mesh given its AABBTree.

first compute the bounding box for the sphere along its trajectory

then call the same method but with the moving sphere BBOx param

◆ CollideSphereSphere()

bool Collision::CollideSphereSphere ( const Point3D &  Sphere1Center,
const Vector3D &  Sphere1Velocity,
const kfloat  Sphere1Radius,
const Point3D &  Sphere2Center,
const Vector3D &  Sphere2Velocity,
const kfloat  Sphere2Radius,
kfloat &  IntersectionTime 
)
static

compute collision time between two moving spheres given 2 spheres radius, position, and velocity, return true if the sphere collide or false if not. If the sphere collide, return the intersection time

check if a collision occurs between two moving spheres Two usages are possibles :

  • giving each sphere center/radius and velocity in meter per seconds -> just check for collision in the next second, return intersection time between 0 and 1
  • giving each sphere center/radius and movement vector (end position = center + movement vector) -> check collision between start and end position, collision position is sphereXCenter + returned IntersectionTime * SphereXVelocity

first compute sphere1 to sphere 2 vector

then compute sphere2 relative velocity to sphere1

distance equation between sphere1 and sphere2

return true if collision occur in the next second (or between start and end position)

◆ CollideSphereTriangle()

bool Collision::CollideSphereTriangle ( const Point3D &  SphereOrigin,
const Vector3D &  SphereVelocity,
const kfloat  SphereRadius,
const Point3D &  P1,
const Point3D &  P2,
const Point3D &  P3,
kdouble &  IntersectionTime,
Vector3D &  Normal,
Point3D &  IntersectionPoint 
)
static

compute collision between a moving sphere and a single triangle given the sphere origin, radius and velocity, and 3 points, return if there is a collision, and if yes, give the intersection distance (time?), the intersecting point and normal

check collision between a moving sphere (position, radius, movement vector) and a triangle (P1,P2,P3). the method return false if the sphere is already intersecting the triangle

compute the "normal velocity", ie the velocity of the sphere on the plane's normal axis

first return false if sphere is moving far away from the triangle (nv>KFLOAT_CONST(0.0))

compute distance from sphere origin to plane

compute intersection start/end times

if collision has already occured or there's no collision between sphere start/end pos then return false

compute projected intersection point on plane

and return true if it is inside the triangle

if intersection occured with the plane but outside the triangle, compute intersection with nearest of P1, P2 or P3

then compute intersection with nearest edge (P1,P2), (P2,P3), (P3,P1)

finally keep the nearest intersection with point or edge if any, and return


The documentation for this class was generated from the following files: