Skip to content

Commit bfb5f90

Browse files
Merge pull request #1172 from Geode-solutions/fix-ray-tracing-if-origin-on-surface
fix(RayTracing): change process if intersection can be detected but n…
2 parents 1150d52 + 4b9ae3a commit bfb5f90

File tree

2 files changed

+26
-18
lines changed

2 files changed

+26
-18
lines changed

src/geode/mesh/helpers/ray_tracing.cpp

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -461,26 +461,34 @@ namespace geode
461461
std::lock_guard< std::mutex > lock{ mutex_ };
462462
results_.emplace_back( polygon_id, distance, result.second,
463463
std::move( intersection_result ) );
464+
break;
464465
}
465-
else
466+
for( const auto e2 : LRange{ 3 } )
466467
{
467-
for( const auto e2 : LRange{ 3 } )
468-
{
469-
auto point = std::get< 1 >( segment_segment_distance(
470-
Segment3D{ segment_ },
468+
auto [ray_edge_distance, point, _] =
469+
segment_segment_distance( Segment3D{ segment_ },
471470
{ triangle.vertices()[e2].get(),
472-
triangle.vertices()[( e2 + 1 ) % 3].get() } ) );
473-
auto distance = point_point_distance( origin_, point );
474-
if( Vector3D{ origin_, point }.dot(
475-
segment_.direction() )
476-
< 0 )
477-
{
478-
distance *= -1.;
479-
}
480-
std::lock_guard< std::mutex > lock{ mutex_ };
481-
results_.emplace_back( polygon_id, distance,
482-
result.second, std::move( point ) );
471+
triangle.vertices()[( e2 + 1 ) % 3].get() } );
472+
if( ray_edge_distance > GLOBAL_EPSILON )
473+
{
474+
continue;
475+
}
476+
if( Vector3D{ origin_, point }.dot( segment_.direction() )
477+
< 0 )
478+
{
479+
ray_edge_distance *= -1.;
483480
}
481+
std::lock_guard< std::mutex > lock{ mutex_ };
482+
results_.emplace_back( polygon_id, ray_edge_distance,
483+
result.second, std::move( point ) );
484+
}
485+
const auto [distance, __, triangle_point] =
486+
segment_triangle_distance( segment_, triangle );
487+
if( distance < GLOBAL_EPSILON )
488+
{
489+
std::lock_guard< std::mutex > lock{ mutex_ };
490+
results_.emplace_back(
491+
polygon_id, distance, result.second, triangle_point );
484492
}
485493
break;
486494
}

tests/mesh/test-ray-tracing.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include <geode/mesh/core/surface_mesh.hpp>
3131
#include <geode/mesh/helpers/aabb_surface_helpers.hpp>
3232
#include <geode/mesh/helpers/ray_tracing.hpp>
33+
#include <geode/mesh/io/triangulated_surface_output.hpp>
3334

3435
#include <geode/tests/common.hpp>
3536

@@ -99,7 +100,6 @@ void test_ray_parallel()
99100
builder->create_point( geode::Point3D{ { -1, 1, 0 } } );
100101
builder->create_point( geode::Point3D{ { -2, 0, 0 } } );
101102
builder->create_polygon( { 0, 1, 2 } );
102-
103103
const auto aabb = geode::create_aabb_tree( *mesh );
104104
const geode::Vector3D direction{ { -1, 0, 0 } };
105105
const geode::Point3D origin{ { 0, 0, 0 } };
@@ -111,7 +111,7 @@ void test_ray_parallel()
111111
OPENGEODE_EXCEPTION(
112112
result->polygon == 0, "[Test] Ray edge wrong polygon" );
113113
OPENGEODE_EXCEPTION(
114-
result->distance == 1, "[Test] Ray edge wrong distance" );
114+
result->distance == 0, "[Test] Ray edge wrong distance" );
115115
}
116116

117117
void test()

0 commit comments

Comments
 (0)