📄 wmlintrtri3sph3.cpp
字号:
{
if ( bInside[2] )
{
// potential intersection with edge 1
kSeg.Origin() = akV[1];
kSeg.Direction() = akE[1];
return FindIntersection(kSeg,rkTriVelocity,rkSphere,
rkSphVelocity,rfTFirst,fTMax,riQuantity,akP);
}
else // !bInside[2]
{
// potential intersection with edges 1,2
return FindTriSphrCoplanarIntersection(2,akV,kN,akExN[2],
akE[2],rkSphere,rkTriVelocity,rkSphVelocity,rfTFirst,
fTMax,riQuantity,akP);
}
}
}
else // !bInside[0]
{
if ( bInside[1] )
{
if ( bInside[2] )
{
// potential intersection with edge 0
kSeg.Origin() = akV[0];
kSeg.Direction() = akE[0];
return FindIntersection(kSeg,rkTriVelocity,rkSphere,
rkSphVelocity,rfTFirst,fTMax,riQuantity,akP);
}
else // !bInside[2]
{
// potential intersection with edges 2,0
return FindTriSphrCoplanarIntersection(0,akV,kN,akExN[0],
akE[0],rkSphere,rkTriVelocity,rkSphVelocity,rfTFirst,
fTMax,riQuantity,akP);
}
}
else // !bInside[1]
{
if ( bInside[2] )
{
// potential intersection with edges 0,1
return FindTriSphrCoplanarIntersection(1,akV,kN,akExN[1],
akE[1],rkSphere,rkTriVelocity,rkSphVelocity,rfTFirst,
fTMax,riQuantity,akP);
}
else // !bInside[2]
{
// we should not get here
assert( false );
return false;
}
}
}
}
else
{
// sphere does not currently intersect the plane of the triangle
// sphere moving, triangle stationary
Vector3<Real> kVel = rkSphVelocity - rkTriVelocity;
// Find point of intersection of the sphere and the triangle
// plane. Where this point occurs on the plane relative to the
// triangle determines the potential kind of intersection.
kN.Normalize();
// Point on sphere we care about intersecting the triangle plane
Vector3<Real> kSpherePoint;
// Which side of the triangle is the sphere on?
if ( fNdC > fNdT )
{
// positive side
if ( kVel.Dot(kN) >= (Real)0.0 )
{
// moving away, easy out
return false;
}
kSpherePoint = rkSphere.Center() - rkSphere.Radius()*kN;
}
else
{
// negative side
if ( kVel.Dot(kN) <= (Real)0.0 )
{
// moving away, easy out
return false;
}
kSpherePoint = rkSphere.Center() + rkSphere.Radius()*kN;
}
// find intersection of velocity ray and triangle plane
// project ray and plane onto the plane normal
Real fPlane = kN.Dot(akV[0]);
Real fPoint = kN.Dot(kSpherePoint);
Real fVel = kN.Dot(kVel);
Real fTime = (fPlane - fPoint)/fVel;
// where this intersects
Vector3<Real> kIntrPoint = kSpherePoint + fTime*kVel;
// see which edges this intersection point is inside/outside of
bool bInside[3];
for (int i = 0; i < 3; i++ )
bInside[i] = (akExN[i].Dot(kIntrPoint) >= akExN[i].Dot(akV[i]));
if ( bInside[0] )
{
if ( bInside[1] )
{
if ( bInside[2] )
{
// intersects face at time fTime
if ( fTime > fTMax )
{
// intersection after tMax
return false;
}
else
{
rfTFirst = fTime;
riQuantity = 1;
// kIntrPoint is the point in space, assuming that
// TriVel is 0. Re-adjust the point to where it
// should be, were it not.
akP[0] = kIntrPoint + fTime*rkTriVelocity;
return true;
}
}
else // !bInside[2]
{
// potential intersection with edge 2
kSeg.Origin() = akV[2];
kSeg.Direction() = akE[2];
return FindIntersection(kSeg,rkTriVelocity,rkSphere,
rkSphVelocity,rfTFirst,fTMax,riQuantity,akP);
}
}
else // !bInside[1]
{
if ( bInside[2] )
{
// potential intersection with edge 1
kSeg.Origin() = akV[1];
kSeg.Direction() = akE[1];
return FindIntersection(kSeg,rkTriVelocity,rkSphere,
rkSphVelocity,rfTFirst,fTMax,riQuantity,akP);
}
else // !bInside[2]
{
// potential intersection with vertex 2
return FindSphereVertexIntersection(akV[2],rkSphere,
rkSphVelocity,rkTriVelocity,rfTFirst,fTMax,
riQuantity,akP);
}
}
}
else // !bInside[0]
{
if ( bInside[1] )
{
if ( bInside[2] )
{
// potential intersection with edge 0
kSeg.Origin() = akV[0];
kSeg.Direction() = akE[0];
return FindIntersection(kSeg,rkTriVelocity,rkSphere,
rkSphVelocity,rfTFirst,fTMax,riQuantity,akP);
}
else // !bInside[2]
{
// potential intersection with vertex 0
return FindSphereVertexIntersection(akV[0],rkSphere,
rkSphVelocity,rkTriVelocity,rfTFirst,fTMax,
riQuantity,akP);
}
}
else // !bInside[1]
{
if ( bInside[2] )
{
// potential intersection with vertex 1
return FindSphereVertexIntersection(akV[1],rkSphere,
rkSphVelocity,rkTriVelocity,rfTFirst,fTMax,
riQuantity,akP);
}
else // !bInside[2]
{
// we should not get here
assert( false );
return false;
}
}
}
}
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
// explicit instantiation
//----------------------------------------------------------------------------
namespace Wml
{
template WML_ITEM bool TestIntersection<float> (
const Triangle3<float>&, const Sphere3<float>&);
template WML_ITEM bool FindIntersection<float> (
const Triangle3<float>&, const Vector3<float>&,
const Sphere3<float>&, const Vector3<float>&, float&, float, int&,
Vector3<float>[6]);
template WML_ITEM bool TestIntersection<double> (
const Triangle3<double>&, const Sphere3<double>&);
template WML_ITEM bool FindIntersection<double> (
const Triangle3<double>&, const Vector3<double>&,
const Sphere3<double>&, const Vector3<double>&, double&, double, int&,
Vector3<double>[6]);
}
//----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -