Skip to content

Commit

Permalink
small numerical fix to point_mesh
Browse files Browse the repository at this point in the history
Summary: Small fix by adjusting the area `eps` to account for really small faces when computing point to face distances

Reviewed By: bottler

Differential Revision: D34331336

fbshipit-source-id: 51c4888ea46fefa4e31d5b0bb494a9f9d77813cd
  • Loading branch information
gkioxari authored and facebook-github-bot committed Feb 21, 2022
1 parent 3de4122 commit ee71c7c
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 4 deletions.
2 changes: 1 addition & 1 deletion pytorch3d/csrc/utils/geometry_utils.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -550,7 +550,7 @@ __device__ inline bool IsInsideTriangle(
const float3& v1,
const float3& v2) {
bool inside;
if (AreaOfTriangle(v0, v1, v2) < 1e-5) {
if (AreaOfTriangle(v0, v1, v2) < 5e-3) {
inside = 0;
} else {
float3 bary = BarycentricCoords3Forward(p, v0, v1, v2);
Expand Down
2 changes: 1 addition & 1 deletion pytorch3d/csrc/utils/geometry_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -651,7 +651,7 @@ static bool IsInsideTriangle(
const vec3<T>& v1,
const vec3<T>& v2) {
bool inside;
if (AreaOfTriangle(v0, v1, v2) < 1e-5) {
if (AreaOfTriangle(v0, v1, v2) < 5e-3) {
inside = 0;
} else {
vec3<T> bary = BarycentricCoords3Forward(p, v0, v1, v2);
Expand Down
8 changes: 6 additions & 2 deletions tests/test_point_mesh_distance.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@
from common_testing import TestCaseMixin, get_random_cuda_device
from pytorch3d import _C
from pytorch3d.loss import point_mesh_edge_distance, point_mesh_face_distance
from pytorch3d.structures import Meshes, Pointclouds, packed_to_list
from pytorch3d.structures import (
Meshes,
Pointclouds,
packed_to_list,
)


class TestPointMeshDistance(TestCaseMixin, unittest.TestCase):
Expand Down Expand Up @@ -126,7 +130,7 @@ def _is_inside_triangle(point: torch.Tensor, tri: torch.Tensor) -> torch.Tensor:
area = torch.cross(v0, v1).norm() / 2.0

# check if triangle is a line or a point. In that case, return False
if area < 1e-5:
if area < 5e-3:
return False
bary = TestPointMeshDistance._point_to_bary(point, tri)
inside = ((bary >= 0.0) * (bary <= 1.0)).all()
Expand Down

0 comments on commit ee71c7c

Please sign in to comment.