20 template <
typename Real>
43 void SetMaxLCPIterations(
int maxLCPIterations);
52 template <
typename Real>
55 mLCP.SetMaxIterations(maxLCPIterations);
58 template <
typename Real>
70 for (
int i = 0; i < 3; ++i)
72 V[i] =
Dot(box.axis[i], tempV) + box.extent[i];
73 E0[i] =
Dot(box.axis[i], rectangle.axis[0]);
74 E1[i] =
Dot(box.axis[i], rectangle.axis[1]);
80 V -= scaledE0 + scaledE1;
81 E0 = scaledE0 * (Real)2;
82 E1 = scaledE1 * (Real)2;
85 Real dotVE0 =
Dot(V, E0);
86 Real dotVE1 =
Dot(V, E1);
87 Real dotE0E0 =
Dot(E0, E0);
88 Real dotE1E1 =
Dot(E1, E1);
91 std::array<Real, 10>
q =
93 -V[0], -V[1], -V[2], dotVE0, dotVE1, K[0], K[1], K[2], (Real)1, (Real)1
96 std::array<std::array<Real, 10>, 10> M;
97 M[0] = { (Real)1, (Real)0, (Real)0, -E0[0], -E1[0], (Real)1, (Real)0, (Real)0, (Real)0, (Real)0 };
98 M[1] = { (Real)0, (Real)1, (Real)0, -E0[1], -E1[1], (Real)0, (Real)1, (Real)0, (Real)0, (Real)0 };
99 M[2] = { (Real)0, (Real)0, (Real)1, -E0[2], -E1[2], (Real)0, (Real)0, (Real)1, (Real)0 , (Real)0 };
100 M[3] = { -E0[0], -E0[1], -E0[2], dotE0E0, (Real)0, (Real)0, (Real)0, (Real)0, (Real)1, (Real)0 };
101 M[4] = { -E1[0], -E1[1], -E1[2], (Real)0, dotE1E1, (Real)0, (Real)0, (Real)0, (Real)0, (Real)1 };
102 M[5] = { (Real)-1, (Real)0, (Real)0, (Real)0, (Real)0, (Real)0, (Real)0, (Real)0, (Real)0, (Real)0 };
103 M[6] = { (Real)0, (Real)-1, (Real)0, (Real)0, (Real)0, (Real)0, (Real)0, (Real)0, (Real)0, (Real)0 };
104 M[7] = { (Real)0, (Real)0, (Real)-1, (Real)0, (Real)0, (Real)0, (Real)0, (Real)0, (Real)0, (Real)0 };
105 M[8] = { (Real)0, (Real)0, (Real)0, (Real)-1, (Real)0, (Real)0, (Real)0, (Real)0, (Real)0, (Real)0 };
106 M[9] = { (Real)0, (Real)0, (Real)0, (Real)0, (Real)-1, (Real)0, (Real)0, (Real)0, (Real)0, (Real)0 };
108 std::array<Real, 10>
w,
z;
109 if (mLCP.Solve(q, M, w, z))
111 result.queryIsSuccessful =
true;
113 Real
t0 = (z[3] * (Real)2 - (Real)1) * rectangle.extent[0];
114 Real
t1 = (z[4] * (Real)2 - (Real)1) * rectangle.extent[1];
115 result.rectangleParameter[0] =
t0;
116 result.rectangleParameter[1] =
t1;
117 result.closestPoint[0] = rectangle.center + t0 * rectangle.axis[0] +
t1 * rectangle.axis[1];
118 result.closestPoint[1] = box.center;
119 for (
int i = 0; i < 3; ++i)
121 result.boxParameter[i] = z[i] - box.extent[i];
122 result.closestPoint[1] += result.boxParameter[i] * box.axis[i];
125 Vector3<Real> diff = result.closestPoint[1] - result.closestPoint[0];
126 result.sqrDistance =
Dot(diff, diff);
135 result.queryIsSuccessful =
false;
137 for (
int i = 0; i < 2; ++i)
139 result.rectangleParameter[i] = (Real)0;
141 for (
int i = 0; i < 3; ++i)
143 result.boxParameter[i] = (Real)0;
144 result.closestPoint[0][i] = (Real)0;
145 result.closestPoint[1][i] = (Real)0;
147 result.distance = (Real)0;
148 result.sqrDistance = (Real)0;
151 result.numLCPIterations = mLCP.GetNumIterations();
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t0
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
LCPSolver< Real, 10 > mLCP
GLsizei GLsizei GLfloat distance
static Real Sqrt(Real const &x)
GLubyte GLubyte GLubyte GLubyte w
Result operator()(Type0 const &primitive0, Type1 const &primitive1)
DualQuaternion< Real > Dot(DualQuaternion< Real > const &d0, DualQuaternion< Real > const &d1)
std::array< Real, 2 > rectangleParameter
GLdouble GLdouble GLdouble z
GLdouble GLdouble GLdouble GLdouble q
std::array< Real, 3 > boxParameter