Directory: | ./ |
---|---|
File: | src/BV/OBB.cpp |
Date: | 2025-04-01 09:23:31 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 215 | 243 | 88.5% |
Branches: | 478 | 920 | 52.0% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * Software License Agreement (BSD License) | ||
3 | * | ||
4 | * Copyright (c) 2011-2014, Willow Garage, Inc. | ||
5 | * Copyright (c) 2014-2015, Open Source Robotics Foundation | ||
6 | * All rights reserved. | ||
7 | * | ||
8 | * Redistribution and use in source and binary forms, with or without | ||
9 | * modification, are permitted provided that the following conditions | ||
10 | * are met: | ||
11 | * | ||
12 | * * Redistributions of source code must retain the above copyright | ||
13 | * notice, this list of conditions and the following disclaimer. | ||
14 | * * Redistributions in binary form must reproduce the above | ||
15 | * copyright notice, this list of conditions and the following | ||
16 | * disclaimer in the documentation and/or other materials provided | ||
17 | * with the distribution. | ||
18 | * * Neither the name of Open Source Robotics Foundation nor the names of its | ||
19 | * contributors may be used to endorse or promote products derived | ||
20 | * from this software without specific prior written permission. | ||
21 | * | ||
22 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
23 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
24 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
25 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
26 | * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
27 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
28 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
29 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
30 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
31 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
32 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
33 | * POSSIBILITY OF SUCH DAMAGE. | ||
34 | */ | ||
35 | |||
36 | /** \author Jia Pan, Florent Lamiraux */ | ||
37 | |||
38 | #include "coal/BV/OBB.h" | ||
39 | #include "coal/BVH/BVH_utility.h" | ||
40 | #include "coal/math/transform.h" | ||
41 | #include "coal/collision_data.h" | ||
42 | #include "coal/internal/tools.h" | ||
43 | |||
44 | #include <iostream> | ||
45 | #include <limits> | ||
46 | |||
47 | namespace coal { | ||
48 | |||
49 | /// @brief Compute the 8 vertices of a OBB | ||
50 | 39222 | inline void computeVertices(const OBB& b, Vec3s vertices[8]) { | |
51 |
3/6✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
|
39222 | Matrix3s extAxes(b.axes * b.extent.asDiagonal()); |
52 |
5/10✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39222 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39222 times.
✗ Branch 14 not taken.
|
39222 | vertices[0].noalias() = b.To + extAxes * Vec3s(-1, -1, -1); |
53 |
5/10✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39222 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39222 times.
✗ Branch 14 not taken.
|
39222 | vertices[1].noalias() = b.To + extAxes * Vec3s(1, -1, -1); |
54 |
5/10✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39222 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39222 times.
✗ Branch 14 not taken.
|
39222 | vertices[2].noalias() = b.To + extAxes * Vec3s(1, 1, -1); |
55 |
5/10✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39222 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39222 times.
✗ Branch 14 not taken.
|
39222 | vertices[3].noalias() = b.To + extAxes * Vec3s(-1, 1, -1); |
56 |
5/10✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39222 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39222 times.
✗ Branch 14 not taken.
|
39222 | vertices[4].noalias() = b.To + extAxes * Vec3s(-1, -1, 1); |
57 |
5/10✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39222 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39222 times.
✗ Branch 14 not taken.
|
39222 | vertices[5].noalias() = b.To + extAxes * Vec3s(1, -1, 1); |
58 |
5/10✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39222 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39222 times.
✗ Branch 14 not taken.
|
39222 | vertices[6].noalias() = b.To + extAxes * Vec3s(1, 1, 1); |
59 |
5/10✓ Branch 1 taken 39222 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39222 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39222 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39222 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39222 times.
✗ Branch 14 not taken.
|
39222 | vertices[7].noalias() = b.To + extAxes * Vec3s(-1, 1, 1); |
60 | 39222 | } | |
61 | |||
62 | /// @brief OBB merge method when the centers of two smaller OBB are far away | ||
63 | 21 | inline OBB merge_largedist(const OBB& b1, const OBB& b2) { | |
64 |
1/2✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
|
21 | OBB b; |
65 |
3/4✓ Branch 1 taken 336 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 336 times.
✓ Branch 4 taken 21 times.
|
357 | Vec3s vertex[16]; |
66 |
1/2✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
|
21 | computeVertices(b1, vertex); |
67 |
1/2✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
|
21 | computeVertices(b2, vertex + 8); |
68 |
1/2✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
|
21 | Matrix3s M; |
69 |
3/4✓ Branch 1 taken 63 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 63 times.
✓ Branch 4 taken 21 times.
|
84 | Vec3s E[3]; |
70 | 21 | Scalar s[3] = {0, 0, 0}; | |
71 | |||
72 | // obb axes | ||
73 |
5/10✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 21 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 21 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 21 times.
✗ Branch 14 not taken.
|
21 | b.axes.col(0).noalias() = (b1.To - b2.To).normalized(); |
74 | |||
75 |
3/4✓ Branch 1 taken 336 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 336 times.
✓ Branch 4 taken 21 times.
|
357 | Vec3s vertex_proj[16]; |
76 |
2/2✓ Branch 0 taken 336 times.
✓ Branch 1 taken 21 times.
|
357 | for (int i = 0; i < 16; ++i) |
77 |
1/2✓ Branch 1 taken 336 times.
✗ Branch 2 not taken.
|
336 | vertex_proj[i].noalias() = |
78 |
6/12✓ Branch 1 taken 336 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 336 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 336 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 336 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 336 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 336 times.
✗ Branch 17 not taken.
|
672 | vertex[i] - b.axes.col(0) * vertex[i].dot(b.axes.col(0)); |
79 | |||
80 |
1/2✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
|
21 | getCovariance(vertex_proj, NULL, NULL, NULL, 16, M); |
81 |
1/2✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
|
21 | eigen(M, s, E); |
82 | |||
83 | int min, mid, max; | ||
84 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 18 times.
|
21 | if (s[0] > s[1]) { |
85 | 3 | max = 0; | |
86 | 3 | min = 1; | |
87 | } else { | ||
88 | 18 | min = 0; | |
89 | 18 | max = 1; | |
90 | } | ||
91 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 12 times.
|
21 | if (s[2] < s[min]) { |
92 | 9 | mid = min; | |
93 | 9 | min = 2; | |
94 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
|
12 | } else if (s[2] > s[max]) { |
95 | 6 | mid = max; | |
96 | 6 | max = 2; | |
97 | } else { | ||
98 | 6 | mid = 2; | |
99 | } | ||
100 | |||
101 |
7/14✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 21 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 21 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 21 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 21 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 21 times.
✗ Branch 20 not taken.
|
21 | b.axes.col(1) << E[0][max], E[1][max], E[2][max]; |
102 |
7/14✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 21 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 21 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 21 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 21 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 21 times.
✗ Branch 20 not taken.
|
21 | b.axes.col(2) << E[0][mid], E[1][mid], E[2][mid]; |
103 | |||
104 | // set obb centers and extensions | ||
105 |
2/4✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
|
21 | Vec3s center, extent; |
106 |
1/2✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
|
21 | getExtentAndCenter(vertex, NULL, NULL, NULL, 16, b.axes, center, extent); |
107 | |||
108 |
2/4✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
|
21 | b.To.noalias() = center; |
109 |
2/4✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
|
21 | b.extent.noalias() = extent; |
110 | |||
111 | 42 | return b; | |
112 | } | ||
113 | |||
114 | /// @brief OBB merge method when the centers of two smaller OBB are close | ||
115 | 19590 | inline OBB merge_smalldist(const OBB& b1, const OBB& b2) { | |
116 |
1/2✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
|
19590 | OBB b; |
117 |
3/6✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19590 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 19590 times.
✗ Branch 8 not taken.
|
19590 | b.To = (b1.To + b2.To) * 0.5; |
118 |
2/4✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19590 times.
✗ Branch 5 not taken.
|
19590 | Quats q0(b1.axes), q1(b2.axes); |
119 |
4/6✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5466 times.
✓ Branch 4 taken 14124 times.
✓ Branch 7 taken 5466 times.
✗ Branch 8 not taken.
|
19590 | if (q0.dot(q1) < 0) q1.coeffs() *= -1; |
120 | |||
121 |
3/6✓ Branch 3 taken 19590 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 19590 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 19590 times.
✗ Branch 10 not taken.
|
19590 | Quats q((q0.coeffs() + q1.coeffs()).normalized()); |
122 |
1/2✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
|
19590 | b.axes = q.toRotationMatrix(); |
123 | |||
124 |
4/6✓ Branch 1 taken 156720 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 156720 times.
✓ Branch 4 taken 19590 times.
✓ Branch 6 taken 19590 times.
✗ Branch 7 not taken.
|
176310 | Vec3s vertex[8], diff; |
125 | 19590 | Scalar real_max = (std::numeric_limits<Scalar>::max)(); | |
126 |
1/2✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
|
19590 | Vec3s pmin(real_max, real_max, real_max); |
127 |
1/2✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
|
19590 | Vec3s pmax(-real_max, -real_max, -real_max); |
128 | |||
129 |
1/2✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
|
19590 | computeVertices(b1, vertex); |
130 |
2/2✓ Branch 0 taken 156720 times.
✓ Branch 1 taken 19590 times.
|
176310 | for (int i = 0; i < 8; ++i) { |
131 |
2/4✓ Branch 1 taken 156720 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 156720 times.
✗ Branch 5 not taken.
|
156720 | diff = vertex[i] - b.To; |
132 |
2/2✓ Branch 0 taken 470160 times.
✓ Branch 1 taken 156720 times.
|
626880 | for (int j = 0; j < 3; ++j) { |
133 |
2/4✓ Branch 1 taken 470160 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 470160 times.
✗ Branch 5 not taken.
|
470160 | Scalar dot = diff.dot(b.axes.col(j)); |
134 |
3/4✓ Branch 1 taken 470160 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 175926 times.
✓ Branch 4 taken 294234 times.
|
470160 | if (dot > pmax[j]) |
135 |
1/2✓ Branch 1 taken 175926 times.
✗ Branch 2 not taken.
|
175926 | pmax[j] = dot; |
136 |
3/4✓ Branch 1 taken 294234 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 114381 times.
✓ Branch 4 taken 179853 times.
|
294234 | else if (dot < pmin[j]) |
137 |
1/2✓ Branch 1 taken 114381 times.
✗ Branch 2 not taken.
|
114381 | pmin[j] = dot; |
138 | } | ||
139 | } | ||
140 | |||
141 |
1/2✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
|
19590 | computeVertices(b2, vertex); |
142 |
2/2✓ Branch 0 taken 156720 times.
✓ Branch 1 taken 19590 times.
|
176310 | for (int i = 0; i < 8; ++i) { |
143 |
2/4✓ Branch 1 taken 156720 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 156720 times.
✗ Branch 5 not taken.
|
156720 | diff = vertex[i] - b.To; |
144 |
2/2✓ Branch 0 taken 470160 times.
✓ Branch 1 taken 156720 times.
|
626880 | for (int j = 0; j < 3; ++j) { |
145 |
2/4✓ Branch 1 taken 470160 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 470160 times.
✗ Branch 5 not taken.
|
470160 | Scalar dot = diff.dot(b.axes.col(j)); |
146 |
3/4✓ Branch 1 taken 470160 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 55653 times.
✓ Branch 4 taken 414507 times.
|
470160 | if (dot > pmax[j]) |
147 |
1/2✓ Branch 1 taken 55653 times.
✗ Branch 2 not taken.
|
55653 | pmax[j] = dot; |
148 |
3/4✓ Branch 1 taken 414507 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 52290 times.
✓ Branch 4 taken 362217 times.
|
414507 | else if (dot < pmin[j]) |
149 |
1/2✓ Branch 1 taken 52290 times.
✗ Branch 2 not taken.
|
52290 | pmin[j] = dot; |
150 | } | ||
151 | } | ||
152 | |||
153 |
2/2✓ Branch 0 taken 58770 times.
✓ Branch 1 taken 19590 times.
|
78360 | for (int j = 0; j < 3; ++j) { |
154 |
6/12✓ Branch 1 taken 58770 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 58770 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 58770 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 58770 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 58770 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 58770 times.
✗ Branch 17 not taken.
|
58770 | b.To.noalias() += (b.axes.col(j) * (0.5 * (pmax[j] + pmin[j]))); |
155 |
3/6✓ Branch 1 taken 58770 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 58770 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 58770 times.
✗ Branch 8 not taken.
|
58770 | b.extent[j] = Scalar(0.5) * (pmax[j] - pmin[j]); |
156 | } | ||
157 | |||
158 | 39180 | return b; | |
159 | } | ||
160 | |||
161 | 6000 | bool obbDisjoint(const Matrix3s& B, const Vec3s& T, const Vec3s& a, | |
162 | const Vec3s& b) { | ||
163 | Scalar t, s; | ||
164 | 6000 | const Scalar reps = Scalar(1e-6); | |
165 | |||
166 |
4/8✓ Branch 1 taken 6000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6000 times.
✗ Branch 11 not taken.
|
6000 | Matrix3s Bf(B.array().abs() + reps); |
167 | // Bf += reps; | ||
168 | |||
169 | // if any of these tests are one-sided, then the polyhedra are disjoint | ||
170 | |||
171 | // A1 x A2 = A0 | ||
172 |
5/8✓ Branch 1 taken 6000 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1392 times.
✓ Branch 4 taken 4608 times.
✓ Branch 6 taken 1392 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 4608 times.
✗ Branch 10 not taken.
|
6000 | t = ((T[0] < 0.0) ? -T[0] : T[0]); |
173 | |||
174 | // if(t > (a[0] + Bf.dotX(b))) | ||
175 |
5/8✓ Branch 1 taken 6000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6000 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 469 times.
✓ Branch 10 taken 5531 times.
|
6000 | if (t > (a[0] + Bf.row(0).dot(b))) return true; |
176 | |||
177 | // B1 x B2 = B0 | ||
178 | // s = B.transposeDotX(T); | ||
179 |
2/4✓ Branch 1 taken 5531 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5531 times.
✗ Branch 5 not taken.
|
5531 | s = B.col(0).dot(T); |
180 |
2/2✓ Branch 0 taken 2397 times.
✓ Branch 1 taken 3134 times.
|
5531 | t = ((s < 0.0) ? -s : s); |
181 | |||
182 | // if(t > (b[0] + Bf.transposeDotX(a))) | ||
183 |
5/8✓ Branch 1 taken 5531 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5531 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5531 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 564 times.
✓ Branch 10 taken 4967 times.
|
5531 | if (t > (b[0] + Bf.col(0).dot(a))) return true; |
184 | |||
185 | // A2 x A0 = A1 | ||
186 |
5/8✓ Branch 1 taken 4967 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4456 times.
✓ Branch 4 taken 511 times.
✓ Branch 6 taken 4456 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 511 times.
✗ Branch 10 not taken.
|
4967 | t = ((T[1] < 0.0) ? -T[1] : T[1]); |
187 | |||
188 | // if(t > (a[1] + Bf.dotY(b))) | ||
189 |
5/8✓ Branch 1 taken 4967 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4967 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4967 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1102 times.
✓ Branch 10 taken 3865 times.
|
4967 | if (t > (a[1] + Bf.row(1).dot(b))) return true; |
190 | |||
191 | // A0 x A1 = A2 | ||
192 |
5/8✓ Branch 1 taken 3865 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1455 times.
✓ Branch 4 taken 2410 times.
✓ Branch 6 taken 1455 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 2410 times.
✗ Branch 10 not taken.
|
3865 | t = ((T[2] < 0.0) ? -T[2] : T[2]); |
193 | |||
194 | // if(t > (a[2] + Bf.dotZ(b))) | ||
195 |
5/8✓ Branch 1 taken 3865 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3865 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3865 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 149 times.
✓ Branch 10 taken 3716 times.
|
3865 | if (t > (a[2] + Bf.row(2).dot(b))) return true; |
196 | |||
197 | // B2 x B0 = B1 | ||
198 | // s = B.transposeDotY(T); | ||
199 |
2/4✓ Branch 1 taken 3716 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3716 times.
✗ Branch 5 not taken.
|
3716 | s = B.col(1).dot(T); |
200 |
2/2✓ Branch 0 taken 1667 times.
✓ Branch 1 taken 2049 times.
|
3716 | t = ((s < 0.0) ? -s : s); |
201 | |||
202 | // if(t > (b[1] + Bf.transposeDotY(a))) | ||
203 |
5/8✓ Branch 1 taken 3716 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3716 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3716 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 104 times.
✓ Branch 10 taken 3612 times.
|
3716 | if (t > (b[1] + Bf.col(1).dot(a))) return true; |
204 | |||
205 | // B0 x B1 = B2 | ||
206 | // s = B.transposeDotZ(T); | ||
207 |
2/4✓ Branch 1 taken 3612 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3612 times.
✗ Branch 5 not taken.
|
3612 | s = B.col(2).dot(T); |
208 |
2/2✓ Branch 0 taken 1738 times.
✓ Branch 1 taken 1874 times.
|
3612 | t = ((s < 0.0) ? -s : s); |
209 | |||
210 | // if(t > (b[2] + Bf.transposeDotZ(a))) | ||
211 |
5/8✓ Branch 1 taken 3612 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3612 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3612 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 107 times.
✓ Branch 10 taken 3505 times.
|
3612 | if (t > (b[2] + Bf.col(2).dot(a))) return true; |
212 | |||
213 | // A0 x B0 | ||
214 |
4/8✓ Branch 1 taken 3505 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3505 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3505 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3505 times.
✗ Branch 11 not taken.
|
3505 | s = T[2] * B(1, 0) - T[1] * B(2, 0); |
215 |
2/2✓ Branch 0 taken 1099 times.
✓ Branch 1 taken 2406 times.
|
3505 | t = ((s < 0.0) ? -s : s); |
216 | |||
217 | 3505 | if (t > | |
218 |
10/18✓ Branch 1 taken 3505 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3505 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3505 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3505 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3505 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3505 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3505 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3505 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 21 times.
✓ Branch 25 taken 3484 times.
|
3505 | (a[1] * Bf(2, 0) + a[2] * Bf(1, 0) + b[1] * Bf(0, 2) + b[2] * Bf(0, 1))) |
219 | 21 | return true; | |
220 | |||
221 | // A0 x B1 | ||
222 |
4/8✓ Branch 1 taken 3484 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3484 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3484 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3484 times.
✗ Branch 11 not taken.
|
3484 | s = T[2] * B(1, 1) - T[1] * B(2, 1); |
223 |
2/2✓ Branch 0 taken 1913 times.
✓ Branch 1 taken 1571 times.
|
3484 | t = ((s < 0.0) ? -s : s); |
224 | |||
225 | 3484 | if (t > | |
226 |
10/18✓ Branch 1 taken 3484 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3484 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3484 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3484 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3484 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3484 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3484 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3484 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 4 times.
✓ Branch 25 taken 3480 times.
|
3484 | (a[1] * Bf(2, 1) + a[2] * Bf(1, 1) + b[0] * Bf(0, 2) + b[2] * Bf(0, 0))) |
227 | 4 | return true; | |
228 | |||
229 | // A0 x B2 | ||
230 |
4/8✓ Branch 1 taken 3480 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3480 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3480 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3480 times.
✗ Branch 11 not taken.
|
3480 | s = T[2] * B(1, 2) - T[1] * B(2, 2); |
231 |
2/2✓ Branch 0 taken 1982 times.
✓ Branch 1 taken 1498 times.
|
3480 | t = ((s < 0.0) ? -s : s); |
232 | |||
233 | 3480 | if (t > | |
234 |
10/18✓ Branch 1 taken 3480 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3480 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3480 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3480 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3480 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3480 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3480 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3480 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 18 times.
✓ Branch 25 taken 3462 times.
|
3480 | (a[1] * Bf(2, 2) + a[2] * Bf(1, 2) + b[0] * Bf(0, 1) + b[1] * Bf(0, 0))) |
235 | 18 | return true; | |
236 | |||
237 | // A1 x B0 | ||
238 |
4/8✓ Branch 1 taken 3462 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3462 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3462 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3462 times.
✗ Branch 11 not taken.
|
3462 | s = T[0] * B(2, 0) - T[2] * B(0, 0); |
239 |
2/2✓ Branch 0 taken 1612 times.
✓ Branch 1 taken 1850 times.
|
3462 | t = ((s < 0.0) ? -s : s); |
240 | |||
241 | 3462 | if (t > | |
242 |
10/18✓ Branch 1 taken 3462 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3462 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3462 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3462 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3462 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3462 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3462 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3462 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 8 times.
✓ Branch 25 taken 3454 times.
|
3462 | (a[0] * Bf(2, 0) + a[2] * Bf(0, 0) + b[1] * Bf(1, 2) + b[2] * Bf(1, 1))) |
243 | 8 | return true; | |
244 | |||
245 | // A1 x B1 | ||
246 |
4/8✓ Branch 1 taken 3454 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3454 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3454 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3454 times.
✗ Branch 11 not taken.
|
3454 | s = T[0] * B(2, 1) - T[2] * B(0, 1); |
247 |
2/2✓ Branch 0 taken 1446 times.
✓ Branch 1 taken 2008 times.
|
3454 | t = ((s < 0.0) ? -s : s); |
248 | |||
249 | 3454 | if (t > | |
250 |
10/18✓ Branch 1 taken 3454 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3454 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3454 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3454 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3454 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3454 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3454 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3454 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 2 times.
✓ Branch 25 taken 3452 times.
|
3454 | (a[0] * Bf(2, 1) + a[2] * Bf(0, 1) + b[0] * Bf(1, 2) + b[2] * Bf(1, 0))) |
251 | 2 | return true; | |
252 | |||
253 | // A1 x B2 | ||
254 |
4/8✓ Branch 1 taken 3452 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3452 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3452 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3452 times.
✗ Branch 11 not taken.
|
3452 | s = T[0] * B(2, 2) - T[2] * B(0, 2); |
255 |
2/2✓ Branch 0 taken 1940 times.
✓ Branch 1 taken 1512 times.
|
3452 | t = ((s < 0.0) ? -s : s); |
256 | |||
257 | 3452 | if (t > | |
258 |
10/18✓ Branch 1 taken 3452 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3452 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3452 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3452 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3452 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3452 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3452 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3452 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 12 times.
✓ Branch 25 taken 3440 times.
|
3452 | (a[0] * Bf(2, 2) + a[2] * Bf(0, 2) + b[0] * Bf(1, 1) + b[1] * Bf(1, 0))) |
259 | 12 | return true; | |
260 | |||
261 | // A2 x B0 | ||
262 |
4/8✓ Branch 1 taken 3440 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3440 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3440 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3440 times.
✗ Branch 11 not taken.
|
3440 | s = T[1] * B(0, 0) - T[0] * B(1, 0); |
263 |
2/2✓ Branch 0 taken 1889 times.
✓ Branch 1 taken 1551 times.
|
3440 | t = ((s < 0.0) ? -s : s); |
264 | |||
265 | 3440 | if (t > | |
266 |
10/18✓ Branch 1 taken 3440 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3440 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3440 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3440 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3440 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3440 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3440 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3440 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 30 times.
✓ Branch 25 taken 3410 times.
|
3440 | (a[0] * Bf(1, 0) + a[1] * Bf(0, 0) + b[1] * Bf(2, 2) + b[2] * Bf(2, 1))) |
267 | 30 | return true; | |
268 | |||
269 | // A2 x B1 | ||
270 |
4/8✓ Branch 1 taken 3410 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3410 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3410 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3410 times.
✗ Branch 11 not taken.
|
3410 | s = T[1] * B(0, 1) - T[0] * B(1, 1); |
271 |
2/2✓ Branch 0 taken 1496 times.
✓ Branch 1 taken 1914 times.
|
3410 | t = ((s < 0.0) ? -s : s); |
272 | |||
273 | 3410 | if (t > | |
274 |
10/18✓ Branch 1 taken 3410 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3410 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3410 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3410 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3410 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3410 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3410 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3410 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 50 times.
✓ Branch 25 taken 3360 times.
|
3410 | (a[0] * Bf(1, 1) + a[1] * Bf(0, 1) + b[0] * Bf(2, 2) + b[2] * Bf(2, 0))) |
275 | 50 | return true; | |
276 | |||
277 | // A2 x B2 | ||
278 |
4/8✓ Branch 1 taken 3360 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3360 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3360 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3360 times.
✗ Branch 11 not taken.
|
3360 | s = T[1] * B(0, 2) - T[0] * B(1, 2); |
279 |
2/2✓ Branch 0 taken 1546 times.
✓ Branch 1 taken 1814 times.
|
3360 | t = ((s < 0.0) ? -s : s); |
280 | |||
281 | 3360 | if (t > | |
282 |
10/18✓ Branch 1 taken 3360 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3360 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3360 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3360 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3360 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3360 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3360 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3360 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 8 times.
✓ Branch 25 taken 3352 times.
|
3360 | (a[0] * Bf(1, 2) + a[1] * Bf(0, 2) + b[0] * Bf(2, 1) + b[1] * Bf(2, 0))) |
283 | 8 | return true; | |
284 | |||
285 | 3352 | return false; | |
286 | } | ||
287 | |||
288 | namespace internal { | ||
289 | 227393 | inline Scalar obbDisjoint_check_A_axis(const Vec3s& T, const Vec3s& a, | |
290 | const Vec3s& b, const Matrix3s& Bf) { | ||
291 | // |T| - |B| * b - a | ||
292 |
3/6✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 227393 times.
✗ Branch 8 not taken.
|
227393 | Vec3s AABB_corner(T.cwiseAbs() - a); |
293 |
3/6✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 227393 times.
✗ Branch 8 not taken.
|
227393 | AABB_corner.noalias() -= Bf * b; |
294 |
4/8✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 227393 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 227393 times.
✗ Branch 11 not taken.
|
227393 | return AABB_corner.array().max(Scalar(0)).matrix().squaredNorm(); |
295 | } | ||
296 | |||
297 | 130812 | inline Scalar obbDisjoint_check_B_axis(const Matrix3s& B, const Vec3s& T, | |
298 | const Vec3s& a, const Vec3s& b, | ||
299 | const Matrix3s& Bf) { | ||
300 | // Bf = |B| | ||
301 | // | B^T T| - Bf^T * a - b | ||
302 | 130812 | Scalar s, t = 0; | |
303 |
4/8✓ Branch 2 taken 130812 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 130812 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 130812 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 130812 times.
✗ Branch 13 not taken.
|
130812 | s = std::abs(B.col(0).dot(T)) - Bf.col(0).dot(a) - b[0]; |
304 |
2/2✓ Branch 0 taken 1232 times.
✓ Branch 1 taken 129580 times.
|
130812 | if (s > 0) t += s * s; |
305 |
4/8✓ Branch 2 taken 130812 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 130812 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 130812 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 130812 times.
✗ Branch 13 not taken.
|
130812 | s = std::abs(B.col(1).dot(T)) - Bf.col(1).dot(a) - b[1]; |
306 |
2/2✓ Branch 0 taken 4304 times.
✓ Branch 1 taken 126508 times.
|
130812 | if (s > 0) t += s * s; |
307 |
4/8✓ Branch 2 taken 130812 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 130812 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 130812 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 130812 times.
✗ Branch 13 not taken.
|
130812 | s = std::abs(B.col(2).dot(T)) - Bf.col(2).dot(a) - b[2]; |
308 |
2/2✓ Branch 0 taken 13764 times.
✓ Branch 1 taken 117048 times.
|
130812 | if (s > 0) t += s * s; |
309 | 130812 | return t; | |
310 | } | ||
311 | |||
312 | template <int ib, int jb = (ib + 1) % 3, int kb = (ib + 2) % 3> | ||
313 | 1955040 | struct COAL_LOCAL obbDisjoint_check_Ai_cross_Bi{static inline bool run( | |
314 | int ia, int ja, int ka, const Matrix3s& B, const Vec3s& T, const Vec3s& a, | ||
315 | const Vec3s& b, const Matrix3s& Bf, const Scalar& breakDistance2, | ||
316 | 1955040 | Scalar& squaredLowerBoundDistance){Scalar sinus2 = | |
317 | 1955040 | 1 - Bf(ia, ib) * Bf(ia, ib); | |
318 |
2/2✓ Branch 0 taken 1610 times.
✓ Branch 1 taken 975910 times.
|
1955040 | if (sinus2 < 1e-6) return false; |
319 | |||
320 | 1951820 | const Scalar s = T[ka] * B(ja, ib) - T[ja] * B(ka, ib); | |
321 | |||
322 | 1951820 | const Scalar diff = fabs(s) - (a[ja] * Bf(ka, ib) + a[ka] * Bf(ja, ib) + | |
323 | 1951820 | b[jb] * Bf(ia, kb) + b[kb] * Bf(ia, jb)); | |
324 | // We need to divide by the norm || Aia x Bib || | ||
325 | // As ||Aia|| = ||Bib|| = 1, (Aia | Bib)^2 = cosine^2 | ||
326 |
2/2✓ Branch 0 taken 5990 times.
✓ Branch 1 taken 969920 times.
|
1951820 | if (diff > 0) { |
327 | 11980 | squaredLowerBoundDistance = diff * diff / sinus2; | |
328 |
2/2✓ Branch 0 taken 5847 times.
✓ Branch 1 taken 143 times.
|
11980 | if (squaredLowerBoundDistance > breakDistance2) { |
329 | 11694 | return true; | |
330 | } | ||
331 | } | ||
332 | 1940126 | return false; | |
333 | } // namespace internal | ||
334 | }; // namespace coal | ||
335 | } // namespace internal | ||
336 | |||
337 | // B, T orientation and position of 2nd OBB in frame of 1st OBB, | ||
338 | // a extent of 1st OBB, | ||
339 | // b extent of 2nd OBB. | ||
340 | // | ||
341 | // This function tests whether bounding boxes should be broken down. | ||
342 | // | ||
343 | 227393 | bool obbDisjointAndLowerBoundDistance(const Matrix3s& B, const Vec3s& T, | |
344 | const Vec3s& a_, const Vec3s& b_, | ||
345 | const CollisionRequest& request, | ||
346 | Scalar& squaredLowerBoundDistance) { | ||
347 |
3/6✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 227393 times.
✗ Branch 9 not taken.
|
227393 | assert(request.security_margin > |
348 | -2 * (std::min)(a_.minCoeff(), b_.minCoeff()) - | ||
349 | 10 * Eigen::NumTraits<Scalar>::epsilon() && | ||
350 | "A negative security margin could not be lower than the OBB extent."); | ||
351 | // const Scalar breakDistance(request.break_distance + | ||
352 | // request.security_margin); | ||
353 | 227393 | const Scalar breakDistance2 = request.break_distance * request.break_distance; | |
354 | |||
355 |
2/4✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
|
227393 | Matrix3s Bf(B.cwiseAbs()); |
356 |
2/4✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
|
227393 | const Vec3s a((a_ + Vec3s::Constant(request.security_margin / 2)) |
357 |
1/2✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
|
227393 | .array() |
358 |
2/4✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
|
227393 | .max(Scalar(0))); |
359 |
2/4✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
|
227393 | const Vec3s b((b_ + Vec3s::Constant(request.security_margin / 2)) |
360 |
1/2✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
|
227393 | .array() |
361 |
2/4✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 227393 times.
✗ Branch 5 not taken.
|
227393 | .max(Scalar(0))); |
362 | |||
363 | // Corner of b axis aligned bounding box the closest to the origin | ||
364 |
1/2✓ Branch 1 taken 227393 times.
✗ Branch 2 not taken.
|
227393 | squaredLowerBoundDistance = internal::obbDisjoint_check_A_axis(T, a, b, Bf); |
365 |
2/2✓ Branch 0 taken 96581 times.
✓ Branch 1 taken 130812 times.
|
227393 | if (squaredLowerBoundDistance > breakDistance2) return true; |
366 | |||
367 | 130812 | squaredLowerBoundDistance = | |
368 |
1/2✓ Branch 1 taken 130812 times.
✗ Branch 2 not taken.
|
130812 | internal::obbDisjoint_check_B_axis(B, T, a, b, Bf); |
369 |
2/2✓ Branch 0 taken 17927 times.
✓ Branch 1 taken 112885 times.
|
130812 | if (squaredLowerBoundDistance > breakDistance2) return true; |
370 | |||
371 | // Ai x Bj | ||
372 | 112885 | int ja = 1, ka = 2; | |
373 |
2/2✓ Branch 0 taken 329212 times.
✓ Branch 1 taken 107038 times.
|
436250 | for (int ia = 0; ia < 3; ++ia) { |
374 |
3/4✓ Branch 1 taken 329212 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4505 times.
✓ Branch 4 taken 324707 times.
|
329212 | if (internal::obbDisjoint_check_Ai_cross_Bi<0>::run( |
375 | ia, ja, ka, B, T, a, b, Bf, breakDistance2, | ||
376 | squaredLowerBoundDistance)) | ||
377 | 4505 | return true; | |
378 |
3/4✓ Branch 1 taken 324707 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1106 times.
✓ Branch 4 taken 323601 times.
|
324707 | if (internal::obbDisjoint_check_Ai_cross_Bi<1>::run( |
379 | ia, ja, ka, B, T, a, b, Bf, breakDistance2, | ||
380 | squaredLowerBoundDistance)) | ||
381 | 1106 | return true; | |
382 |
3/4✓ Branch 1 taken 323601 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 236 times.
✓ Branch 4 taken 323365 times.
|
323601 | if (internal::obbDisjoint_check_Ai_cross_Bi<2>::run( |
383 | ia, ja, ka, B, T, a, b, Bf, breakDistance2, | ||
384 | squaredLowerBoundDistance)) | ||
385 | 236 | return true; | |
386 | 323365 | ja = ka; | |
387 | 323365 | ka = ia; | |
388 | } | ||
389 | |||
390 | 107038 | return false; | |
391 | } | ||
392 | |||
393 | 6000 | bool OBB::overlap(const OBB& other) const { | |
394 | /// compute what transform [R,T] that takes us from cs1 to cs2. | ||
395 | /// [R,T] = [R1,T1]'[R2,T2] = [R1',-R1'T][R2,T2] = [R1'R2, R1'(T2-T1)] | ||
396 | /// First compute the rotation part, then translation part | ||
397 |
4/8✓ Branch 1 taken 6000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6000 times.
✗ Branch 11 not taken.
|
6000 | Vec3s T(axes.transpose() * (other.To - To)); |
398 |
3/6✓ Branch 1 taken 6000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6000 times.
✗ Branch 8 not taken.
|
6000 | Matrix3s R(axes.transpose() * other.axes); |
399 | |||
400 |
1/2✓ Branch 1 taken 6000 times.
✗ Branch 2 not taken.
|
6000 | return !obbDisjoint(R, T, extent, other.extent); |
401 | } | ||
402 | |||
403 | 154162 | bool OBB::overlap(const OBB& other, const CollisionRequest& request, | |
404 | Scalar& sqrDistLowerBound) const { | ||
405 | /// compute what transform [R,T] that takes us from cs1 to cs2. | ||
406 | /// [R,T] = [R1,T1]'[R2,T2] = [R1',-R1'T][R2,T2] = [R1'R2, R1'(T2-T1)] | ||
407 | /// First compute the rotation part, then translation part | ||
408 | // Vec3s t = other.To - To; // T2 - T1 | ||
409 | // Vec3s T(t.dot(axis[0]), t.dot(axis[1]), t.dot(axis[2])); // R1'(T2-T1) | ||
410 | // Matrix3s R(axis[0].dot(other.axis[0]), axis[0].dot(other.axis[1]), | ||
411 | // axis[0].dot(other.axis[2]), | ||
412 | // axis[1].dot(other.axis[0]), axis[1].dot(other.axis[1]), | ||
413 | // axis[1].dot(other.axis[2]), | ||
414 | // axis[2].dot(other.axis[0]), axis[2].dot(other.axis[1]), | ||
415 | // axis[2].dot(other.axis[2])); | ||
416 |
4/8✓ Branch 1 taken 154162 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 154162 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 154162 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 154162 times.
✗ Branch 11 not taken.
|
154162 | Vec3s T(axes.transpose() * (other.To - To)); |
417 |
3/6✓ Branch 1 taken 154162 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 154162 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 154162 times.
✗ Branch 8 not taken.
|
154162 | Matrix3s R(axes.transpose() * other.axes); |
418 | |||
419 |
1/2✓ Branch 1 taken 154162 times.
✗ Branch 2 not taken.
|
154162 | return !obbDisjointAndLowerBoundDistance(R, T, extent, other.extent, request, |
420 | 154162 | sqrDistLowerBound); | |
421 | } | ||
422 | |||
423 | ✗ | bool OBB::contain(const Vec3s& p) const { | |
424 | ✗ | Vec3s local_p(p - To); | |
425 | ✗ | Scalar proj = local_p.dot(axes.col(0)); | |
426 | ✗ | if ((proj > extent[0]) || (proj < -extent[0])) return false; | |
427 | |||
428 | ✗ | proj = local_p.dot(axes.col(1)); | |
429 | ✗ | if ((proj > extent[1]) || (proj < -extent[1])) return false; | |
430 | |||
431 | ✗ | proj = local_p.dot(axes.col(2)); | |
432 | ✗ | if ((proj > extent[2]) || (proj < -extent[2])) return false; | |
433 | |||
434 | ✗ | return true; | |
435 | } | ||
436 | |||
437 | ✗ | OBB& OBB::operator+=(const Vec3s& p) { | |
438 | ✗ | OBB bvp; | |
439 | ✗ | bvp.To = p; | |
440 | ✗ | bvp.axes.noalias() = axes; | |
441 | ✗ | bvp.extent.setZero(); | |
442 | |||
443 | ✗ | *this += bvp; | |
444 | ✗ | return *this; | |
445 | } | ||
446 | |||
447 | 19611 | OBB OBB::operator+(const OBB& other) const { | |
448 |
2/4✓ Branch 1 taken 19611 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19611 times.
✗ Branch 5 not taken.
|
19611 | Vec3s center_diff = To - other.To; |
449 |
3/6✓ Branch 1 taken 19611 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19611 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 19611 times.
✗ Branch 8 not taken.
|
19611 | Scalar max_extent = std::max(std::max(extent[0], extent[1]), extent[2]); |
450 | Scalar max_extent2 = | ||
451 |
3/6✓ Branch 1 taken 19611 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19611 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 19611 times.
✗ Branch 8 not taken.
|
19611 | std::max(std::max(other.extent[0], other.extent[1]), other.extent[2]); |
452 |
3/4✓ Branch 1 taken 19611 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 21 times.
✓ Branch 4 taken 19590 times.
|
19611 | if (center_diff.norm() > 2 * (max_extent + max_extent2)) { |
453 |
1/2✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
|
21 | return merge_largedist(*this, other); |
454 | } else { | ||
455 |
1/2✓ Branch 1 taken 19590 times.
✗ Branch 2 not taken.
|
19590 | return merge_smalldist(*this, other); |
456 | } | ||
457 | } | ||
458 | |||
459 | ✗ | Scalar OBB::distance(const OBB& /*other*/, Vec3s* /*P*/, Vec3s* /*Q*/) const { | |
460 | ✗ | std::cerr << "OBB distance not implemented!" << std::endl; | |
461 | ✗ | return 0.0; | |
462 | } | ||
463 | |||
464 | ✗ | bool overlap(const Matrix3s& R0, const Vec3s& T0, const OBB& b1, | |
465 | const OBB& b2) { | ||
466 | ✗ | Vec3s Ttemp(R0.transpose() * (b2.To - T0) - b1.To); | |
467 | ✗ | Vec3s T(b1.axes.transpose() * Ttemp); | |
468 | ✗ | Matrix3s R(b1.axes.transpose() * R0.transpose() * b2.axes); | |
469 | |||
470 | ✗ | return !obbDisjoint(R, T, b1.extent, b2.extent); | |
471 | } | ||
472 | |||
473 | 73231 | bool overlap(const Matrix3s& R0, const Vec3s& T0, const OBB& b1, const OBB& b2, | |
474 | const CollisionRequest& request, Scalar& sqrDistLowerBound) { | ||
475 |
5/10✓ Branch 1 taken 73231 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 73231 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 73231 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 73231 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 73231 times.
✗ Branch 14 not taken.
|
73231 | Vec3s Ttemp(R0.transpose() * (b2.To - T0) - b1.To); |
476 |
3/6✓ Branch 1 taken 73231 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 73231 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 73231 times.
✗ Branch 8 not taken.
|
73231 | Vec3s T(b1.axes.transpose() * Ttemp); |
477 |
5/10✓ Branch 1 taken 73231 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 73231 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 73231 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 73231 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 73231 times.
✗ Branch 14 not taken.
|
73231 | Matrix3s R(b1.axes.transpose() * R0.transpose() * b2.axes); |
478 | |||
479 |
1/2✓ Branch 1 taken 73231 times.
✗ Branch 2 not taken.
|
73231 | return !obbDisjointAndLowerBoundDistance(R, T, b1.extent, b2.extent, request, |
480 | 73231 | sqrDistLowerBound); | |
481 | } | ||
482 | |||
483 | ✗ | OBB translate(const OBB& bv, const Vec3s& t) { | |
484 | ✗ | OBB res(bv); | |
485 | ✗ | res.To += t; | |
486 | ✗ | return res; | |
487 | } | ||
488 | |||
489 | } // namespace coal | ||
490 |