48 static const double cosA = sqrt(3.0) / 2.0;
53 if (eigenS[0] > eigenS[1]) {
60 if (eigenS[2] < eigenS[min]) {
63 }
else if (eigenS[2] > eigenS[max]) {
70 axes.col(0) << eigenV[0][max], eigenV[1][max], eigenV[2][max];
71 axes.col(1) << eigenV[0][mid], eigenV[1][mid], eigenV[2][mid];
72 axes.col(2) << eigenV[1][max] * eigenV[2][mid] -
73 eigenV[1][mid] * eigenV[2][max],
74 eigenV[0][mid] * eigenV[2][max] - eigenV[0][max] * eigenV[2][mid],
75 eigenV[0][max] * eigenV[1][mid] - eigenV[0][mid] * eigenV[1][max];
78 namespace OBB_fit_functions {
81 bv.
To.noalias() = ps[0];
82 bv.
axes.setIdentity();
88 const Vec3f& p2 = ps[1];
93 bv.
axes.col(0).noalias() = p1p2;
96 bv.
extent << len_p1p2 * 0.5, 0, 0;
97 bv.
To.noalias() = (
p1 + p2) / 2;
102 const Vec3f& p2 = ps[1];
103 const Vec3f& p3 = ps[2];
109 len[0] = e[0].squaredNorm();
110 len[1] = e[1].squaredNorm();
111 len[2] = e[2].squaredNorm();
114 if (len[1] > len[0]) imax = 1;
115 if (len[2] > len[imax]) imax = 2;
117 bv.
axes.col(2).noalias() = e[0].cross(e[1]).normalized();
118 bv.
axes.col(0).noalias() = e[imax].normalized();
119 bv.
axes.col(1).noalias() = bv.
axes.col(2).cross(bv.
axes.col(0));
134 Matrix3f::Scalar s[3] = {0, 0, 0};
146 namespace RSS_fit_functions {
148 bv.
Tr.noalias() = ps[0];
149 bv.
axes.setIdentity();
157 const Vec3f& p2 = ps[1];
158 bv.
axes.col(0).noalias() =
p1 - p2;
160 bv.
axes.col(0) /= len_p1p2;
172 const Vec3f& p2 = ps[1];
173 const Vec3f& p3 = ps[2];
179 len[0] = e[0].squaredNorm();
180 len[1] = e[1].squaredNorm();
181 len[2] = e[2].squaredNorm();
184 if (len[1] > len[0]) imax = 1;
185 if (len[2] > len[imax]) imax = 2;
187 bv.
axes.col(2).noalias() = e[0].cross(e[1]).normalized();
188 bv.
axes.col(0).noalias() = e[imax].normalized();
189 bv.
axes.col(1).noalias() = bv.
axes.col(2).cross(bv.
axes.col(0));
205 Matrix3f::Scalar s[3] = {0, 0, 0};
218 namespace kIOS_fit_functions {
227 bv.
obb.
To.noalias() = ps[0];
234 const Vec3f& p2 = ps[1];
240 axes.col(0).noalias() = p1p2;
254 Vec3f delta = axes.col(1) * r1cosA;
260 delta = axes.col(2) * r1cosA;
269 const Vec3f& p2 = ps[1];
270 const Vec3f& p3 = ps[2];
276 len[0] = e[0].squaredNorm();
277 len[1] = e[1].squaredNorm();
278 len[2] = e[2].squaredNorm();
281 if (len[1] > len[0]) imax = 1;
282 if (len[2] > len[imax]) imax = 2;
284 bv.
obb.
axes.col(2).noalias() = e[0].cross(e[1]).normalized();
285 bv.
obb.
axes.col(0).noalias() = e[imax].normalized();
311 Matrix3f::Scalar s[3] = {0, 0, 0};
340 Vec3f delta = axes.col(2) * (r10 *
cosA - extent[2]);
347 bv.
spheres[1].
o += axes.col(2) * (-r10 + r11);
348 bv.
spheres[2].
o += axes.col(2) * (r10 - r12);
358 (sqrt(r10 * r10 - extent[0] * extent[0] - extent[2] * extent[2]) -
367 bv.
spheres[3].
o += axes.col(1) * (-r10 + r21);
368 bv.
spheres[4].
o += axes.col(1) * (r10 - r22);
377 namespace OBBRSS_fit_functions {
475 for (
unsigned int i = 1; i < n; ++i) {
481 unsigned int num_primitives) {
486 Matrix3f::Scalar s[3];
488 getCovariance(vertices, prev_vertices, tri_indices, primitive_indices,
502 unsigned int num_primitives) {
506 Matrix3f::Scalar s[3];
508 getCovariance(vertices, prev_vertices, tri_indices, primitive_indices,
522 primitive_indices, num_primitives,
534 unsigned int num_primitives) {
539 Matrix3f::Scalar s[3];
540 getCovariance(vertices, prev_vertices, tri_indices, primitive_indices,
551 primitive_indices, num_primitives, bv.
axes,
563 unsigned int num_primitives) {
568 Matrix3f::Scalar s[3];
570 getCovariance(vertices, prev_vertices, tri_indices, primitive_indices,
584 primitive_indices, num_primitives, center);
600 Vec3f delta = axes.col(2) * (r10 *
cosA - extent[2]);
605 maximumDistance(vertices, prev_vertices, tri_indices, primitive_indices,
608 maximumDistance(vertices, prev_vertices, tri_indices, primitive_indices,
611 bv.
spheres[1].
o += axes.col(2) * (-r10 + r11);
612 bv.
spheres[2].
o += axes.col(2) * (r10 - r12);
622 (sqrt(r10 * r10 - extent[0] * extent[0] - extent[2] * extent[2]) -
629 primitive_indices, num_primitives, bv.
spheres[3].
o);
631 primitive_indices, num_primitives, bv.
spheres[4].
o);
633 bv.
spheres[3].
o += axes.col(1) * (-r10 + r21);
634 bv.
spheres[4].
o += axes.col(1) * (r10 - r22);
644 unsigned int num_primitives) {
646 if (num_primitives == 0)
return bv;
650 Triangle t0 = tri_indices[primitive_indices[0]];
651 bv =
AABB(vertices[t0[0]]);
653 for (
unsigned int i = 0; i < num_primitives; ++i) {
654 Triangle t = tri_indices[primitive_indices[i]];
655 bv += vertices[
t[0]];
656 bv += vertices[
t[1]];
657 bv += vertices[
t[2]];
661 bv += prev_vertices[
t[0]];
662 bv += prev_vertices[
t[1]];
663 bv += prev_vertices[
t[2]];
669 bv =
AABB(vertices[primitive_indices[0]]);
670 for (
unsigned int i = 0; i < num_primitives; ++i) {
671 bv += vertices[primitive_indices[i]];
675 bv += prev_vertices[primitive_indices[i]];