1206 lines
49 KiB
C
1206 lines
49 KiB
C
|
/**
|
||
|
\file CollisionDetection.h
|
||
|
|
||
|
|
||
|
Moving collision detection for simple primitives.
|
||
|
|
||
|
@author Morgan McGuire, http://graphics.cs.williams.edu
|
||
|
@cite Spherical collision based on Paul Nettle's
|
||
|
ftp://ftp.3dmaileffects.com/pub/FluidStudios/CollisionDetection/Fluid_Studios_Generic_Collision_Detection_for_Games_Using_Ellipsoids.pdf
|
||
|
and comments by Max McGuire. Ray-sphere intersection by Eric Haines.
|
||
|
Box-Box intersection written by Kevin Egan.
|
||
|
Thanks to Max McGuire of Iron Lore for various bug fixes.
|
||
|
Box-Triangle by Tomas Akenine-Moller
|
||
|
|
||
|
\created 2001-11-19
|
||
|
\edited 2010-11-10
|
||
|
|
||
|
Copyright 2000-2012, Morgan McGuire.
|
||
|
All rights reserved.
|
||
|
*/
|
||
|
|
||
|
#ifndef G3D_CollisionDetection_h
|
||
|
#define G3D_CollisionDetection_h
|
||
|
|
||
|
#include "G3D/platform.h"
|
||
|
#include "G3D/Vector3.h"
|
||
|
#include "G3D/Plane.h"
|
||
|
#include "G3D/Box.h"
|
||
|
#include "G3D/Triangle.h"
|
||
|
#include "G3D/Array.h"
|
||
|
#include "G3D/Ray.h"
|
||
|
#include "G3D/Line.h"
|
||
|
|
||
|
namespace G3D {
|
||
|
|
||
|
|
||
|
/**
|
||
|
Collision detection primitives and tools for building
|
||
|
higher order collision detection schemes.
|
||
|
|
||
|
These routines provide <I>moving</I> and static collision detection.
|
||
|
Moving collision detection allows the calculation of collisions that
|
||
|
occur during a period of time -- as opposed to the intersection of
|
||
|
two static bodies.
|
||
|
|
||
|
Moving collision detection routines detect collisions between
|
||
|
<I>only</I> static primitives and moving spheres or points. Since the
|
||
|
reference frame can be user defined, these functions can be used to
|
||
|
detect the collision between two moving bodies by subtracting
|
||
|
the velocity vector of one object from the velocity vector of the
|
||
|
sphere or point the detection is to occur with. This unified
|
||
|
velocity vector will act as if both objects are moving simultaneously.
|
||
|
|
||
|
Collisions are detected for single-sided objects only. That is,
|
||
|
no collision is detected when <I>leaving</I> a primitive or passing
|
||
|
through a plane or triangle opposite the normal... except for the
|
||
|
point-sphere calculation or when otherwise noted.
|
||
|
|
||
|
For a sphere, the collision location returned is the point in world
|
||
|
space where the surface of the sphere and the fixed object meet.
|
||
|
It is <B>not</B> the position of the center of the sphere at
|
||
|
the time of the collision.
|
||
|
|
||
|
The collision normal returned is the surface normal to the fixed
|
||
|
object at the collision location.
|
||
|
|
||
|
<p>
|
||
|
<b>Static Collision Detection:</b> (Neither object is moving)
|
||
|
|
||
|
<table>
|
||
|
<tr><td></td><td><b>Point3</b></td><td><b>LineSegment</b></td><td><b>Ray *</b></td><td><b>Line</b></td><td><b>Plane</b></td><td><b>Triangle</b></td><td><b>Sphere</b></td><td><b>Cylinder</b></td><td><b>Capsule</b></td><td><b>AABox</b></td><td><b>Box</b></td></tr>
|
||
|
<tr><td><b>Point3</b></td><td>\link Vector3::operator== P3::==\endlink \link Vector3::fuzzyEq V3::fuzzy \endlink \link G3D::distance distance \endlink</td><td bgcolor=#C0C0C0 colspan=10 ></td></tr>
|
||
|
<tr><td><b>LineSegment</b></td><td>\link LineSegment::closestPoint LS::closestPoint\endlink \link LineSegment::distance LS::distance\endlink \link CollisionDetection::closestPointOnLineSegment CD\endlink</td><td></td><td bgcolor=#C0C0C0 colspan=9 ></td></tr>
|
||
|
<tr><td><b>Ray *</b></td><td>Ray::closestPoint Ray::distance</td><td></td><td></td><td bgcolor=#C0C0C0 colspan=8 ></td></tr>
|
||
|
<tr><td><b>Line</b></td><td>Line::closestPoint Line::distance</td><td></td><td>\link CollisionDetection::closestPointsBetweenLineAndLine CD\endlink</td><td></td><td bgcolor=#C0C0C0 colspan=7 ></td></tr>
|
||
|
<tr><td><b>Plane</b></td><td></td><td></td><td></td><td></td><td></td><td bgcolor=#C0C0C0 colspan=6 ></td></tr>
|
||
|
<tr><td><b>Triangle</b></td><td></td><td></td><td></td><td></td><td></td><td></td><td bgcolor=#C0C0C0 colspan=5 ></td></tr>
|
||
|
<tr><td><b>Sphere</b></td><td>Sphere::contains</td><td></td><td>\link CollisionDetection::collisionTimeForMovingPointFixedSphere CD \endlink, \link Ray::intersectionTime R::time\endlink</td><td></td><td></td><td>\link G3D::CollisionDetection::fixedSolidSphereIntersectsFixedTriangle CD\endlink</td><td>
|
||
|
\link G3D::CollisionDetection::penetrationDepthForFixedSphereFixedSphere CD\endlink</td><td bgcolor=#C0C0C0 colspan=4 ></td></tr>
|
||
|
<tr><td><b>Cylinder</b></td><td>Cylinder::contains</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td bgcolor=#C0C0C0 colspan=3 ></td></tr>
|
||
|
<tr><td><b>Capsule</b></td><td>Capsule::contains</td> <td></td> <td></td> <td></td> <td></td> <td>\link G3D::CollisionDetection::collisionTimeForMovingSphereFixedTriangle CD\endlink</td> <td></td><td></td><td></td><td bgcolor=#C0C0C0 colspan=2 ></td></tr>
|
||
|
<tr><td><b>AABox</b></td><td>AABox::contains</td><td></td><td></td><td></td><td></td><td>\link CollisionDetection::fixedSolidBoxIntersectsFixedTriangle CD\endlink</td><td></td><td></td><td></td><td></td><td bgcolor=#C0C0C0 colspan=1 ></td></tr>
|
||
|
<tr><td><b>Box</b></td><td>Box::contains</td><td>(treat as Ray)</td><td>\link CollisionDetection::collisionTimeForMovingPointFixedBox CD\endlink</td><td>(treat as Ray)</td><td>\link CollisionDetection::penetrationDepthForFixedBoxFixedPlane CD \endlink</td><td>\link CollisionDetection::penetrationDepthForFixedBoxFixedPlane CD\endlink</td><td>\link CollisionDetection::penetrationDepthForFixedSphereFixedBox CD\endlink</td><td>None (use OPCODE)</td><td>\link CollisionDetection::movingSpherePassesThroughFixedBox CD \endlink</td><td>\link CollisionDetection::penetrationDepthForFixedBoxFixedBox CD\endlink</td><td>\link CollisionDetection::penetrationDepthForFixedBoxFixedBox CD\endlink</td></tr>
|
||
|
</table>
|
||
|
|
||
|
<p>
|
||
|
<b>Moving Collision Detection:</b>
|
||
|
|
||
|
<i>* Note: Moving collision detection against certain primitives is equivalent to static collision
|
||
|
detection against a bigger primitive. Ray, Line Segment == ``moving Point''; Capsule ==``moving Sphere''; Plane == ``moving Line''</i>
|
||
|
|
||
|
@deprecated Routines moving to the G3D::Intersect class in G3D 9.0
|
||
|
*/
|
||
|
class CollisionDetection {
|
||
|
private:
|
||
|
|
||
|
/**
|
||
|
Default parameter if value passed to a function as reference is
|
||
|
not to be calculated. Must be explicitly supported by function.
|
||
|
*/
|
||
|
static Vector3 ignore;
|
||
|
|
||
|
/**
|
||
|
Default parameter if value passed to a function as reference is
|
||
|
not to be calculated. Must be explicitly supported by function.
|
||
|
*/
|
||
|
static bool ignoreBool;
|
||
|
|
||
|
/**
|
||
|
Default parameter if value passed to a function as reference is
|
||
|
not to be calculated. Must be explicitly supported by function.
|
||
|
*/
|
||
|
static Array<Vector3> ignoreArray;
|
||
|
|
||
|
// Static class!
|
||
|
CollisionDetection() {}
|
||
|
virtual ~CollisionDetection() {}
|
||
|
|
||
|
public:
|
||
|
|
||
|
/**
|
||
|
Converts an index [0, 15] to the corresponding separating axis.
|
||
|
Does not return normalized vector in the edge-edge case
|
||
|
(indices 6 through 15).
|
||
|
|
||
|
@param separatingAxisIndex Separating axis.
|
||
|
@param box1 Box 1.
|
||
|
@param box2 Box 2.
|
||
|
|
||
|
@return Axis that separates the two boxes.
|
||
|
*/
|
||
|
static Vector3 separatingAxisForSolidBoxSolidBox(
|
||
|
const int separatingAxisIndex,
|
||
|
const Box & box1,
|
||
|
const Box & box2);
|
||
|
|
||
|
/**
|
||
|
Tests whether two boxes have axes that are parallel to
|
||
|
each other. If they are, axis1 and axis2 are set to be
|
||
|
the parallel axes for both box1 and box2 respectively.
|
||
|
|
||
|
@param ca Dot products of each of the boxes axes
|
||
|
@param epsilon Fudge factor (small unit by which the dot
|
||
|
products may vary and still be considered
|
||
|
zero).
|
||
|
@param axis1 Parallel Axis 1. [Post Condition]
|
||
|
@param axis2 Parallel Axis 2. [Post Condition]
|
||
|
|
||
|
@return true - If boxes have a parallel axis
|
||
|
@return false - otherwise.
|
||
|
*/
|
||
|
static bool parallelAxisForSolidBoxSolidBox(
|
||
|
const double* ca,
|
||
|
const double epsilon,
|
||
|
int & axis1,
|
||
|
int & axis2);
|
||
|
|
||
|
/**
|
||
|
Calculates the projected distance between the two boxes along
|
||
|
the specified separating axis, negative distances correspond
|
||
|
to an overlap along that separating axis. The distance is not
|
||
|
divided by denominator dot(L, L), see
|
||
|
penetrationDepthForFixedSphereFixedBox() for more details
|
||
|
|
||
|
@param separatingAxisIndex
|
||
|
@param a Box 1's bounding sphere vector
|
||
|
@param b Box 2's bounding sphere vector
|
||
|
@param D Vector between Box 1 and Box 2's center points
|
||
|
@param c Pointer to array of dot products of the axes of Box 1
|
||
|
and Box 2.
|
||
|
@param ca Pointer to array of unsigned dot products of the axes
|
||
|
of Box 1 and Box 2.
|
||
|
@param ad Pointer to array of dot products of Box 1 axes and D.
|
||
|
@param bd Pointer to array of dot products of Box 2 axes and D.
|
||
|
|
||
|
@return Projected distance between the two boxes along the
|
||
|
specified separating axis.
|
||
|
*/
|
||
|
static float projectedDistanceForSolidBoxSolidBox(
|
||
|
const int separatingAxisIndex,
|
||
|
const Vector3 & a,
|
||
|
const Vector3 & b,
|
||
|
const Vector3 & D,
|
||
|
const double* c,
|
||
|
const double* ca,
|
||
|
const double* ad,
|
||
|
const double* bd);
|
||
|
|
||
|
|
||
|
/**
|
||
|
Creates a set of standard information about two boxes in order to
|
||
|
solve for their collision. This information includes a vector to
|
||
|
the radius of the bounding sphere for each box, the vector between
|
||
|
each boxes' center and a series of dot products between differing
|
||
|
important vectors. These dot products include those between the axes
|
||
|
of both boxes (signed and unsigned values), and the dot products
|
||
|
between all the axes of box1 and the boxes' center vector and box2
|
||
|
and the boxes' center vector.
|
||
|
|
||
|
@pre The following space requirements must be met:
|
||
|
- c[] 9 elements
|
||
|
- ca[] 9 elements
|
||
|
- ad[] 3 elements
|
||
|
- bd[] 3 elements
|
||
|
|
||
|
@cite dobted from David Eberly's papers, variables used in this function
|
||
|
correspond to variables used in pages 6 and 7 in the pdf
|
||
|
http://www.magic-software.com/Intersection.html
|
||
|
http://www.magic-software.com/Documentation/DynamicCollisionDetection.pdf
|
||
|
|
||
|
@note Links are out-dated. (Kept to preserve origin and authorship)
|
||
|
|
||
|
@param box1 Box 1
|
||
|
@param box2 Box 2
|
||
|
@param a Box 1's bounding sphere vector
|
||
|
@param b Box 2's bounding sphere vector
|
||
|
@param D Vector between Box 1 and Box 2's center points
|
||
|
@param c Pointer to array of dot products of the axes of Box 1
|
||
|
and Box 2.
|
||
|
@param ca Pointer to array of unsigned dot products of the axes
|
||
|
of Box 1 and Box 2.
|
||
|
@param ad Pointer to array of dot products of Box 1 axes and D.
|
||
|
@param bd Pointer to array of dot products of Box 2 axes and D.
|
||
|
*/
|
||
|
static void fillSolidBoxSolidBoxInfo(
|
||
|
const Box & box1,
|
||
|
const Box & box2,
|
||
|
Vector3 & a,
|
||
|
Vector3 & b,
|
||
|
Vector3 & D,
|
||
|
double* c,
|
||
|
double* ca,
|
||
|
double* ad,
|
||
|
double* bd);
|
||
|
|
||
|
/**
|
||
|
Performs a simple bounding sphere check between two boxes to determine
|
||
|
whether these boxes could <i>possibly</i> intersect. This is a very
|
||
|
cheap operation (three dot products, two sqrts and a few others). If
|
||
|
it returns true, an intersection is possible, but not necessarily
|
||
|
guaranteed.
|
||
|
|
||
|
@param a Vector from box A's center to an outer vertex
|
||
|
@param b Vector from box B's center to an outer vertex
|
||
|
@param D Distance between the centers of the two boxes
|
||
|
|
||
|
@return true - if possible intersection
|
||
|
@return false - otherwise (This does not guarantee an intersection)
|
||
|
*/
|
||
|
static bool conservativeBoxBoxTest(
|
||
|
const Vector3 & a,
|
||
|
const Vector3 & b,
|
||
|
const Vector3 & D);
|
||
|
|
||
|
/**
|
||
|
Determines whether two fixed solid boxes intersect.
|
||
|
|
||
|
@note To speed up collision detection, the lastSeparatingAxis from
|
||
|
the previous time step can be passed in and that plane can be
|
||
|
checked first. If the separating axis was not saved, or if the
|
||
|
two boxes intersected then lastSeparatingAxis should equal -1.
|
||
|
|
||
|
@cite Adobted from David Eberly's papers, variables used in this function
|
||
|
correspond to variables used in pages 6 and 7 in the pdf
|
||
|
http://www.magic-software.com/Intersection.html
|
||
|
http://www.magic-software.com/Documentation/DynamicCollisionDetection.pdf
|
||
|
|
||
|
@param box1 Box 1.
|
||
|
@param box2 Box 2.
|
||
|
@param lastSeparatingAxis Last separating axis.
|
||
|
(optimization - see note)
|
||
|
|
||
|
@return true - Intersection.
|
||
|
@return false - otherwise.
|
||
|
*/
|
||
|
static bool fixedSolidBoxIntersectsFixedSolidBox(
|
||
|
const Box& box1,
|
||
|
const Box& box2,
|
||
|
const int lastSeparatingAxis = -1);
|
||
|
|
||
|
/**
|
||
|
Calculates the closest points on two lines with each other. If the
|
||
|
lines are parallel then using the starting point, else calculate the
|
||
|
closest point on each line to the other.
|
||
|
|
||
|
@note This is very similiar to calculating the intersection of two lines.
|
||
|
Logically then, the two points calculated would be identical if calculated
|
||
|
with inifinite precision, but with the finite precision of floating point
|
||
|
calculations, these values could (will) differ as the line slope approaches
|
||
|
zero or inifinity.
|
||
|
|
||
|
@cite variables and algorithm based on derivation at the following website:
|
||
|
http://softsurfer.com/Archive/algorithm_0106/algorithm_0106.htm
|
||
|
|
||
|
@param line1 Line 1.
|
||
|
@param line2 Line 2.
|
||
|
@param closest1 Closest point on line 1.
|
||
|
@param closest2 Closest point on line 2.
|
||
|
*/
|
||
|
static void closestPointsBetweenLineAndLine(
|
||
|
const Line & line1,
|
||
|
const Line & line2,
|
||
|
Vector3 & closest1,
|
||
|
Vector3 & closest2);
|
||
|
|
||
|
/**
|
||
|
Calculates the depth of penetration between two fixed boxes.
|
||
|
Contact normal faces away from box1 and into box2. If there is
|
||
|
contact, only one contact point is returned. The minimally
|
||
|
violated separating plane is computed
|
||
|
- if the separating axis corresponds to a face
|
||
|
the contact point is half way between the deepest vertex
|
||
|
and the face
|
||
|
- if the separating axis corresponds to two edges
|
||
|
the contact point is the midpoint of the smallest line
|
||
|
segment between the two edge lines
|
||
|
|
||
|
@note This is very similiar to calculating the intersection of two lines.
|
||
|
Logically then, the two points calculated would be identical if calculated
|
||
|
with inifinite precision, but with the finite precision of floating point
|
||
|
calculations, these values could (will) differ as the line slope approaches
|
||
|
zero or inifinity.
|
||
|
|
||
|
@cite adobted from David Eberly's papers, variables used in this function
|
||
|
correspond to variables used in pages 6 and 7 in the pdf
|
||
|
http://www.magic-software.com/Intersection.html
|
||
|
http://www.magic-software.com/Documentation/DynamicCollisionDetection.pdf
|
||
|
|
||
|
@param box1 Box 1
|
||
|
@param box2 Box 2
|
||
|
@param contactPoints Contact point between boxes. [Post Condition]
|
||
|
@param contactNormals Surface normal at contact point. [Post Condition]
|
||
|
@param lastSeparatingAxis Last separating axis. (Used for optimization)
|
||
|
|
||
|
@return Depth of penetration between the two boxes. If there is no
|
||
|
intersection between the boxes, then a negative value is returned.
|
||
|
*/
|
||
|
static float penetrationDepthForFixedBoxFixedBox(
|
||
|
const Box& box1,
|
||
|
const Box& box2,
|
||
|
Array<Vector3>& contactPoints,
|
||
|
Array<Vector3>& contactNormals,
|
||
|
const int lastSeparatingAxis = -1);
|
||
|
|
||
|
/**
|
||
|
Calculates the depth of penetration between two fixed spheres as well
|
||
|
as the deepest point of Sphere A that penetrates Sphere B. The normal
|
||
|
returned points <B>away</B> from the object A, although it may
|
||
|
represent a perpendicular to either the faces of object B or object A
|
||
|
depending on their relative orientations.
|
||
|
|
||
|
@param sphereA Fixed Sphere A.
|
||
|
@param sphereB Fixed Sphere B.
|
||
|
@param contactPoints Sphere A's deepest point that penetrates Sphere B.
|
||
|
[Post Condition]
|
||
|
@param contactNormals Normal at penetration point. [Post Condition]
|
||
|
|
||
|
@return Depth of penetration. If there is no intersection between the
|
||
|
objects then the depth will be a negative value.
|
||
|
*/
|
||
|
static float penetrationDepthForFixedSphereFixedSphere(
|
||
|
const class Sphere& sphereA,
|
||
|
const Sphere& sphereB,
|
||
|
Array<Vector3>& contactPoints,
|
||
|
Array<Vector3>& contactNormals = ignoreArray);
|
||
|
|
||
|
/**
|
||
|
Calculates the depth of penetration between a fixed sphere and a fixed
|
||
|
box as well as the deepest point of the sphere that penetrates the box
|
||
|
and the normal at that intersection.
|
||
|
|
||
|
@note There are three possible intersections between a sphere and box.
|
||
|
- Sphere completely contained in the box
|
||
|
- Sphere intersects one edge
|
||
|
- Sphere intersects one vertex
|
||
|
|
||
|
The contact point and contact normal vary for each of these situations.
|
||
|
- Sphere contained in Box:
|
||
|
- Normal is based on side of least penetration (as is the depth calculation).
|
||
|
- Point is based on center of sphere
|
||
|
- Sphere intersects one edge
|
||
|
- Normal is based on vector from the box center to the point of depth.
|
||
|
- Point is closest point to the sphere on the line
|
||
|
- Sphere intersects one vertex
|
||
|
- Normal is based on vector from the box center to the vertex of penetration.
|
||
|
- Point is vertex of penetration.
|
||
|
|
||
|
@cite Adapted from Jim Arvo's method in Graphics Gems
|
||
|
See also http://www.win.tue.nl/~gino/solid/gdc2001depth.pdf
|
||
|
|
||
|
@param sphere Fixed Sphere.
|
||
|
@param box Fixed Box.
|
||
|
@param contactPoints Sphere point that penetrates the box. [Post Condition]
|
||
|
@param contactNormals Normal at the penetration point. [Post Condition]
|
||
|
|
||
|
@return Depth of penetration. If there is no intersection between the
|
||
|
objects then the depth will be a negative value.
|
||
|
*/
|
||
|
static float penetrationDepthForFixedSphereFixedBox(
|
||
|
const Sphere& sphere,
|
||
|
const Box& box,
|
||
|
Array<Vector3>& contactPoints,
|
||
|
Array<Vector3>& contactNormals = ignoreArray);
|
||
|
|
||
|
/**
|
||
|
Calculates the depth of penetration between a Fixed Sphere and a Fixed
|
||
|
Plane as well as the deepest point of the sphere that penetrates the plane
|
||
|
and the plane normal at that intersection.
|
||
|
|
||
|
@param sphereA Fixed Sphere.
|
||
|
@param planeB Fixed Plane.
|
||
|
@param contactPoints Sphere point that penetrates the plane.
|
||
|
[Post Condition]
|
||
|
@param contactNormals Normal at penetration point. [Post Condition]
|
||
|
|
||
|
@return Depth of penetration. If there is no intersection between the
|
||
|
objects then the depth will be a negative value.
|
||
|
*/
|
||
|
static float penetrationDepthForFixedSphereFixedPlane(
|
||
|
const Sphere& sphereA,
|
||
|
const class Plane& planeB,
|
||
|
Array<Vector3>& contactPoints,
|
||
|
Array<Vector3>& contactNormals = ignoreArray);
|
||
|
|
||
|
/**
|
||
|
Calculates the depth of penetration between a fixed box and a fixed
|
||
|
plane as well as the vertexes of the box that penetrate the plane
|
||
|
and the plane normals at those intersections.
|
||
|
|
||
|
@param box Fixed Box.
|
||
|
@param plane Fixed Plane.
|
||
|
@param contactPoints Box points that penetrate the plane.
|
||
|
[Post Condition]
|
||
|
@param contactNormals Normals at penetration points [Post Condition]
|
||
|
|
||
|
@return Depth of penetration. If there is no intersection between the
|
||
|
objects then the depth will be a negative value.
|
||
|
*/
|
||
|
static float penetrationDepthForFixedBoxFixedPlane(
|
||
|
const Box& box,
|
||
|
const Plane& plane,
|
||
|
Array<Vector3>& contactPoints,
|
||
|
Array<Vector3>& contactNormals = ignoreArray);
|
||
|
|
||
|
/**
|
||
|
Calculates time between the intersection of a moving point and a fixed
|
||
|
plane.
|
||
|
|
||
|
@note This is only a one sided collision test. The side defined by
|
||
|
the plane's surface normal is the only one tested. For a two sided
|
||
|
collision, call the function once for each side's surface normal.
|
||
|
|
||
|
@param point Moving point.
|
||
|
@param velocity Point's velocity.
|
||
|
@param plane Fixed plane.
|
||
|
@param outLocation Location of collision. [Post Condition]
|
||
|
(Infinite vector on no collision)
|
||
|
@param outNormal Plane's surface normal. [Post Condition]
|
||
|
|
||
|
@return Time til collision. If there is no collision then the return
|
||
|
value will be inf().
|
||
|
*/
|
||
|
static float collisionTimeForMovingPointFixedPlane(
|
||
|
const Vector3& point,
|
||
|
const Vector3& velocity,
|
||
|
const class Plane& plane,
|
||
|
Vector3& outLocation,
|
||
|
Vector3& outNormal = ignore);
|
||
|
|
||
|
/**
|
||
|
Calculates time between the intersection of a moving point and a fixed
|
||
|
triangle.
|
||
|
|
||
|
@note This is only a one sided collision test. The side defined by
|
||
|
the triangle's surface normal is the only one tested. For a two sided
|
||
|
collision, call the function once for each side's surface normal.
|
||
|
|
||
|
@param orig Moving point.
|
||
|
@param dir Point's velocity.
|
||
|
@param v0 Triangle vertex 1.
|
||
|
@param v1 Triangle vertex 2.
|
||
|
@param v2 Triangle vertex 3
|
||
|
|
||
|
@return Time til collision. If there is no collision then the return
|
||
|
value will be inf().
|
||
|
*/
|
||
|
inline static float collisionTimeForMovingPointFixedTriangle(
|
||
|
const Vector3& orig,
|
||
|
const Vector3& dir,
|
||
|
const Vector3& v0,
|
||
|
const Vector3& v1,
|
||
|
const Vector3& v2) {
|
||
|
return Ray::fromOriginAndDirection(orig, dir).intersectionTime(v0, v1, v2);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Calculates time between the intersection of a moving point and a fixed
|
||
|
triangle.
|
||
|
|
||
|
@note This is only a one sided collision test. The side defined by
|
||
|
the triangle's surface normal is the only one tested. For a two sided
|
||
|
collision, call the function once for each side's surface normal.
|
||
|
|
||
|
@param orig Moving point.
|
||
|
@param dir Point's velocity.
|
||
|
@param v0 Triangle vertex 1.
|
||
|
@param v1 Triangle vertex 2.
|
||
|
@param v2 Triangle vertex 3
|
||
|
@param location Location of collision. [Post Condition]
|
||
|
(Infinite vector on no collision)
|
||
|
|
||
|
@return Time til collision. If there is no collision then the return
|
||
|
value will be inf().
|
||
|
*/
|
||
|
inline static float collisionTimeForMovingPointFixedTriangle(
|
||
|
const Vector3& orig,
|
||
|
const Vector3& dir,
|
||
|
const Vector3& v0,
|
||
|
const Vector3& v1,
|
||
|
const Vector3& v2,
|
||
|
Vector3& location) {
|
||
|
float t = collisionTimeForMovingPointFixedTriangle(orig, dir, v0, v1, v2);
|
||
|
if (t < finf()) {
|
||
|
location = orig + dir * t;
|
||
|
}
|
||
|
return t;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Calculates time between the intersection of a moving point and a fixed
|
||
|
triangle.
|
||
|
|
||
|
@note This is only a one sided collision test. The side defined by
|
||
|
the triangle's surface normal is the only one tested. For a two sided
|
||
|
collision, call the function once for each side's surface normal.
|
||
|
|
||
|
@param orig Moving point.
|
||
|
@param dir Point's velocity.
|
||
|
@param tri Fixed triangle.
|
||
|
@param location Location of collision. [Post Condition]
|
||
|
(Infinite vector on no collision)
|
||
|
@param normal Triangle's surface normal. [Post Condition]
|
||
|
|
||
|
@return Time til collision. If there is no collision then the return
|
||
|
value will be inf().
|
||
|
*/
|
||
|
inline static float collisionTimeForMovingPointFixedTriangle(
|
||
|
const Vector3& orig,
|
||
|
const Vector3& dir,
|
||
|
const Triangle& tri,
|
||
|
Vector3& location = ignore,
|
||
|
Vector3& normal = ignore) {
|
||
|
|
||
|
float t = collisionTimeForMovingPointFixedTriangle(
|
||
|
orig, dir, tri.vertex(0), tri.vertex(1), tri.vertex(2));
|
||
|
|
||
|
if ((t < finf()) && (&location != &ignore)) {
|
||
|
location = orig + dir * t;
|
||
|
normal = tri.normal();
|
||
|
}
|
||
|
return t;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Calculates time between the intersection of a moving point and a fixed
|
||
|
triangle.
|
||
|
|
||
|
@note This is only a one sided collision test. The side defined by
|
||
|
the triangle's surface normal is the only one tested. For a two sided
|
||
|
collision, call the function once for each side's surface normal.
|
||
|
|
||
|
@param orig Moving point.
|
||
|
@param dir Point's velocity.
|
||
|
@param v0 Triangle vertex 1.
|
||
|
@param v1 Triangle vertex 2.
|
||
|
@param v2 Triangle vertex 3
|
||
|
@param location Location of collision. [Post Condition]
|
||
|
(Infinite vector on no collision)
|
||
|
@param normal Triangle's surface normal. [Post Condition]
|
||
|
|
||
|
@return Time til collision. If there is no collision then the return
|
||
|
value will be inf().
|
||
|
*/
|
||
|
inline static float collisionTimeForMovingPointFixedTriangle(
|
||
|
const Vector3& orig,
|
||
|
const Vector3& dir,
|
||
|
const Vector3& v0,
|
||
|
const Vector3& v1,
|
||
|
const Vector3& v2,
|
||
|
Vector3& location,
|
||
|
Vector3& normal) {
|
||
|
float t = collisionTimeForMovingPointFixedTriangle(orig, dir, v0, v1, v2);
|
||
|
if (t < finf()) {
|
||
|
location = orig + dir * t;
|
||
|
normal = (v1 - v0).cross(v2 - v0).direction();
|
||
|
}
|
||
|
return t;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
If the ray origin is inside the box, returns inf() but inside
|
||
|
is set to true.
|
||
|
<B>Beta API</B>
|
||
|
|
||
|
@cite Andrew Woo, from "Graphics Gems", Academic Press, 1990
|
||
|
@cite Optimized code by Pierre Terdiman, 2000 (~20-30% faster on Celeron 500)
|
||
|
@cite Epsilon value added by Klaus Hartmann
|
||
|
@cite http://www.codercorner.com/RayAABB.cpp
|
||
|
*/
|
||
|
static float collisionTimeForMovingPointFixedAABox(
|
||
|
const Vector3& point,
|
||
|
const Vector3& velocity,
|
||
|
const class AABox& box,
|
||
|
Vector3& outLocation,
|
||
|
bool& inside = ignoreBool,
|
||
|
Vector3& outNormal = ignore);
|
||
|
|
||
|
/**
|
||
|
Calculates time between the intersection of a moving point and a fixed
|
||
|
Axis-Aligned Box (AABox).
|
||
|
|
||
|
@note Avoids the sqrt from collisionTimeForMovingPointFixedAABox.
|
||
|
|
||
|
@param point Moving point.
|
||
|
@param velocity Sphere's velocity.
|
||
|
@param box Fixed AAbox.
|
||
|
@param outLocation Location of collision. [Post Condition]
|
||
|
@param inside Does the ray originate inside the box? [Post Condition]
|
||
|
@param normal Box's surface normal to collision [Post Condition]
|
||
|
|
||
|
@return Time til collision. If there is no collision then the return
|
||
|
value will be inf().
|
||
|
*/
|
||
|
static bool collisionLocationForMovingPointFixedAABox(
|
||
|
const Vector3& point,
|
||
|
const Vector3& velocity,
|
||
|
const class AABox& box,
|
||
|
Vector3& outLocation,
|
||
|
bool& inside = ignoreBool,
|
||
|
Vector3& normal = ignore);
|
||
|
|
||
|
|
||
|
/**
|
||
|
@brief Calculates intersection of a ray and a static
|
||
|
Axis-Aligned Box (AABox).
|
||
|
|
||
|
@note Avoids the sqrt from collisionTimeForMovingPointFixedAABox;
|
||
|
early-out branches and operations optimized for Intel Core2 architecture.
|
||
|
|
||
|
@param invDir 1/dir
|
||
|
@param location Location of collision. [Post Condition]
|
||
|
@param inside Does the ray originate inside the box? [Post Condition]
|
||
|
|
||
|
@return True if the ray hits the box
|
||
|
*/
|
||
|
static bool __fastcall rayAABox(
|
||
|
const Ray& ray,
|
||
|
const Vector3& invDir,
|
||
|
const AABox& box,
|
||
|
const Vector3& boxCenter,
|
||
|
float boundingRadiusSquared,
|
||
|
Vector3& location,
|
||
|
bool& inside);
|
||
|
|
||
|
/**
|
||
|
Calculates time between the intersection of a moving point and a fixed
|
||
|
sphere.
|
||
|
|
||
|
@note When ray is starts inside the rectangle, the exiting intersection
|
||
|
is detected.
|
||
|
|
||
|
@param point Moving point.
|
||
|
@param velocity Point's velocity.
|
||
|
@param sphere Fixed Sphere.
|
||
|
@param outLocation Location of collision. [Post Condition]
|
||
|
@param outNormal Sphere's surface normal to collision [Post Condition]
|
||
|
\param solid If true, rays inside the sphere immediately intersect (good for collision detection). If false, they hit the opposite side of the sphere (good for ray tracing).
|
||
|
|
||
|
@return Time until collision. If there is no collision then the return
|
||
|
value will be inf().
|
||
|
*/
|
||
|
static float collisionTimeForMovingPointFixedSphere(
|
||
|
const Vector3& point,
|
||
|
const Vector3& velocity,
|
||
|
const class Sphere& sphere,
|
||
|
Vector3& outLocation,
|
||
|
Vector3& outNormal = ignore,
|
||
|
bool solid = false);
|
||
|
|
||
|
/**
|
||
|
Calculates time between the intersection of a moving point and a fixed
|
||
|
box.
|
||
|
|
||
|
@note If the point is already inside the box, no collision: inf is returned.
|
||
|
|
||
|
@param point Moving point.
|
||
|
@param velocity Sphere's velocity.
|
||
|
@param box Fixed box.
|
||
|
@param outLocation Position of collision. [Post Condition]
|
||
|
@param outNormal Box's surface normal to collision [Post Condition]
|
||
|
|
||
|
@return Time til collision. If there is no collision then the return
|
||
|
value will be inf().
|
||
|
*/
|
||
|
static float collisionTimeForMovingPointFixedBox(
|
||
|
const Vector3& point,
|
||
|
const Vector3& velocity,
|
||
|
const class Box& box,
|
||
|
Vector3& outLocation,
|
||
|
Vector3& outNormal = ignore);
|
||
|
|
||
|
/**
|
||
|
Calculates time between the intersection of a moving point and a fixed
|
||
|
rectangle defined by the points v0, v1, v2, & v3.
|
||
|
|
||
|
@note This is only a one sided collision test. The side defined by
|
||
|
the rectangle's surface normal is the only one tested. For a two sided
|
||
|
collision, call the function once for each side's surface normal.
|
||
|
|
||
|
@param point Moving point.
|
||
|
@param velocity Sphere's velocity.
|
||
|
@param v0 Rectangle vertex 1.
|
||
|
@param v1 Rectangle vertex 2.
|
||
|
@param v2 Rectangle vertex 3
|
||
|
@param v3 Rectangle vertex 4.
|
||
|
@param outLocation Location of collision [Post Condition]
|
||
|
@param outNormal Rectangle's surface normal. [Post Condition]
|
||
|
|
||
|
@return Time til collision. If there is no collision then the return
|
||
|
value will be inf().
|
||
|
*/
|
||
|
static float collisionTimeForMovingPointFixedRectangle(
|
||
|
const Vector3& point,
|
||
|
const Vector3& velocity,
|
||
|
const Vector3& v0,
|
||
|
const Vector3& v1,
|
||
|
const Vector3& v2,
|
||
|
const Vector3& v3,
|
||
|
Vector3& outLocation,
|
||
|
Vector3& outNormal = ignore);
|
||
|
|
||
|
/**
|
||
|
Calculates time between the intersection of a moving point and a fixed
|
||
|
capsule.
|
||
|
|
||
|
@param point Moving point.
|
||
|
@param velocity Point's velocity.
|
||
|
@param capsule Fixed capsule.
|
||
|
@param outLocation Location of collision. [Post Condition]
|
||
|
@param outNormal Capsule's surface normal to collision [Post Condition]
|
||
|
|
||
|
@return Time til collision. If there is no collision then the return
|
||
|
value will be inf().
|
||
|
*/
|
||
|
static float collisionTimeForMovingPointFixedCapsule(
|
||
|
const Vector3& point,
|
||
|
const Vector3& velocity,
|
||
|
const class Capsule& capsule,
|
||
|
Vector3& outLocation,
|
||
|
Vector3& outNormal = ignore);
|
||
|
|
||
|
/**
|
||
|
Calculates time between the intersection of a moving sphere and a fixed
|
||
|
triangle.
|
||
|
|
||
|
@param sphere Moving sphere.
|
||
|
@param velocity Sphere's velocity.
|
||
|
@param plane Fixed Plane.
|
||
|
@param outLocation Location of collision -- not center position of sphere
|
||
|
at the collision time. [Post Condition]
|
||
|
@param outNormal Box's surface normal to collision [Post Condition]
|
||
|
|
||
|
@return Time til collision. If there is no collision then the return
|
||
|
value will be inf().
|
||
|
*/
|
||
|
static float collisionTimeForMovingSphereFixedPlane(
|
||
|
const class Sphere& sphere,
|
||
|
const Vector3& velocity,
|
||
|
const class Plane& plane,
|
||
|
Vector3& outLocation,
|
||
|
Vector3& outNormal = ignore);
|
||
|
|
||
|
/**
|
||
|
Calculates time between the intersection of a moving sphere and a fixed
|
||
|
triangle.
|
||
|
|
||
|
@param sphere The moving sphere.
|
||
|
@param velocity The sphere's velocity.
|
||
|
@param triangle Single-sided fixed triangle.
|
||
|
@param outLocation Location of collision, if collision occurs -- not center position of sphere
|
||
|
at the collision time. If there is interpenetration at the start, this point may be inside
|
||
|
the sphere.
|
||
|
@param b Barycentric coordinates. These are not valid unless collision occurs.
|
||
|
|
||
|
@return Time until collision. If there is no collision then the return
|
||
|
value will be finf().
|
||
|
*/
|
||
|
static float collisionTimeForMovingSphereFixedTriangle(
|
||
|
const class Sphere& sphere,
|
||
|
const Vector3& velocity,
|
||
|
const Triangle& triangle,
|
||
|
Vector3& outLocation,
|
||
|
float b[3] = (float*)&ignore);
|
||
|
|
||
|
/**
|
||
|
Calculates time between the intersection of a moving sphere and a fixed
|
||
|
rectangle defined by the points v0, v1, v2, & v3.
|
||
|
|
||
|
@param sphere Moving sphere.
|
||
|
@param velocity Sphere's velocity.
|
||
|
@param v0 Rectangle vertex 1.
|
||
|
@param v1 Rectangle vertex 2.
|
||
|
@param v2 Rectangle vertex 3
|
||
|
@param v3 Rectangle vertex 4.
|
||
|
@param outLocation Location of collision -- not center position of sphere
|
||
|
at the collision time. [Post Condition]
|
||
|
@param outNormal Box's surface normal to collision [Post Condition]
|
||
|
|
||
|
@return Time til collision. If there is no collision then the return
|
||
|
value will be inf().
|
||
|
*/
|
||
|
static float collisionTimeForMovingSphereFixedRectangle(
|
||
|
const class Sphere& sphere,
|
||
|
const Vector3& velocity,
|
||
|
const Vector3& v0,
|
||
|
const Vector3& v1,
|
||
|
const Vector3& v2,
|
||
|
const Vector3& v3,
|
||
|
Vector3& outLocation,
|
||
|
Vector3& outNormal = ignore);
|
||
|
|
||
|
/**
|
||
|
Calculates time between the intersection of a moving sphere and a fixed
|
||
|
box.
|
||
|
|
||
|
@note This function will not detect an intersection between a moving object
|
||
|
that is already interpenetrating the fixed object.
|
||
|
|
||
|
@param sphere Moving sphere.
|
||
|
@param velocity Sphere's velocity.
|
||
|
@param box Fixed box.
|
||
|
@param outLocation Location of collision -- not center position of sphere
|
||
|
at the collision time. [Post Condition]
|
||
|
@param outNormal Box's surface normal to collision [Post Condition]
|
||
|
|
||
|
@return Time til collision. If there is no collision then the return
|
||
|
value will be inf().
|
||
|
*/
|
||
|
static float collisionTimeForMovingSphereFixedBox(
|
||
|
const class Sphere& sphere,
|
||
|
const Vector3& velocity,
|
||
|
const class Box& box,
|
||
|
Vector3& outLocation,
|
||
|
Vector3& outNormal = ignore);
|
||
|
|
||
|
/** Calculates time between the intersection of a moving sphere
|
||
|
and a fixed sphere.
|
||
|
|
||
|
If they are already interpenetrating, returns 0 and @a
|
||
|
location is the closest point on the surface of the fixed sphere
|
||
|
to the center of the moving sphere.
|
||
|
|
||
|
@param sphere Moving sphere.
|
||
|
@param velocity Sphere's velocity.
|
||
|
@param fixedSphere Fixed Sphere.
|
||
|
@param outLocation Location of collision -- not center position of sphere
|
||
|
at the collision time. [Post Condition]
|
||
|
@param outNormal Moving sphere's surface normal to collision [Post Condition]
|
||
|
|
||
|
@return Time until collision. If there is no collision then the return
|
||
|
value will be inf().
|
||
|
*/
|
||
|
static float collisionTimeForMovingSphereFixedSphere(
|
||
|
const Sphere& sphere,
|
||
|
const Vector3& velocity,
|
||
|
const Sphere& fixedSphere,
|
||
|
Vector3& outLocation,
|
||
|
Vector3& outNormal = ignore);
|
||
|
|
||
|
/**
|
||
|
Calculates time between the intersection of a moving sphere and a fixed
|
||
|
capsule.
|
||
|
|
||
|
@note This won't detect a collision if the sphere is already
|
||
|
interpenetrating the capsule.
|
||
|
|
||
|
@param sphere Moving sphere.
|
||
|
@param velocity Sphere's velocity.
|
||
|
@param capsule Fixed capsule.
|
||
|
@param outLocation Location of collision -- not center position of sphere
|
||
|
at the collision time. [Post Condition]
|
||
|
@param outNormal Capsule's surface normal to the collision [Post Condition]
|
||
|
|
||
|
@return Time til collision. If there is no collision then the return
|
||
|
value will be inf().
|
||
|
*/
|
||
|
static float collisionTimeForMovingSphereFixedCapsule(
|
||
|
const class Sphere& sphere,
|
||
|
const Vector3& velocity,
|
||
|
const class Capsule& capsule,
|
||
|
Vector3& outLocation,
|
||
|
Vector3& outNormal = ignore);
|
||
|
|
||
|
/**
|
||
|
Finds the direction of bounce that a sphere would have when it
|
||
|
intersects an object with the given time of collision, the
|
||
|
collision location and the collision normal.
|
||
|
|
||
|
@note This function works like a pong style ball bounce.
|
||
|
|
||
|
@param sphere Moving sphere.
|
||
|
@param velocity Sphere's velocity.
|
||
|
@param collisionTime Time of collision.
|
||
|
@param collisionLocation Collision location.
|
||
|
@param collisionNormal Surface collision normal.
|
||
|
|
||
|
@return Direction of bounce.
|
||
|
*/
|
||
|
static Vector3 bounceDirection(
|
||
|
const class Sphere& sphere,
|
||
|
const Vector3& velocity,
|
||
|
const float collisionTime,
|
||
|
const Vector3& collisionLocation,
|
||
|
const Vector3& collisionNormal);
|
||
|
|
||
|
/**
|
||
|
Finds the direction of slide given a moving sphere, its velocity, the
|
||
|
time of collision and the collision location. This function works as
|
||
|
if the sphere intersects the surface and continues to hug it.
|
||
|
|
||
|
@note The result will work well for calculating the movement of a player
|
||
|
who collides with an object and continues moving along the object instead
|
||
|
of just bouncing off it.
|
||
|
|
||
|
@param sphere Moving sphere.
|
||
|
@param velocity Sphere's velocity.
|
||
|
@param collisionTime Time of collision
|
||
|
@param collisionLocation Collision location.
|
||
|
|
||
|
@return Direction of slide.
|
||
|
*/
|
||
|
static Vector3 slideDirection(
|
||
|
const class Sphere& sphere,
|
||
|
const Vector3& velocity,
|
||
|
const float collisionTime,
|
||
|
const Vector3& collisionLocation);
|
||
|
|
||
|
/**
|
||
|
Finds the closest point on a line segment to a given point.
|
||
|
|
||
|
@param v0 line vertex 1.
|
||
|
@param v1 line vertex 2.
|
||
|
@param point External point.
|
||
|
|
||
|
@return Closests point to <code>point</code> on the line segment.
|
||
|
*/
|
||
|
static Vector3 closestPointOnLineSegment(
|
||
|
const Vector3& v0,
|
||
|
const Vector3& v1,
|
||
|
const Vector3& point);
|
||
|
|
||
|
/**
|
||
|
Finds the closest point on a line segment to a given point.
|
||
|
|
||
|
@note This is an optimization to closestPointOnLineSegment. Edge length
|
||
|
and direction can be used in this function if already pre-calculated. This
|
||
|
prevents doing the same work twice.
|
||
|
|
||
|
@param v0 line vertex 0.
|
||
|
@param v1 line vertex 1.
|
||
|
@param edgeDirection The direction of the segment (unit length).
|
||
|
@param edgeLength The length of the segment.
|
||
|
@param point External point.
|
||
|
|
||
|
@return Closests point to <code>point</code> on the line segment.
|
||
|
*/
|
||
|
static Vector3 closestPointOnLineSegment(
|
||
|
const Vector3& v0,
|
||
|
const Vector3& v1,
|
||
|
const Vector3& edgeDirection,
|
||
|
float edgeLength,
|
||
|
const Vector3& point);
|
||
|
|
||
|
/**
|
||
|
Finds the closest point on the perimeter of the triangle to an external point;
|
||
|
given a triangle defined by three points v0, v1, & v2, and the external point.
|
||
|
|
||
|
@param v0 Triangle vertex 0.
|
||
|
@param v1 Triangle vertex 1.
|
||
|
@param v2 Triangle vertex 2.
|
||
|
@param point External point.
|
||
|
|
||
|
@return Closests point to <code>point</code> on the perimeter of the
|
||
|
triangle.
|
||
|
*/
|
||
|
static Vector3 closestPointOnTrianglePerimeter(
|
||
|
const Vector3& v0,
|
||
|
const Vector3& v1,
|
||
|
const Vector3& v2,
|
||
|
const Vector3& point);
|
||
|
|
||
|
/**
|
||
|
Finds the closest point on the perimeter of the triangle to an external point;
|
||
|
given a triangle defined by the array of points v, its edge directions and
|
||
|
their lengths, as well as the external point.
|
||
|
|
||
|
@note This is an optimization to closestPointToTrianglePerimeter. Edge length
|
||
|
and direction can be used in this function if already pre-calculated. This
|
||
|
prevents doing the same work twice.
|
||
|
|
||
|
@param v Triangle vertices.
|
||
|
@param point External point.
|
||
|
@param edgeIndex The point lies on the edge between v[edgeIndex] and v[(edgeIndex + 1) % 3]
|
||
|
|
||
|
@return Closest point to <code>point</code> on the perimeter of the
|
||
|
triangle.
|
||
|
*/
|
||
|
static Vector3 closestPointOnTrianglePerimeter(
|
||
|
const Vector3 v[3],
|
||
|
const Vector3 edgeDirection[3],
|
||
|
const float edgeLength[3],
|
||
|
const Vector3& point,
|
||
|
int& edgeIndex);
|
||
|
|
||
|
/**
|
||
|
Tests whether a point is contained within the triangle defined by
|
||
|
v0, v1, and v2 and its plane's normal.
|
||
|
|
||
|
@param v0 Triangle vertex 0.
|
||
|
@param v1 Triangle vertex 1.
|
||
|
@param v2 Triangle vertex 2.
|
||
|
@param normal Normal to triangle's plane.
|
||
|
@param point The point in question.
|
||
|
@param primaryAxis Primary axis of triangle. This will be detected
|
||
|
if not given. This parameter is provided as an optimization.
|
||
|
@param b Barycentric coordinates; b[i] is the weight on v[i]
|
||
|
|
||
|
@return true - if point is inside the triangle.
|
||
|
@return false - otherwise
|
||
|
*/
|
||
|
static bool isPointInsideTriangle(
|
||
|
const Vector3& v0,
|
||
|
const Vector3& v1,
|
||
|
const Vector3& v2,
|
||
|
const Vector3& normal,
|
||
|
const Vector3& point,
|
||
|
float b[3],
|
||
|
Vector3::Axis primaryAxis = Vector3::DETECT_AXIS);
|
||
|
|
||
|
inline static bool isPointInsideTriangle(
|
||
|
const Vector3& v0,
|
||
|
const Vector3& v1,
|
||
|
const Vector3& v2,
|
||
|
const Vector3& normal,
|
||
|
const Vector3& point,
|
||
|
Vector3::Axis primaryAxis = Vector3::DETECT_AXIS) {
|
||
|
|
||
|
float b[3];
|
||
|
return isPointInsideTriangle(v0, v1, v2, normal, point, b, primaryAxis);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Tests for the intersection of a moving sphere and a fixed box in a
|
||
|
given time limit.
|
||
|
|
||
|
@note Returns true if any part of the sphere is inside the box
|
||
|
during the time period (inf means "ever"). Useful for
|
||
|
performing bounding-box collision detection.
|
||
|
|
||
|
@param sphere Moving sphere.
|
||
|
@param velocity Velocity of moving sphere.
|
||
|
@param box Fixed box.
|
||
|
@param timeLimit Time limit for intersection test.
|
||
|
|
||
|
@return true - if the two objects will touch.
|
||
|
@return false - if there is no intersection.
|
||
|
*/
|
||
|
static bool movingSpherePassesThroughFixedBox(
|
||
|
const Sphere& sphere,
|
||
|
const Vector3& velocity,
|
||
|
const Box& box,
|
||
|
double timeLimit = inf());
|
||
|
|
||
|
/**
|
||
|
Tests for the intersection of a moving sphere and a fixed sphere in a
|
||
|
given time limit.
|
||
|
|
||
|
@note This function will not detect an intersection between a moving object
|
||
|
that is already interpenetrating the fixed object.
|
||
|
|
||
|
@param sphere Moving sphere.
|
||
|
@param velocity Velocity of moving sphere.
|
||
|
@param fixedSphere Fixed sphere.
|
||
|
@param timeLimit Time limit for intersection test.
|
||
|
|
||
|
@return true - if the two spheres will touch.
|
||
|
@return false - if there is no intersection.
|
||
|
*/
|
||
|
static bool movingSpherePassesThroughFixedSphere(
|
||
|
const Sphere& sphere,
|
||
|
const Vector3& velocity,
|
||
|
const Sphere& fixedSphere,
|
||
|
double timeLimit = inf());
|
||
|
|
||
|
/**
|
||
|
Tests for the intersection of two fixed spheres.
|
||
|
|
||
|
@param sphere1 Fixed sphere 1.
|
||
|
@param sphere2 Fixed sphere 2.
|
||
|
|
||
|
@return true - if the two spheres touch.
|
||
|
@return false - if there is no intersection.
|
||
|
*/
|
||
|
static bool fixedSolidSphereIntersectsFixedSolidSphere(
|
||
|
const Sphere& sphere1,
|
||
|
const Sphere& sphere2);
|
||
|
|
||
|
/**
|
||
|
Tests for the intersection of a fixed sphere and a fixed box.
|
||
|
|
||
|
@param sphere Fixed sphere.
|
||
|
@param box Fixed box.
|
||
|
|
||
|
@return true - if the two objects touch.
|
||
|
@return false - if there is no intersection.
|
||
|
*/
|
||
|
static bool fixedSolidSphereIntersectsFixedSolidBox(
|
||
|
const Sphere& sphere,
|
||
|
const Box& box);
|
||
|
|
||
|
static bool fixedSolidSphereIntersectsFixedTriangle(
|
||
|
const Sphere& sphere,
|
||
|
const Triangle& triangle);
|
||
|
|
||
|
static bool fixedSolidBoxIntersectsFixedTriangle(
|
||
|
const AABox& box,
|
||
|
const Triangle& triangle);
|
||
|
|
||
|
/**
|
||
|
Tests whether a point is inside a rectangle defined by the vertexes
|
||
|
v0, v1, v2, & v3, and the rectangle's plane normal.
|
||
|
|
||
|
@param v0 Rectangle vertex 1.
|
||
|
@param v1 Rectangle vertex 2.
|
||
|
@param v2 Rectangle vertex 3.
|
||
|
@param v3 Rectangle vertex 4.
|
||
|
@param normal Normal to rectangle's plane.
|
||
|
@param point The point in question.
|
||
|
|
||
|
@return true - if point is inside the rectangle.
|
||
|
@return false - otherwise
|
||
|
*/
|
||
|
static bool isPointInsideRectangle(
|
||
|
const Vector3& v0,
|
||
|
const Vector3& v1,
|
||
|
const Vector3& v2,
|
||
|
const Vector3& v3,
|
||
|
const Vector3& normal,
|
||
|
const Vector3& point);
|
||
|
|
||
|
/**
|
||
|
Finds the closest point on the perimeter of the rectangle to an
|
||
|
external point; given a rectangle defined by four points v0, v1,
|
||
|
v2, & v3, and the external point.
|
||
|
|
||
|
@param v0 Rectangle vertex 1.
|
||
|
@param v1 Rectangle vertex 2.
|
||
|
@param v2 Rectangle vertex 3.
|
||
|
@param v3 Rectangle vertex 4.
|
||
|
@param point External point.
|
||
|
|
||
|
@return Closests point to <code>point</code> on the perimeter of the
|
||
|
rectangle.
|
||
|
*/
|
||
|
static Vector3 closestPointToRectanglePerimeter(
|
||
|
const Vector3& v0,
|
||
|
const Vector3& v1,
|
||
|
const Vector3& v2,
|
||
|
const Vector3& v3,
|
||
|
const Vector3& point);
|
||
|
|
||
|
/**
|
||
|
Finds the closest point in the rectangle to an external point; Given
|
||
|
a rectangle defined by four points v0, v1, v2, & v3, and the external
|
||
|
point.
|
||
|
|
||
|
@param v0 Rectangle vertex 1.
|
||
|
@param v1 Rectangle vertex 2.
|
||
|
@param v2 Rectangle vertex 3
|
||
|
@param v3 Rectangle vertex 4.
|
||
|
@param point External point.
|
||
|
|
||
|
@return Closet point in the rectangle to the external point.
|
||
|
*/
|
||
|
static Vector3 closestPointToRectangle(
|
||
|
const Vector3& v0,
|
||
|
const Vector3& v1,
|
||
|
const Vector3& v2,
|
||
|
const Vector3& v3,
|
||
|
const Vector3& point);
|
||
|
};
|
||
|
|
||
|
} // namespace
|
||
|
|
||
|
#endif // G3D_COLLISIONDETECTION_H
|