pub struct TriangleMesh {
pub vertices: Vec<Vec3>,
pub indices: Vec<[usize; 3]>,
}Expand description
A triangle mesh defined by vertices and index triples.
Fields§
§vertices: Vec<Vec3>Vertex positions.
indices: Vec<[usize; 3]>Triangle indices (groups of three).
Implementations§
Source§impl TriangleMesh
impl TriangleMesh
Sourcepub fn surface_area(&self) -> Real
pub fn surface_area(&self) -> Real
Surface area: sum of triangle areas.
Sourcepub fn volume_explicit(&self) -> Real
pub fn volume_explicit(&self) -> Real
Volume via signed tetrahedral decomposition (divergence theorem).
Sourcepub fn center_of_mass_explicit(&self) -> [f64; 3]
pub fn center_of_mass_explicit(&self) -> [f64; 3]
Center of mass via weighted tetrahedral centroids.
Sourcepub fn compute_normals(&self) -> Vec<[f64; 3]>
pub fn compute_normals(&self) -> Vec<[f64; 3]>
Compute per-face normals (unit vectors).
Sourcepub fn ray_cast_full(
&self,
origin: [f64; 3],
direction: [f64; 3],
max_toi: f64,
) -> Option<(f64, usize, [f64; 3])>
pub fn ray_cast_full( &self, origin: [f64; 3], direction: [f64; 3], max_toi: f64, ) -> Option<(f64, usize, [f64; 3])>
Ray cast returning (t, face_index, normal) via Moller-Trumbore for all triangles.
Sourcepub fn is_watertight(&self) -> bool
pub fn is_watertight(&self) -> bool
Check whether the mesh is watertight (every edge is shared by exactly two triangles).
Sourcepub fn vertex_to_faces(&self) -> Vec<Vec<usize>>
pub fn vertex_to_faces(&self) -> Vec<Vec<usize>>
Build vertex-to-face adjacency: for each vertex index, the list of triangle indices that reference it.
Sourcepub fn face_adjacency(&self) -> Vec<Vec<usize>>
pub fn face_adjacency(&self) -> Vec<Vec<usize>>
Build face-to-face adjacency via shared edges.
Returns a vec of the same length as self.indices. Each entry contains
the indices of adjacent faces (those sharing at least one edge).
Sourcepub fn unique_edges(&self) -> Vec<(usize, usize)>
pub fn unique_edges(&self) -> Vec<(usize, usize)>
Return the set of unique edges as sorted (min,max) vertex index pairs.
Sourcepub fn vertex_neighbors(&self) -> Vec<Vec<usize>>
pub fn vertex_neighbors(&self) -> Vec<Vec<usize>>
Build vertex-to-vertex adjacency (1-ring neighbours).
Sourcepub fn edge_collapse(&mut self, v0: usize, v1: usize) -> bool
pub fn edge_collapse(&mut self, v0: usize, v1: usize) -> bool
Collapse an edge between vertices v0 and v1, merging them to their
midpoint. Triangles that degenerate (both endpoints are v0/v1) are
removed.
Returns true if the edge was found and collapsed.
Sourcepub fn compute_vertex_normals(&self) -> Vec<[f64; 3]>
pub fn compute_vertex_normals(&self) -> Vec<[f64; 3]>
Compute per-vertex normals by accumulating face normals weighted by the interior angle at each vertex.
Sourcepub fn laplacian_smooth(&mut self, factor: f64, iterations: usize)
pub fn laplacian_smooth(&mut self, factor: f64, iterations: usize)
Uniform Laplacian smoothing: move each vertex towards the average of
its 1-ring neighbours by factor (0..1). Boundary vertices are not
moved.
Sourcepub fn geodesic_distance(&self, source: usize) -> Vec<f64>
pub fn geodesic_distance(&self, source: usize) -> Vec<f64>
Compute approximate geodesic distances from source vertex to all
other vertices using Dijkstra on edge lengths. Returns a vec of
distances indexed by vertex, with f64::INFINITY for unreachable
vertices.
Sourcepub fn loop_subdivide(&mut self)
pub fn loop_subdivide(&mut self)
Perform one iteration of Loop subdivision.
Each triangle is split into four by inserting edge midpoints (for boundary edges) or Loop-weighted edge vertices (for interior edges). Existing vertices are repositioned using the Loop weighting scheme.
Sourcepub fn boundary_edges(&self) -> Vec<(usize, usize)>
pub fn boundary_edges(&self) -> Vec<(usize, usize)>
Return boundary edges (edges shared by only one triangle).
Sourcepub fn euler_characteristic(&self) -> i64
pub fn euler_characteristic(&self) -> i64
Compute the Euler characteristic: V - E + F.
Sourcepub fn non_manifold_edge_count(&self) -> usize
pub fn non_manifold_edge_count(&self) -> usize
Count non-manifold edges (shared by more than 2 triangles).
Sourcepub fn compute_laplacian_matrix(&self) -> HashMap<(usize, usize), f64>
pub fn compute_laplacian_matrix(&self) -> HashMap<(usize, usize), f64>
Compute the cotangent Laplacian weights for each directed edge (i → j).
Returns a HashMap<(usize, usize), f64> mapping (i, j) to the
symmetric cotangent weight w_{ij} = (cot α + cot β) / 2, where α
and β are the angles opposite to edge (i,j) in the two incident faces.
This is the standard discretisation used in geometry processing for Laplace-Beltrami operators on triangulated surfaces.
Sourcepub fn compute_heat_kernel_signature(&self, t_values: &[f64]) -> Vec<Vec<f64>>
pub fn compute_heat_kernel_signature(&self, t_values: &[f64]) -> Vec<Vec<f64>>
Compute the Heat Kernel Signature (HKS) descriptor for each vertex
at a set of time scales t_values.
The HKS approximates the diagonal of the heat kernel K(x, x, t) using the cotangent Laplacian’s (normalized) diagonal weights. The full spectral decomposition is expensive, so this implementation uses a fast approximation: for each vertex i and time t, it computes
HKS(i, t) = exp(-t * D[i])
where D[i] is the sum of cotangent weights incident on vertex i
(the diagonal of the stiffness matrix, normalised by the vertex area).
Returns a Vec<Vecf64> of shape [n_vertices][t_values.len()].
Sourcepub fn smooth_laplacian(&mut self, factor: f64, iterations: usize)
pub fn smooth_laplacian(&mut self, factor: f64, iterations: usize)
Iterative Laplacian smoothing using cotangent weights.
Each iteration moves vertex i towards the weighted average of its
neighbours:
v_i’ = v_i + factor * Σ_j w_{ij} * (v_j - v_i) / Σ_j w_{ij}
Boundary vertices (those on edges shared by only one triangle) are kept fixed.
factor – step size in [0, 1]; iterations – number of passes.
Trait Implementations§
Source§impl Clone for TriangleMesh
impl Clone for TriangleMesh
Source§fn clone(&self) -> TriangleMesh
fn clone(&self) -> TriangleMesh
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for TriangleMesh
impl Debug for TriangleMesh
Source§impl Shape for TriangleMesh
impl Shape for TriangleMesh
Source§fn bounding_box(&self) -> Aabb
fn bounding_box(&self) -> Aabb
Source§fn support_point(&self, direction: &Vec3) -> Vec3
fn support_point(&self, direction: &Vec3) -> Vec3
Source§fn center_of_mass(&self) -> Vec3
fn center_of_mass(&self) -> Vec3
Source§fn inertia_tensor(&self, mass: Real) -> Mat3
fn inertia_tensor(&self, mass: Real) -> Mat3
Source§fn ray_cast(
&self,
ray_origin: &Vec3,
ray_direction: &Vec3,
max_toi: Real,
) -> Option<RayHit>
fn ray_cast( &self, ray_origin: &Vec3, ray_direction: &Vec3, max_toi: Real, ) -> Option<RayHit>
max_toi.Source§fn mass_properties(&self, density: Real) -> MassProperties
fn mass_properties(&self, density: Real) -> MassProperties
Auto Trait Implementations§
impl Freeze for TriangleMesh
impl RefUnwindSafe for TriangleMesh
impl Send for TriangleMesh
impl Sync for TriangleMesh
impl Unpin for TriangleMesh
impl UnsafeUnpin for TriangleMesh
impl UnwindSafe for TriangleMesh
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.