@ -28,15 +28,14 @@ namespace AZ
//! LineToPointDistance computes the closest point to 'p' from a segment (s1,s2).
//! @param s1 segment start point
//! @param s2 segment end point
//! @param p point to find the closest time to.
//! @param u time (on the segment) for the shortest distance from 'p' to (s1,s2) [0.0f (s1),1.0f (s2)]
//! @param p point to find the closest time to.
//! @param u time (on the segment) for the shortest distance from 'p' to (s1,s2) [0.0f (s1),1.0f (s2)]
//! @return the closest point
Vector3 LineToPointDistance ( const Vector3 & s1 , const Vector3 & s2 , const Vector3 & p , float & u ) ;
//! Given segment pq and triangle abc (CCW), returns whether segment intersects
//! triangle and if so, also returns the barycentric coordinates (u,v,w)
//! of the intersection point.
//!
//! @param p segment start point
//! @param q segment end point
//! @param a triangle point 1
@ -49,7 +48,7 @@ namespace AZ
const Vector3 & p , const Vector3 & q , const Vector3 & a , const Vector3 & b , const Vector3 & c , Vector3 & normal , float & t ) ;
//! Same as \ref IntersectSegmentTriangleCCW without respecting the triangle (a,b,c) vertex order (double sided).
//! //! @param p segment start point
//! @param p segment start point
//! @param q segment end point
//! @param a triangle point 1
//! @param b triangle point 2
@ -86,41 +85,38 @@ namespace AZ
const Aabb & aabb ,
float & tStart ,
float & tEnd ,
Vector3 & startNormal /*, Vector3& inter*/ ) ;
Vector3 & startNormal ) ;
//! Intersect ray against AABB.
//!
//! @param rayStart ray starting point.
//! @param dir ray reciprocal direction.
//! @param aabb Axis aligned bounding box to intersect against.
//! @param start length on ray of the first intersection.
//! @param end length of the of the second intersection.
//! @return \ref RayAABBIsectTypes In this faster version than IntersectRayAABB we return only ISECT_RAY_AABB_NONE and ISECT_RAY_AABB_ISECT. You can check yourself for that case.
//! @return \ref RayAABBIsectTypes In this faster version than IntersectRayAABB we return only ISECT_RAY_AABB_NONE and
//! ISECT_RAY_AABB_ISECT. You can check yourself for that case.
RayAABBIsectTypes IntersectRayAABB2 ( const Vector3 & rayStart , const Vector3 & dirRCP , const Aabb & aabb , float & start , float & end ) ;
//! Clip a ray to an aabb. return true if ray was clipped. The ray
//! can be inside so don't use the result if the ray intersect the box.
//!
//! @param aabb bounds
//! @param rayStart the start of the ray
//! @param rayEnd the end of the ray
//! @param tClipStart[out] The proportion where the ray enterts the aabb
//! @param tClipEnd[out] The proportion where the ray exits the aabb
//! @param [out] tClipStart The proportion where the ray enterts the aabb
//! @param [out] tClipEnd The proportion where the ray exits the aabb
//! @return true ray was clipped else false
bool ClipRayWithAabb ( const Aabb & aabb , Vector3 & rayStart , Vector3 & rayEnd , float & tClipStart , float & tClipEnd ) ;
//! Test segment and aabb where the segment is defined by midpoint
//! midPoint = (p1-p0) * 0.5f and half vector halfVector = p1 - midPoint.
//! the aabb is at the origin and defined by half extents only.
//!
//! @param midPoint midpoint of a line segment
//! @param halfVector half vector of an aabb
//! @param aabbExtends the extends of a bounded box
//! @return 1 if the intersect, otherwise 0 .
//! @return true if the intersect, otherwise false .
bool TestSegmentAABBOrigin ( const Vector3 & midPoint , const Vector3 & halfVector , const Vector3 & aabbExtends ) ;
//! Test if segment specified by points p0 and p1 intersects AABB. \ref TestSegmentAABBOrigin
//!
//! @param p0 point 1
//! @param p1 point 2
//! @param aabb bounded box
@ -130,9 +126,9 @@ namespace AZ
//! Ray sphere intersection result types.
enum SphereIsectTypes : AZ : : s32
{
ISECT_RAY_SPHERE_SA_INSIDE = - 1 , // the ray starts inside the cylinder
ISECT_RAY_SPHERE_NONE , // no intersection
ISECT_RAY_SPHERE_ISECT , // along the PQ segment
ISECT_RAY_SPHERE_SA_INSIDE = - 1 , // !< the ray starts inside the cylinder
ISECT_RAY_SPHERE_NONE , // !< no intersection
ISECT_RAY_SPHERE_ISECT , // !< along the PQ segment
} ;
//! IntersectRaySphereOrigin
@ -147,25 +143,26 @@ namespace AZ
const Vector3 & rayStart , const Vector3 & rayDirNormalized , const float sphereRadius , float & t ) ;
//! Intersect ray (rayStart,rayDirNormalized) and sphere (sphereCenter,sphereRadius) \ref IntersectRaySphereOrigin
//!
//! @param ray Start
//! @param rayDirNormalized
//! @param sphere Center
//! @param sphereRadius
//! @param t
//! @return SphereIsectTypes
//! @param rayStart the start of the ray
//! @param ray DirNormalized the direction of the ray normalized
//! @param sphereCenter the center of the sphere
//! @param sphere Radius radius of the sphere
//! @param [out] t coefficient in the ray's explicit equation from which an
//! intersecting point is calculated as "rayOrigin + t1 * rayDir".
//! @return SphereIsectTypes
SphereIsectTypes IntersectRaySphere (
const Vector3 & rayStart , const Vector3 & rayDirNormalized , const Vector3 & sphereCenter , const float sphereRadius , float & t ) ;
//! @param rayOrigin The origin of the ray to test.
//! @param rayDir The direction of the ray to test. It has to be unit length.
//! @param diskCenter Center point of the disk
//! @param diskRadius Radius of the disk
//! @param diskNormal A normal perpendicular to the disk
//! @param[out] t If returning 1 (indicating a hit), this contains distance from rayOrigin along the normalized rayDir
//! Intersect ray (rayStarty, rayDirNormalized) and disk (center, radius, normal)
//! @param rayOrigin The origin of the ray to test.
//! @param rayDir The direction of the ray to test. It has to be unit length.
//! @param diskCenter Center point of the disk
//! @param diskRadius Radius of the disk
//! @param diskNormal A normal perpendicular to the disk
//! @param[out] t If returning 1 (indicating a hit), this contains distance from rayOrigin along the normalized rayDir
//! that the hit occured at.
//! @return The number of intersecting points.
int IntersectRayDisk (
//! @return false if not interesecting and true if intersecting
bool IntersectRayDisk (
const Vector3 & rayOrigin ,
const Vector3 & rayDir ,
const Vector3 & diskCenter ,
@ -174,17 +171,14 @@ namespace AZ
float & t ) ;
//! If there is only one intersecting point, the coefficient is stored in \ref t1.
//! @param rayOrigin The origin of the ray to test.
//! @param rayDir The direction of the ray to test. It has to be unit length.
//! @param cylinderEnd1 The center of the circle on one end of the cylinder.
//! @param cylinderDir The direction pointing from \ref cylinderEnd1 to the other end of the cylinder. It has to be unit
//! length.
//! @param cylinderHeight The distance between two centers of the circles on two ends of the cylinder respectively.
//! @param[out] t1 A possible coefficient in the ray's explicit equation from which an intersecting point is calculated
//! as "rayOrigin + t1 * rayDir".
//! @param[out] t2 A possible coefficient in the ray's explicit equation from which an intersecting point is calculated
//! as "rayOrigin + t2 * rayDir".
//! @return The number of intersecting points.
//! @param rayOrigin The origin of the ray to test.
//! @param rayDir The direction of the ray to test. It has to be unit length.
//! @param cylinderEnd1 The center of the circle on one end of the cylinder.
//! @param cylinderDir The direction pointing from \ref cylinderEnd1 to the other end of the cylinder. It has to be unit length.
//! @param cylinderHeight The distance between two centers of the circles on two ends of the cylinder respectively.
//! @param[out] t1 A possible coefficient in the ray's explicit equation from which an intersecting point is calculated as "rayOrigin + t1 * rayDir".
//! @param[out] t2 A possible coefficient in the ray's explicit equation from which an intersecting point is calculated as "rayOrigin + t2 * rayDir".
//! @return The number of intersecting points.
int IntersectRayCappedCylinder (
const Vector3 & rayOrigin ,
const Vector3 & rayDir ,
@ -196,17 +190,15 @@ namespace AZ
float & t2 ) ;
//! If there is only one intersecting point, the coefficient is stored in \ref t1.
//! @param rayOrigin The origin of the ray to test.
//! @param rayDir The direction of the ray to test. It has to be unit length.
//! @param coneApex The apex of the cone.
//! @param coneDir The unit-length direction from the apex to the base.
//! @param coneHeight The height of the cone, from the apex to the base.
//! @param coneBaseRadius The radius of the cone base circle.
//! @param[out] t1 A possible coefficient in the ray's explicit equation from which an intersecting point is calculated
//! as "rayOrigin + t1 * rayDir".
//! @param[out] t2 A possible coefficient in the ray's explicit equation from which an intersecting point is calculated
//! as "rayOrigin + t2 * rayDir".
//! @return The number of intersecting points.
//! @param rayOrigin The origin of the ray to test.
//! @param rayDir The direction of the ray to test. It has to be unit length.
//! @param coneApex The apex of the cone.
//! @param coneDir The unit-length direction from the apex to the base.
//! @param coneHeight The height of the cone, from the apex to the base.
//! @param coneBaseRadius The radius of the cone base circle.
//! @param[out] t1 A possible coefficient in the ray's explicit equation from which an intersecting point is calculated as "rayOrigin + t1 * rayDir".
//! @param[out] t2 A possible coefficient in the ray's explicit equation from which an intersecting point is calculated as "rayOrigin + t2 * rayDir".
//! @return The number of intersecting points.
int IntersectRayCone (
const Vector3 & rayOrigin ,
const Vector3 & rayDir ,
@ -218,11 +210,11 @@ namespace AZ
float & t2 ) ;
//! Test intersection between a ray and a plane in 3D.
//! @param rayOrigin The origin of the ray to test intersection with.
//! @param rayDir The direction of the ray to test intersection with.
//! @param planePos A point on the plane to test intersection with.
//! @param planeNormal The normal of the plane to test intersection with.
//! @param t[out] The coefficient in the ray's explicit equation from which the intersecting point is calculated as "rayOrigin + t * rayDirection".
//! @param rayOrigin The origin of the ray to test intersection with.
//! @param rayDir The direction of the ray to test intersection with.
//! @param planePos A point on the plane to test intersection with.
//! @param planeNormal The normal of the plane to test intersection with.
//! @param [out] t The coefficient in the ray's explicit equation from which the intersecting point is calculated as "rayOrigin + t * rayDirection".
//! @return The number of intersection point.
int IntersectRayPlane (
const Vector3 & rayOrigin , const Vector3 & rayDir , const Vector3 & planePos , const Vector3 & planeNormal , float & t ) ;
@ -230,13 +222,14 @@ namespace AZ
//! Test intersection between a ray and a two-sided quadrilateral defined by four points in 3D.
//! The four points that define the quadrilateral could be passed in with either counter clock-wise
//! winding or clock-wise winding.
//! @param rayOrigin The origin of the ray to test intersection with.
//! @param rayDir The direction of the ray to test intersection with.
//! @param vertexA One of the four points that define the quadrilateral.
//! @param vertexB One of the four points that define the quadrilateral.
//! @param vertexC One of the four points that define the quadrilateral.
//! @param vertexD One of the four points that define the quadrilateral.
//! @param t[out] The coefficient in the ray's explicit equation from which the intersecting point is calculated as "rayOrigin + t * rayDirection".
//! @param rayOrigin The origin of the ray to test intersection with.
//! @param rayDir The direction of the ray to test intersection with.
//! @param vertexA One of the four points that define the quadrilateral.
//! @param vertexB One of the four points that define the quadrilateral.
//! @param vertexC One of the four points that define the quadrilateral.
//! @param vertexD One of the four points that define the quadrilateral.
//! @param[out] t The coefficient in the ray's explicit equation from which the
//! intersecting point is calculated as "rayOrigin + t * rayDirection".
//! @return The number of intersection point.
int IntersectRayQuad (
const Vector3 & rayOrigin ,
@ -248,19 +241,18 @@ namespace AZ
float & t ) ;
//! Test intersection between a ray and an oriented box in 3D.
//!
//! @param rayOrigin The origin of the ray to test intersection with.
//! @param rayDir The direction of the ray to test intersection with.
//! @param boxCenter The position of the center of the box.
//! @param boxAxis1 An axis along one dimension of the oriented box.
//! @param boxAxis2 An axis along one dimension of the oriented box.
//! @param boxAxis3 An axis along one dimension of the oriented box.
//! @param boxHalfExtent1 The half extent of the box on the dimension of \ref boxAxis1.
//! @param boxHalfExtent2 The half extent of the box on the dimension of \ref boxAxis2.
//! @param boxHalfExtent3 The half extent of the box on the dimension of \ref boxAxis3.
//! @param t[out] The coefficient in the ray's explicit equation from which the intersecting point is calculated as "rayOrigin + t * rayDirection".
//! @return 1 if there is an intersection, 0 otherwise.
int IntersectRayBox (
//! @param rayOrigin The origin of the ray to test intersection with.
//! @param rayDir The direction of the ray to test intersection with.
//! @param boxCenter The position of the center of the box.
//! @param boxAxis1 An axis along one dimension of the oriented box.
//! @param boxAxis2 An axis along one dimension of the oriented box.
//! @param boxAxis3 An axis along one dimension of the oriented box.
//! @param boxHalfExtent1 The half extent of the box on the dimension of \ref boxAxis1.
//! @param boxHalfExtent2 The half extent of the box on the dimension of \ref boxAxis2.
//! @param boxHalfExtent3 The half extent of the box on the dimension of \ref boxAxis3.
//! @param[out] t The coefficient in the ray's explicit equation from which the intersecting point is calculated as "rayOrigin + t * rayDirection".
//! @return true if there is an intersection, false otherwise.
bool IntersectRayBox (
const Vector3 & rayOrigin ,
const Vector3 & rayDir ,
const Vector3 & boxCenter ,
@ -273,23 +265,21 @@ namespace AZ
float & t ) ;
//! Test intersection between a ray and an OBB.
//!
//! @param rayOrigin The origin of the ray to test intersection with.
//! @param rayDir The direction of the ray to test intersection with.
//! @param obb The OBB to test for intersection with the ray.
//! @param t[out] The coefficient in the ray's explicit equation from which the intersecting point is calculated as "rayOrigin + t *
//! rayDirection".
//! @return 1 if there is an intersection, 0 otherwise.
int IntersectRayObb ( const Vector3 & rayOrigin , const Vector3 & rayDir , const Obb & obb , float & t ) ;
//! @param[out] t The coefficient in the ray's explicit equation from which the intersecting point is calculated as "rayOrigin + t * rayDirection".
//! @return true if there is an intersection, false otherwise.
bool IntersectRayObb ( const Vector3 & rayOrigin , const Vector3 & rayDir , const Obb & obb , float & t ) ;
//! Ray cylinder intersection types.
enum CylinderIsectTypes : AZ : : s32
{
RR_ISECT_RAY_CYL_SA_INSIDE = - 1 , // the ray starts inside the cylinder
RR_ISECT_RAY_CYL_NONE , // no intersection
RR_ISECT_RAY_CYL_PQ , // along the PQ segment
RR_ISECT_RAY_CYL_P_SIDE , // on the P side
RR_ISECT_RAY_CYL_Q_SIDE , // on the Q side
RR_ISECT_RAY_CYL_SA_INSIDE = - 1 , // !< the ray starts inside the cylinder
RR_ISECT_RAY_CYL_NONE , // !< no intersection
RR_ISECT_RAY_CYL_PQ , // !< along the PQ segment
RR_ISECT_RAY_CYL_P_SIDE , // !< on the P side
RR_ISECT_RAY_CYL_Q_SIDE , // !< on the Q side
} ;
//! Reference: Real-Time Collision Detection - 5.3.7 Intersecting Ray or Segment Against Cylinder
@ -300,7 +290,7 @@ namespace AZ
//! @param p center point of side 1 cylinder
//! @param q center point of side 2 cylinder
//! @param r radius of cylinder
//! @param t[out] proporition along line semgne t
//! @param [out] t proporition along line segmen t
//! @return CylinderIsectTypes
CylinderIsectTypes IntersectSegmentCylinder (
const Vector3 & sa , const Vector3 & dir , const Vector3 & p , const Vector3 & q , const float r , float & t ) ;
@ -308,26 +298,41 @@ namespace AZ
//! Capsule ray intersect types.
enum CapsuleIsectTypes
{
ISECT_RAY_CAPSULE_SA_INSIDE = - 1 , // the ray starts inside the cylinder
ISECT_RAY_CAPSULE_NONE , // no intersection
ISECT_RAY_CAPSULE_PQ , // along the PQ segment
ISECT_RAY_CAPSULE_P_SIDE , // on the P side
ISECT_RAY_CAPSULE_Q_SIDE , // on the Q side
ISECT_RAY_CAPSULE_SA_INSIDE = - 1 , // !< the ray starts inside the cylinder
ISECT_RAY_CAPSULE_NONE , // !< no intersection
ISECT_RAY_CAPSULE_PQ , // !< along the PQ segment
ISECT_RAY_CAPSULE_P_SIDE , // !< on the P side
ISECT_RAY_CAPSULE_Q_SIDE , // !< on the Q side
} ;
//! This is a quick implementation of segment capsule based on segment cylinder \ref IntersectSegmentCylinder
//! segment sphere intersection. We can optimize it a lot once we fix the ray
//! cylinder intersection.
//!
//! @param sa the beginning of the line segment
//! @param dir the direction and length of the segment
//! @param p center point of side 1 capsule
//! @param q center point of side 1 capsule
//! @param r the radius of the capsule
//! @param[out] t proporition along line segment
//! @return CapsuleIsectTypes
CapsuleIsectTypes IntersectSegmentCapsule (
const Vector3 & sa , const Vector3 & dir , const Vector3 & p , const Vector3 & q , const float r , float & t ) ;
//! Intersect segment S(t)=A+t(B-A), 0<=t<=1 against convex polyhedron specified
//! by the n halfspaces defined by the planes p[]. On exit tfirst and tlast
//! define the intersection, if any.
//! @param sa the beggining of the line segment
//! @param dir the direction and length of the segment
//! @param p planes that compose a convex ponvex polyhedron
//! @param numPlanes number of planes
//! @param[out] tfirst proportion along the line segment where the line enters
//! @param[out] tlast proportion along the line segment where the line exits
//! @param[out] iFirstPlane the plane where the line enters
//! @param[out] iLastPlane the plane where the line exits
//! @return true if intersects else false
bool IntersectSegmentPolyhedron (
const Vector3 & sa ,
const Vector3 & sBA ,
const Vector3 & dir ,
const Plane p [ ] ,
int numPlanes ,
float & tfirst ,
@ -335,7 +340,7 @@ namespace AZ
int & iFirstPlane ,
int & iLastPlane ) ;
//! Calculate the line segment closestPointSegment1<->closestPointSegment2 that is the shortest route between
//! Calculate the line segment closestPointSegment1<->closestPointSegment2 that is the shortest route between
//! two segments segment1Start<->segment1End and segment2Start<->segment2End. Also calculate the values of segment1Proportion and
//! segment2Proportion where closestPointSegment1 = segment1Start + (segment1Proportion * (segment1End - segment1Start))
//! closestPointSegment2 = segment2Start + (segment2Proportion * (segment2End - segment2Start))
@ -344,10 +349,10 @@ namespace AZ
//! @param segment1End end of segment 1.
//! @param segment2Start start of segment 2.
//! @param segment2End end of segment 2.
//! @param segment1Proportion[out] the proporition along segment 1 [0..1]
//! @param segment2Proportion[out] the proporition along segment 2 [0..1]
//! @param closestPointSegment1[out] closest point on segment 1.
//! @param closestPointSegment2[out] closest point on segment 2.
//! @param [out] segment1Proportion the proporition along segment 1 [0..1]
//! @param [out] segment2Proportion the proporition along segment 2 [0..1]
//! @param [out] closestPointSegment1 closest point on segment 1.
//! @param [out] closestPointSegment2 closest point on segment 2.
//! @param epsilon the minimum square distance where a line segment can be treated as a single point.
void ClosestSegmentSegment (
const Vector3 & segment1Start ,
@ -363,13 +368,12 @@ namespace AZ
//! Calculate the line segment closestPointSegment1<->closestPointSegment2 that is the shortest route between
//! two segments segment1Start<->segment1End and segment2Start<->segment2End.
//! If segments are parallel returns a solution.
//!
//! @param segment1Start start of segment 1.
//! @param segment1End end of segment 1.
//! @param segment2Start start of segment 2.
//! @param segment2End end of segment 2.
//! @param closestPointSegment1[out] closest point on segment 1.
//! @param closestPointSegment2[out] closest point on segment 2.
//! @param [out] closestPointSegment1 closest point on segment 1.
//! @param [out] closestPointSegment2 closest point on segment 2.
//! @param epsilon the minimum square distance where a line segment can be treated as a single point.
void ClosestSegmentSegment (
const Vector3 & segment1Start ,
@ -383,12 +387,11 @@ namespace AZ
//! Calculate the point (closestPointOnSegment) that is the closest point on
//! segment segmentStart/segmentEnd to point. Also calculate the value of proportion where
//! closestPointOnSegment = segmentStart + (proportion * (segmentEnd - segmentStart))
//!
//! @param point the point to test
//! @param segmentStart the start of the segment
//! @param segmentEnd the end of the segment
//! @param proportion[out] the proportion of the segment L(t) = (end - start) * t
//! @param closestPointOnSegment[out] the point along the line segment
//! @param [out] proportion the proportion of the segment L(t) = (end - start) * t
//! @param [out] closestPointOnSegment the point along the line segment
void ClosestPointSegment (
const Vector3 & point ,
const Vector3 & segmentStart ,