Classic Marching Cubes algorithm implementation

Summary:
Defines a function to run marching cubes algorithm on a single or batch of 3D scalar fields. Returns a mesh's faces and vertices.

UPDATES (12/18)
- Input data is now specified as a (B, D, H, W) tensor as opposed to a (B, W, H, D) tensor. This will now be compatible with the Volumes datastructure.
- Add an option to return output vertices in local coordinates instead of world coordinates.
Also added a small fix to remove the dype for device in Transforms3D - if passing in a torch.device instead of str it causes a pyre error.

Reviewed By: jcjohnson

Differential Revision: D24599019

fbshipit-source-id: 90554a200319fed8736a12371cc349e7108aacd0
This commit is contained in:
Nikhila Ravi
2020-12-18 07:25:18 -08:00
committed by Facebook GitHub Bot
parent 9c6b58c5ad
commit ebac66daeb
7 changed files with 1693 additions and 5 deletions

View File

@@ -414,7 +414,7 @@ class Transform3d:
class Translate(Transform3d):
def __init__(self, x, y=None, z=None, dtype=torch.float32, device: str = "cpu"):
def __init__(self, x, y=None, z=None, dtype=torch.float32, device="cpu"):
"""
Create a new Transform3d representing 3D translations.
@@ -448,7 +448,7 @@ class Translate(Transform3d):
class Scale(Transform3d):
def __init__(self, x, y=None, z=None, dtype=torch.float32, device: str = "cpu"):
def __init__(self, x, y=None, z=None, dtype=torch.float32, device="cpu"):
"""
A Transform3d representing a scaling operation, with different scale
factors along each coordinate axis.
@@ -489,7 +489,7 @@ class Scale(Transform3d):
class Rotate(Transform3d):
def __init__(
self, R, dtype=torch.float32, device: str = "cpu", orthogonal_tol: float = 1e-5
self, R, dtype=torch.float32, device="cpu", orthogonal_tol: float = 1e-5
):
"""
Create a new Transform3d representing 3D rotation using a rotation
@@ -528,7 +528,7 @@ class RotateAxisAngle(Rotate):
axis: str = "X",
degrees: bool = True,
dtype=torch.float64,
device: str = "cpu",
device="cpu",
):
"""
Create a new Transform3d representing 3D rotation about an axis
@@ -635,7 +635,7 @@ def _handle_input(x, y, z, dtype, device, name: str, allow_singleton: bool = Fal
return xyz
def _handle_angle_input(x, dtype, device: str, name: str):
def _handle_angle_input(x, dtype, device, name: str):
"""
Helper function for building a rotation function using angles.
The output is always of shape (N,).