Skip to content

Commit 5083358

Browse files
committed
fix: take closest point
1 parent 2d20a69 commit 5083358

File tree

7 files changed

+81
-27
lines changed

7 files changed

+81
-27
lines changed

resources/models/plane.obj

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Blender v2.79 (sub 0) OBJ File: 'boite.blend'
2+
# www.blender.org
3+
mtllib case.mtl
4+
o Cube
5+
v -1.000000 -1.000000 1.000000
6+
v -1.000000 -1.000000 -1.000000
7+
v 1.000000 -1.000000 -1.000000
8+
v 1.000000 -1.000000 1.000000
9+
v -1.000000 1.000000 0.999999
10+
v -0.999999 1.000000 -1.000001
11+
v 1.000000 1.000000 -1.000000
12+
v 1.000000 1.000000 1.000000
13+
vt 0.000000 0.000000
14+
vt 1.000000 0.000000
15+
vt 1.000000 1.000000
16+
vt 0.000000 1.000000
17+
vt 1.000000 0.000000
18+
vt 1.000000 1.000000
19+
vt 0.000000 1.000000
20+
vt 0.000000 0.000000
21+
vt 1.000000 1.000000
22+
vt 0.000000 1.000000
23+
vt 0.000000 1.000000
24+
vt 1.000000 0.000000
25+
vt 0.000000 0.000000
26+
vt 1.000000 -0.000000
27+
vt 0.000000 0.000000
28+
vt 1.000000 0.000000
29+
vt 1.000000 1.000000
30+
vt 0.000000 1.000000
31+
vn 0.0000 -1.0000 -0.0000
32+
vn 0.0000 1.0000 0.0000
33+
vn -1.0000 0.0000 -0.0000
34+
vn 0.0000 -0.0000 -1.0000
35+
vn 1.0000 -0.0000 0.0000
36+
vn -0.0000 0.0000 1.0000
37+
g Cube_Cube_Material
38+
usemtl Material
39+
s off
40+
# f 1/1/1 2/2/1 3/3/1 4/4/1
41+
f 5/5/2 8/6/2 7/7/2 6/8/2
42+
# f 1/9/3 5/10/3 6/8/3 2/2/3
43+
# f 2/11/4 6/8/4 7/12/4 3/3/4
44+
# f 3/3/5 7/7/5 8/13/5 4/14/5
45+
# f 5/15/6 1/16/6 4/17/6 8/18/6

src/core/closest_point_query.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,7 @@ bool ClosestPointQuery::get_closest_point(
3838
{
3939
assert(max_distance > 0.0f);
4040

41-
static nanoflann::SearchParams search_params(
42-
32, // ignored param
43-
0.0f, // epsilon
44-
true); // true means we want results to be sorted by squared dist
41+
const float max_distance2 = max_distance * max_distance;
4542

4643
// Take the 10 closest and keep the best out of them.
4744
const std::size_t expected_result_count = 200;
@@ -57,11 +54,11 @@ bool ClosestPointQuery::get_closest_point(
5754
bool found = false;
5855
float closest_distance2 = 0.0f;
5956

60-
for (std::size_t result_index = 0; result_index < num_results; ++result_index)
57+
for (std::size_t i = 0; i < num_results; ++i)
6158
{
6259
// Ask the triangle to the point cloud.
6360
glm::vec3 v1, v2, v3;
64-
m_mesh_point_cloud.get_triangle(ret_index[result_index], v1, v2, v3);
61+
m_mesh_point_cloud.get_triangle(ret_index[i], v1, v2, v3);
6562

6663
// Compute the point on the triangle.
6764
glm::vec3 p = closest_point_in_triangle(
@@ -73,11 +70,12 @@ bool ClosestPointQuery::get_closest_point(
7370
// Keep the best.
7471
const float distance2_to_triangle = distance2(p, query_point);
7572

76-
if (distance2_to_triangle < max_distance
73+
if (distance2_to_triangle < max_distance2
7774
&& (!found || distance2_to_triangle < closest_distance2))
7875
{
7976
found = true;
8077
result = p;
78+
closest_distance2 = distance2_to_triangle;
8179
}
8280
}
8381

src/core/mesh_point_cloud.cpp

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,16 @@ MeshPointCloud::MeshPointCloud(const Mesh& mesh)
77
: m_mesh(mesh)
88
{
99
// Add all mesh vertices in the point cloud.
10-
// TODO: Uniform sample the mesh to generate a denser cloud.
1110
const std::vector<Mesh::Vertex>& vertices = m_mesh.get_vertices();
12-
const std::size_t vertex_count = vertices.size();
1311
const std::vector<unsigned int>& triangles = m_mesh.get_triangles();
14-
assert(triangles.size() % 3 == 0);
15-
const std::size_t triangle_count = triangles.size() / 3;
12+
const std::size_t index_count = triangles.size();
13+
assert(index_count % 3 == 0);
1614

17-
m_points.reserve(triangle_count * 3);
15+
m_points.reserve(index_count);
1816

19-
for (std::size_t triangle_index = 0; triangle_index < triangle_count; ++triangle_index)
17+
for (std::size_t i = 0; i < index_count; ++i)
2018
{
21-
const std::size_t v1_index = triangles[triangle_index * 3];
22-
const std::size_t v2_index = triangles[triangle_index * 3 + 1];
23-
const std::size_t v3_index = triangles[triangle_index * 3 + 2];
24-
25-
m_points.push_back(vertices[v1_index].pos);
26-
m_points.push_back(vertices[v2_index].pos);
27-
m_points.push_back(vertices[v3_index].pos);
19+
m_points.push_back(vertices[triangles[i]].pos);
2820
}
2921
}
3022

src/core/mesh_point_cloud.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ class MeshPointCloud
5757
}
5858
}
5959

60+
inline std::size_t get_triangle_count() const
61+
{
62+
return m_points.size() / 3;
63+
}
64+
6065
// nanoflann compatibility implementaiton.
6166
inline std::size_t kdtree_get_point_count() const
6267
{

src/core/scene.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace core
1010

1111
Scene::Scene(const std::vector<Mesh>& meshes)
1212
: m_meshes(meshes)
13-
{
13+
{
1414
// Prepare to render meshes.
1515
m_drawing_meshes.reserve(m_meshes.size());
1616

@@ -22,6 +22,11 @@ Scene::Scene(const std::vector<Mesh>& meshes)
2222
}
2323
}
2424

25+
std::size_t Scene::get_mesh_count() const
26+
{
27+
return m_meshes.size();
28+
}
29+
2530
const Mesh& Scene::get_mesh() const
2631
{
2732
assert(m_meshes.size() > 0);
@@ -36,4 +41,4 @@ void Scene::render() const
3641
}
3742
}
3843

39-
} // namespace core
44+
} // namespace core

src/core/scene.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ class Scene
1616
public:
1717
Scene(const std::vector<Mesh>& meshes);
1818

19+
std::size_t get_mesh_count() const;
20+
1921
// FIXME: Multiple mesh usage is not supported.
2022
const Mesh& get_mesh() const;
2123

@@ -26,4 +28,4 @@ class Scene
2628
std::vector<RasterizedMesh> m_drawing_meshes;
2729
};
2830

29-
} // namespace core
31+
} // namespace core

src/gui/mainwindow.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,14 @@ void MainWindow::load_scene(const std::string& path)
159159
// Load the scene.
160160
m_scene.reset(core::load_scene_from_file(path));
161161

162+
if (m_scene->get_mesh_count() == 0)
163+
{
164+
std::cerr << "No mesh in the scene.\n";
165+
m_mesh_point_cloud.reset(nullptr);
166+
m_closest_point_query.reset(nullptr);
167+
return;
168+
}
169+
162170
// Build a point cloud of the mesh.
163171
m_mesh_point_cloud.reset(new core::MeshPointCloud(m_scene->get_mesh()));
164172

@@ -359,11 +367,10 @@ void MainWindow::animate_query_point()
359367
const glm::vec3 towards_model = m_closest_point_pos - m_query_point_pos;
360368
const glm::vec3 fake_tangent = glm::cross(towards_model, glm::vec3(0.0f, 1.0f, 0.0f));
361369

362-
const float wiggle = std::sin(m_time_since_startup * 0.5f) * 0.5f;
370+
const float wiggle = std::sin(m_time_since_startup) * 0.5f;
363371

364-
m_query_point_pos += towards_model * wiggle * m_frame_delta_time;
365-
m_query_point_pos += fake_tangent * m_frame_delta_time;
366-
m_query_point_pos -= glm::cross(fake_tangent, towards_model) * wiggle * m_frame_delta_time;
372+
m_query_point_pos += fake_tangent * wiggle * m_frame_delta_time;
373+
m_query_point_pos += glm::cross(fake_tangent, towards_model) * wiggle * m_frame_delta_time;
367374
}
368375

369376
// GLFW Window callbacks.

0 commit comments

Comments
 (0)