Skip to content

Commit 1557450

Browse files
author
Teseo Schneider
committed
added init with boxes and correct list order
1 parent ad8ed72 commit 1557450

File tree

2 files changed

+51
-37
lines changed

2 files changed

+51
-37
lines changed

src/BVH.cpp

Lines changed: 44 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -207,53 +207,42 @@ namespace BVH
207207
{
208208
n_corners = cornerlist.size();
209209

210-
boxlist.resize(
211-
max_node_index(
212-
1, 0, n_corners) +
213-
1 // <-- this is because size == max_index + 1 !!!
214-
);
215-
216-
init_boxes_recursive(cornerlist, 1, 0, n_corners);
217-
}
218-
219-
void BVH::init(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, const double tol)
220-
{
221-
assert(F.cols() == 3);
222-
assert(V.cols() == 3);
223-
224-
struct sortstruct
210+
Eigen::MatrixXd box_centers(n_corners, 3);
211+
for (int i = 0; i < n_corners; ++i)
225212
{
226-
int order;
227-
Resorting::MortonCode64 morton;
228-
};
229-
std::vector<sortstruct> list;
230-
const int multi = 1000;
213+
box_centers.row(i) = (cornerlist[i][0] + cornerlist[i][1]) / 2;
214+
}
231215

232-
const Eigen::RowVector3d vmin = V.colwise().minCoeff();
233-
const Eigen::RowVector3d vmax = V.colwise().maxCoeff();
216+
const Eigen::RowVector3d vmin = box_centers.colwise().minCoeff();
217+
const Eigen::RowVector3d vmax = box_centers.colwise().maxCoeff();
234218
const Eigen::RowVector3d center = (vmin + vmax) / 2;
235-
Eigen::MatrixXd v_shifted(V.rows(), V.cols());
236-
237-
for (int i = 0; i < V.rows(); i++)
219+
for (int i = 0; i < n_corners; i++)
238220
{
239221
// make box centered at origin
240-
v_shifted.row(i) = V.row(i) - center;
222+
box_centers.row(i) -= center;
241223
}
242224

243225
// after placing box at origin, vmax and vmin are symetric.
244226
const Eigen::Vector3d scale_point = vmax - center;
245227
const double scale = scale_point.lpNorm<Eigen::Infinity>();
246228
// if the box is too big, resize it
247-
if (scale > 300)
229+
if (scale > 100)
248230
{
249-
v_shifted /= scale;
231+
box_centers /= scale;
250232
}
251233

252-
list.resize(F.rows());
234+
struct sortstruct
235+
{
236+
int order;
237+
Resorting::MortonCode64 morton;
238+
};
239+
std::vector<sortstruct> list;
240+
const int multi = 1000;
241+
list.resize(n_corners);
253242

254-
for (int i = 0; i < F.rows(); i++)
243+
for (int i = 0; i < n_corners; i++)
255244
{
256-
const Eigen::MatrixXd tmp = (v_shifted.row(F(i, 0)) + v_shifted.row(F(i, 1)) + v_shifted.row(F(i, 2))) * multi;
245+
const Eigen::MatrixXd tmp = box_centers.row(i) * multi;
257246

258247
list[i].morton = Resorting::MortonCode64(int(tmp(0)), int(tmp(1)), int(tmp(2)));
259248
list[i].order = i;
@@ -264,17 +253,38 @@ namespace BVH
264253
};
265254
std::sort(list.begin(), list.end(), morton_compare);
266255

267-
new2old.resize(F.rows());
268-
for (int i = 0; i < F.rows(); i++)
256+
new2old.resize(n_corners);
257+
for (int i = 0; i < n_corners; i++)
269258
{
270259
new2old[i] = list[i].order;
271260
}
272261

262+
std::vector<std::array<Eigen::Vector3d, 2>> sorted_cornerlist(n_corners);
263+
264+
for (int i = 0; i < n_corners; i++)
265+
{
266+
sorted_cornerlist[i] = cornerlist[list[i].order];
267+
}
268+
269+
boxlist.resize(
270+
max_node_index(
271+
1, 0, n_corners) +
272+
1 // <-- this is because size == max_index + 1 !!!
273+
);
274+
275+
init_boxes_recursive(sorted_cornerlist, 1, 0, n_corners);
276+
}
277+
278+
void BVH::init(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, const double tol)
279+
{
280+
assert(F.cols() == 3);
281+
assert(V.cols() == 3);
282+
273283
std::vector<std::array<Eigen::Vector3d, 2>> cornerlist(F.rows());
274284

275285
for (int i = 0; i < F.rows(); i++)
276286
{
277-
const Eigen::RowVector3i face = F.row(list[i].order);
287+
const Eigen::RowVector3i face = F.row(i);
278288
const Eigen::RowVector3d v0 = V.row(face(0));
279289
const Eigen::RowVector3d v1 = V.row(face(1));
280290
const Eigen::RowVector3d v2 = V.row(face(2));

src/BVH.hpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ namespace BVH
4545
bool box_intersects_box(const Eigen::Vector3d &bbd0, const Eigen::Vector3d &bbd1, int index) const;
4646

4747
bool is_initialized = false;
48-
void init(const std::vector<std::array<Eigen::Vector3d, 2>> &cornerlist);
4948

5049
public:
50+
void init(const std::vector<std::array<Eigen::Vector3d, 2>> &cornerlist);
5151
void init(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, const double tol);
5252

5353
// inline void triangle_find_bbox(
@@ -86,9 +86,13 @@ namespace BVH
8686
// }
8787
inline void intersect_box(const Eigen::Vector3d &bbd0, const Eigen::Vector3d &bbd1, std::vector<unsigned int> &list) const
8888
{
89-
list.clear();
89+
std::vector<unsigned int> tmp;
9090
assert(n_corners >= 0);
91-
box_search_recursive(bbd0, bbd1, list, 1, 0, n_corners);
91+
box_search_recursive(bbd0, bbd1, tmp, 1, 0, n_corners);
92+
93+
list.resize(tmp.size());
94+
for (int i = 0; i < tmp.size(); ++i)
95+
list[i] = new2old[tmp[i]];
9296
}
9397
};
9498
} // namespace BVH

0 commit comments

Comments
 (0)