📄 wmlintrbox3box3.cpp
字号:
{
riQuantity = 1;
akP[0] = GetPoint(rkUC.m_aiIndex[0],kNewBox1);
}
else if ( rkUC.m_kMap == m2_2 )
{
if ( rkVC.m_kMap == m2_2 )
{
// box0edge-box1edge intersection
Vector3<Real> akEdge0[2], akEdge1[2];
akEdge0[0] = GetPoint(rkUC.m_aiIndex[6],kNewBox0);
akEdge0[1] = GetPoint(rkUC.m_aiIndex[7],kNewBox0);
akEdge1[0] = GetPoint(rkVC.m_aiIndex[0],kNewBox1);
akEdge1[1] = GetPoint(rkVC.m_aiIndex[1],kNewBox1);
FindContactSetLinLin(akEdge0,akEdge1,riQuantity,akP);
}
else // rkVC.m_kMap == m44
{
// box0edge-box1face intersection
Vector3<Real> akEdge0[2], akFace1[4];
akEdge0[0] = GetPoint(rkUC.m_aiIndex[6],kNewBox0);
akEdge0[1] = GetPoint(rkUC.m_aiIndex[7],kNewBox0);
akFace1[0] = GetPoint(rkVC.m_aiIndex[0],kNewBox1);
akFace1[1] = GetPoint(rkVC.m_aiIndex[1],kNewBox1);
akFace1[2] = GetPoint(rkVC.m_aiIndex[2],kNewBox1);
akFace1[3] = GetPoint(rkVC.m_aiIndex[3],kNewBox1);
FindContactSetCoplanarLineRect(akEdge0,akFace1,riQuantity,
akP);
}
}
else // rkUC.m_kMap == m44
{
if ( rkVC.m_kMap == m2_2 )
{
// box0face-box1edge intersection
Vector3<Real> akFace0[4], akEdge1[2];
akFace0[0] = GetPoint(rkUC.m_aiIndex[4],kNewBox0);
akFace0[1] = GetPoint(rkUC.m_aiIndex[5],kNewBox0);
akFace0[2] = GetPoint(rkUC.m_aiIndex[6],kNewBox0);
akFace0[3] = GetPoint(rkUC.m_aiIndex[7],kNewBox0);
akEdge1[0] = GetPoint(rkVC.m_aiIndex[0],kNewBox1);
akEdge1[1] = GetPoint(rkVC.m_aiIndex[1],kNewBox1);
FindContactSetCoplanarLineRect(akEdge1,akFace0,riQuantity,
akP);
}
else // rkVC.m_kMap == m44
{
// box0face-box1face intersection
Vector3<Real> akFace0[4], akFace1[4];
akFace0[0] = GetPoint(rkUC.m_aiIndex[4],kNewBox0);
akFace0[1] = GetPoint(rkUC.m_aiIndex[5],kNewBox0);
akFace0[2] = GetPoint(rkUC.m_aiIndex[6],kNewBox0);
akFace0[3] = GetPoint(rkUC.m_aiIndex[7],kNewBox0);
akFace1[0] = GetPoint(rkVC.m_aiIndex[0],kNewBox1);
akFace1[1] = GetPoint(rkVC.m_aiIndex[1],kNewBox1);
akFace1[2] = GetPoint(rkVC.m_aiIndex[2],kNewBox1);
akFace1[3] = GetPoint(rkVC.m_aiIndex[3],kNewBox1);
FindContactSetCoplanarRectRect(akFace0,akFace1,riQuantity,
akP);
}
}
}
}
//----------------------------------------------------------------------------
template <class Real>
bool Wml::TestIntersection (Real fTime, const Box3<Real>& rkBox0,
const Vector3<Real>& rkVel0, const Box3<Real>& rkBox1,
const Vector3<Real>& rkVel1)
{
// convenience variables
const Vector3<Real>* akA = rkBox0.Axes();
const Vector3<Real>* akB = rkBox1.Axes();
const Real* afEA = rkBox0.Extents();
const Real* afEB = rkBox1.Extents();
// Compute relative velocity of box1 with respect to box0 so that box0
// may as well be stationary.
Vector3<Real> kW = rkVel1 - rkVel0;
// Compute difference of box centers at time 0 and time 'fTime'.
Vector3<Real> kD0 = rkBox1.Center() - rkBox0.Center();
Vector3<Real> kD1 = kD0 + fTime*kW;
Real aafC[3][3]; // matrix C = A^T B, c_{ij} = Dot(A_i,B_j)
Real aafAbsC[3][3]; // |c_{ij}|
Real afAD0[3]; // Dot(A_i,D0)
Real afAD1[3]; // Dot(A_i,D1)
Real fR0, fR1, fR; // interval radii and distance between centers
Real fR01; // = R0 + R1
// axis C0+t*A0
aafC[0][0] = akA[0].Dot(akB[0]);
aafC[0][1] = akA[0].Dot(akB[1]);
aafC[0][2] = akA[0].Dot(akB[2]);
afAD0[0] = akA[0].Dot(kD0);
afAD1[0] = akA[0].Dot(kD1);
aafAbsC[0][0] = Math<Real>::FAbs(aafC[0][0]);
aafAbsC[0][1] = Math<Real>::FAbs(aafC[0][1]);
aafAbsC[0][2] = Math<Real>::FAbs(aafC[0][2]);
fR1 = afEB[0]*aafAbsC[0][0]+afEB[1]*aafAbsC[0][1]+afEB[2]*aafAbsC[0][2];
fR01 = afEA[0] + fR1;
if ( afAD0[0] > fR01 )
{
if ( afAD1[0] > fR01 )
return false;
}
else if ( afAD0[0] < -fR01 )
{
if ( afAD1[0] < -fR01 )
return false;
}
// axis C0+t*A1
aafC[1][0] = akA[1].Dot(akB[0]);
aafC[1][1] = akA[1].Dot(akB[1]);
aafC[1][2] = akA[1].Dot(akB[2]);
afAD0[1] = akA[1].Dot(kD0);
afAD1[1] = akA[1].Dot(kD1);
aafAbsC[1][0] = Math<Real>::FAbs(aafC[1][0]);
aafAbsC[1][1] = Math<Real>::FAbs(aafC[1][1]);
aafAbsC[1][2] = Math<Real>::FAbs(aafC[1][2]);
fR1 = afEB[0]*aafAbsC[1][0]+afEB[1]*aafAbsC[1][1]+afEB[2]*aafAbsC[1][2];
fR01 = afEA[1] + fR1;
if ( afAD0[1] > fR01 )
{
if ( afAD1[1] > fR01 )
return false;
}
else if ( afAD0[1] < -fR01 )
{
if ( afAD1[1] < -fR01 )
return false;
}
// axis C0+t*A2
aafC[2][0] = akA[2].Dot(akB[0]);
aafC[2][1] = akA[2].Dot(akB[1]);
aafC[2][2] = akA[2].Dot(akB[2]);
afAD0[2] = akA[2].Dot(kD0);
afAD1[2] = akA[2].Dot(kD1);
aafAbsC[2][0] = Math<Real>::FAbs(aafC[2][0]);
aafAbsC[2][1] = Math<Real>::FAbs(aafC[2][1]);
aafAbsC[2][2] = Math<Real>::FAbs(aafC[2][2]);
fR1 = afEB[0]*aafAbsC[2][0]+afEB[1]*aafAbsC[2][1]+afEB[2]*aafAbsC[2][2];
fR01 = afEA[2] + fR1;
if ( afAD0[2] > fR01 )
{
if ( afAD1[2] > fR01 )
return false;
}
else if ( afAD0[2] < -fR01 )
{
if ( afAD1[2] < -fR01 )
return false;
}
// axis C0+t*B0
fR = akB[0].Dot(kD0);
fR0 = afEA[0]*aafAbsC[0][0]+afEA[1]*aafAbsC[1][0]+afEA[2]*aafAbsC[2][0];
fR01 = fR0 + afEB[0];
if ( fR > fR01 )
{
fR = akB[0].Dot(kD1);
if ( fR > fR01)
return false;
}
else if ( fR < -fR01 )
{
fR = akB[0].Dot(kD1);
if ( fR < -fR01 )
return false;
}
// axis C0+t*B1
fR = akB[1].Dot(kD0);
fR0 = afEA[0]*aafAbsC[0][1]+afEA[1]*aafAbsC[1][1]+afEA[2]*aafAbsC[2][1];
fR01 = fR0 + afEB[1];
if ( fR > fR01 )
{
fR = akB[1].Dot(kD1);
if ( fR > fR01 )
return false;
}
else if ( fR < -fR01 )
{
fR = akB[1].Dot(kD1);
if ( fR < -fR01 )
return false;
}
// axis C0+t*B2
fR = akB[2].Dot(kD0);
fR0 = afEA[0]*aafAbsC[0][2]+afEA[1]*aafAbsC[1][2]+afEA[2]*aafAbsC[2][2];
fR01 = fR0 + afEB[2];
if ( fR > fR01 )
{
fR = akB[2].Dot(kD1);
if ( fR > fR01 )
return false;
}
else if ( fR < -fR01 )
{
fR = akB[2].Dot(kD1);
if ( fR < -fR01 )
return false;
}
// axis C0+t*A0xB0
fR = afAD0[2]*aafC[1][0]-afAD0[1]*aafC[2][0];
fR0 = afEA[1]*aafAbsC[2][0] + afEA[2]*aafAbsC[1][0];
fR1 = afEB[1]*aafAbsC[0][2] + afEB[2]*aafAbsC[0][1];
fR01 = fR0 + fR1;
if ( fR > fR01 )
{
fR = afAD1[2]*aafC[1][0]-afAD1[1]*aafC[2][0];
if ( fR > fR01 )
return false;
}
else if ( fR < -fR01 )
{
fR = afAD1[2]*aafC[1][0]-afAD1[1]*aafC[2][0];
if ( fR < -fR01 )
return false;
}
// axis C0+t*A0xB1
fR = afAD0[2]*aafC[1][1]-afAD0[1]*aafC[2][1];
fR0 = afEA[1]*aafAbsC[2][1] + afEA[2]*aafAbsC[1][1];
fR1 = afEB[0]*aafAbsC[0][2] + afEB[2]*aafAbsC[0][0];
fR01 = fR0 + fR1;
if ( fR > fR01 )
{
fR = afAD1[2]*aafC[1][1]-afAD1[1]*aafC[2][1];
if ( fR > fR01 )
return false;
}
else if ( fR < -fR01 )
{
fR = afAD1[2]*aafC[1][1]-afAD1[1]*aafC[2][1];
if ( fR < -fR01 )
return false;
}
// axis C0+t*A0xB2
fR = afAD0[2]*aafC[1][2]-afAD0[1]*aafC[2][2];
fR0 = afEA[1]*aafAbsC[2][2] + afEA[2]*aafAbsC[1][2];
fR1 = afEB[0]*aafAbsC[0][1] + afEB[1]*aafAbsC[0][0];
fR01 = fR0 + fR1;
if ( fR > fR01 )
{
fR = afAD1[2]*aafC[1][2]-afAD1[1]*aafC[2][2];
if ( fR > fR01 )
return false;
}
else if ( fR < -fR01 )
{
fR = afAD1[2]*aafC[1][2]-afAD1[1]*aafC[2][2];
if ( fR < -fR01 )
return false;
}
// axis C0+t*A1xB0
fR = afAD0[0]*aafC[2][0]-afAD0[2]*aafC[0][0];
fR0 = afEA[0]*aafAbsC[2][0] + afEA[2]*aafAbsC[0][0];
fR1 = afEB[1]*aafAbsC[1][2] + afEB[2]*aafAbsC[1][1];
fR01 = fR0 + fR1;
if ( fR > fR01 )
{
fR = afAD1[0]*aafC[2][0]-afAD1[2]*aafC[0][0];
if ( fR > fR01 )
return false;
}
else if ( fR < -fR01 )
{
fR = afAD1[0]*aafC[2][0]-afAD1[2]*aafC[0][0];
if ( fR < -fR01 )
return false;
}
// axis C0+t*A1xB1
fR = afAD0[0]*aafC[2][1]-afAD0[2]*aafC[0][1];
fR0 = afEA[0]*aafAbsC[2][1] + afEA[2]*aafAbsC[0][1];
fR1 = afEB[0]*aafAbsC[1][2] + afEB[2]*aafAbsC[1][0];
fR01 = fR0 + fR1;
if ( fR > fR01 )
{
fR = afAD1[0]*aafC[2][1]-afAD1[2]*aafC[0][1];
if ( fR > fR01 )
return false;
}
else if ( fR < -fR01 )
{
fR = afAD1[0]*aafC[2][1]-afAD1[2]*aafC[0][1];
if ( fR < -fR01 )
return false;
}
// axis C0+t*A1xB2
fR = afAD0[0]*aafC[2][2]-afAD0[2]*aafC[0][2];
fR0 = afEA[0]*aafAbsC[2][2] + afEA[2]*aafAbsC[0][2];
fR1 = afEB[0]*aafAbsC[1][1] + afEB[1]*aafAbsC[1][0];
fR01 = fR0 + fR1;
if ( fR > fR01 )
{
fR = afAD1[0]*aafC[2][2]-afAD1[2]*aafC[0][2];
if ( fR > fR01 )
return false;
}
else if ( fR < -fR01 )
{
fR = afAD1[0]*aafC[2][2]-afAD1[2]*aafC[0][2];
if ( fR < -fR01 )
return false;
}
// axis C0+t*A2xB0
fR = afAD0[1]*aafC[0][0]-afAD0[0]*aafC[1][0];
fR0 = afEA[0]*aafAbsC[1][0] + afEA[1]*aafAbsC[0][0];
fR1 = afEB[1]*aafAbsC[2][2] + afEB[2]*aafAbsC[2][1];
fR01 = fR0 + fR1;
if ( fR > fR01 )
{
fR = afAD1[1]*aafC[0][0]-afAD1[0]*aafC[1][0];
if ( fR > fR01 )
return false;
}
else if ( fR < -fR01 )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -