Source code for digeo.mesh_loader

import numpy as np
from typing import Union
from pathlib import Path
import trimesh
import torch

from digeo.mesh import Mesh


def create_triangle() -> Mesh:
    """Create a simple triangle mesh."""

    # Define vertices
    vertices = np.array(
        [
            [0.0, 0.0, 0.0],
            [1.0, 0.0, 0.0],
            [0.0, 1.0, 0.0],
        ],
        dtype=np.float64,
    )

    # Define triangles (faces)
    triangles = np.array([[0, 1, 2]], dtype=np.int32)

    mesh = Mesh(vertices=vertices, faces=triangles)

    return mesh


def create_tetrahedron() -> Mesh:
    """Create a tetrahedron mesh."""

    # Define vertices
    positions = np.array(
        [
            [0.0, 0.0, 0.0],  # Vertex 0
            [1.0, 0.0, 0.0],  # Vertex 1
            [0.0, 1.0, 0.0],  # Vertex 2
            [0.0, 0.0, 1.0],  # Vertex 3
        ],
        dtype=np.float64,
    )

    # Define triangles (faces)
    triangles = np.array(
        [
            [0, 1, 2],  # Face 0: Base triangle
            [0, 1, 3],  # Face 1: Side triangle
            [1, 2, 3],  # Face 2: Side triangle
            [0, 2, 3],  # Face 3: Side triangle
        ],
        dtype=np.int32,
    )

    mesh = Mesh(vertices=positions, faces=triangles)

    return mesh


[docs] def load_mesh_from_trimesh( mesh: trimesh.Trimesh, device="cpu", dtype=torch.float32 ) -> Mesh: """ Load a mesh from a trimesh object. Parameters ---------- mesh: trimesh.Trimesh The trimesh object Returns ------- Mesh The loaded mesh """ # remove degenerate faces degenerate = np.any( [ mesh.faces[:, 0] == mesh.faces[:, 1], mesh.faces[:, 1] == mesh.faces[:, 2], mesh.faces[:, 2] == mesh.faces[:, 0], ], axis=0, ) mesh.update_faces(~degenerate) return Mesh( vertices=mesh.vertices, faces=mesh.faces, adjacencies=None, triangle_normals=mesh.face_normals.copy(), v2t=None, vertex_normals=mesh.vertex_normals.copy(), device=device, dtype=dtype, )
[docs] def load_mesh_from_file( filename: Union[str, Path], device="cpu", dtype=torch.float32 ) -> Mesh: """ Load a mesh from a file. The file type is determined from the extension. Parameters ---------- filename: str | Path Path to the mesh file Returns ------- Mesh The loaded mesh """ mesh_trimesh = trimesh.load_mesh(filename, maintain_order=True, process=False) return load_mesh_from_trimesh(mesh_trimesh, device=device, dtype=dtype)