Navigation
API > API/Plugins > API/Plugins/DynamicMesh
Intrinsic Meshes:
An Intrinsic Mesh can be thought of as a mesh that overlays another mesh, sharing the original surface. The edges of the intrinsic mesh are constrained to be on the original mesh surface, but need not align with the original mesh edges. The lengths of the intrinsic edges are measured on the surface of the original mesh (not the R3 distance). The original mesh vertices are a subset of the intrinsic mesh vertices and intrinsic edge splits and triangle pokes may introduce new intrinsic mesh vertices.
Note: the implementation is a simple triangle-based mesh but there is no restriction that edge(a, b) is unique (e.g. multiple intrinsic edges may connect the same two vertices with different paths). In fact this mesh allows triangles and edges with repeated vertices. Such structures arise naturally with intrinsic triangulation, for example an edge that starts and ends at the same vertex may encircle a mesh.
The bookkeeping that manages the correspondence between locations on the intrinsic mesh and on the surface mesh is implemented either using integer-based "Normal Coordinates" ( cf 'Integer Coordinates for Intrinsic Geometry Processing' M. Gillespie, N. Sharp, and K. Crane, TOG , Vol. 40, December 2021. ) as used by FIntrinsicEdgeFlipMesh and FIntrinsicMesh; or alternately floating-point based generalized directions "Signpost data" ( cf 'Signpost Coordinates inspired by "Navigating Intrinsic Triangulations' Sharp, Soliman and Crane [2019, ACM Transactions on Graphics]) as used by FIntrinsicTriangulation. The FSimpleIntrinsicEdgeFlipMesh is designed to work with the function FlipToDelaunay() to make an Intrinsic Delaunay Triangulation (IDT) of the same surface as a given FDynamicMesh, allowing for more robust cotangent-Laplacians (see LaplacianMatrixAssembly.h)
The vertices in this FSimpleIntrinsicEdgeFlipMesh are exactly those found in the surface mesh since it supports edge flips, but no other operations that change the mesh connectivity, and no operations that affect the vertices.
This mesh alone does not support computing the intersections of intrinsic edges with the surface mesh edges and as a result it can not be used to easily extract the path of an intrinsic edge. To do such computations FIntrinsicEdgeFlipMesh, FIntrinsicMesh or FIntrinsicTriangulation should be used.
The API of FIntrinsicEdgeFlipMesh is similar to FDynamicMesh3, but only has a minimal subset of methods and some such as FlipEdge() and GetEdgeOpposingV() have very different implementations.
In addition to managing vertices, triangles and edges this class also tracks edge lengths (as measured on the surface mesh) and for convenience the internal angles for each triangle.
| Name | FSimpleIntrinsicEdgeFlipMesh |
| Type | class |
| Header File | /Engine/Plugins/Runtime/GeometryProcessing/Source/DynamicMesh/Public/Operations/IntrinsicTriangulationMesh.h |
| Include Path | #include "Operations/IntrinsicTriangulationMesh.h" |
Syntax
class FSimpleIntrinsicEdgeFlipMesh
Derived Classes
Constructors
| Name | Remarks | Include Path | Unreal Specifiers |
|---|---|---|---|
| Operations/IntrinsicTriangulationMesh.h | |||
FSimpleIntrinsicEdgeFlipMesh
(
const FDynamicMesh3& SrcMesh |
Constructor does ID-matching deep copy the basic mesh topology (but no attributes or groups) | Operations/IntrinsicTriangulationMesh.h | |
| Operations/IntrinsicTriangulationMesh.h |
Structs
| Name | Remarks |
|---|---|
| FEdgeFlipInfo | Information collected when flipping an edge. |
Typedefs
| Name | Type | Remarks | Include Path |
|---|---|---|---|
| FEdge | FDynamicMesh3::FEdge | Operations/IntrinsicTriangulationMesh.h |
Constants
| Name | Type | Remarks | Include Path |
|---|---|---|---|
| InvalidID | int | InvalidID indicates that a vertex/edge/triangle ID is invalid | Operations/IntrinsicTriangulationMesh.h |
Functions
Public
| Name | Remarks | Include Path | Unreal Specifiers |
|---|---|---|---|
bool AreSameOrientation
(
int32 EID |
Operations/IntrinsicTriangulationMesh.h | ||
void Clear() |
Discard all data | Operations/IntrinsicTriangulationMesh.h | |
double EdgeCotanWeight
(
int32 EID |
Return 1/2 ( cot(alpha_{ij}) + cot(beta_{ij}) ) where alpha_{ij} and beta_{ij} are the to interior angles opposite the specified edge, EID. | Operations/IntrinsicTriangulationMesh.h | |
int32 EdgeCount() |
Operations/IntrinsicTriangulationMesh.h | ||
FRefCountVector::IndexEnumerable EdgeIndicesItr() |
Operations/IntrinsicTriangulationMesh.h | ||
FVector2d EdgeOpposingAngles
(
int32 EID |
Return FVector2( alpha_{ij} , beta_{ij} ) where alpha_{ij} and beta_{ij} are the two interior angles opposite the specified edge, EID. | Operations/IntrinsicTriangulationMesh.h | |
EMeshResult FlipEdge
(
int32 EID, |
Flip a single edge in the Intrinsic Mesh. | Operations/IntrinsicTriangulationMesh.h | |
FEdge GetEdge
(
int32 EdgeID |
Operations/IntrinsicTriangulationMesh.h | ||
double GetEdgeLength
(
int32 EID |
Operations/IntrinsicTriangulationMesh.h | ||
FIndex2i GetEdgeOpposingV
(
int32 EID |
Operations/IntrinsicTriangulationMesh.h | ||
FIndex2i GetEdgeT
(
int32 EdgeID |
Operations/IntrinsicTriangulationMesh.h | ||
FIndex2i GetEdgeV
(
int32 EdgeID |
Operations/IntrinsicTriangulationMesh.h | ||
FIndex3i GetTriangle
(
int32 TriangleID |
Operations/IntrinsicTriangulationMesh.h | ||
const FIndex3i & GetTriangleRef
(
int TriangleID |
Operations/IntrinsicTriangulationMesh.h | ||
FVector3d GetTriEdgeLengths
(
const int32 TID |
Operations/IntrinsicTriangulationMesh.h | ||
FIndex3i GetTriEdges
(
int32 TriangleID |
Operations/IntrinsicTriangulationMesh.h | ||
double GetTriInternalAngleR
(
const int32 TID, |
Operations/IntrinsicTriangulationMesh.h | ||
FVector3d GetVertex
(
int32 VertexID |
Operations/IntrinsicTriangulationMesh.h | ||
int32 GetVtxEdgeCount
(
int32 VID |
Operations/IntrinsicTriangulationMesh.h | ||
bool IsBoundaryEdge
(
int32 EdgeID |
Operations/IntrinsicTriangulationMesh.h | ||
bool IsBoundaryVertex
(
int32 VertexID |
Operations/IntrinsicTriangulationMesh.h | ||
bool IsEdge
(
int32 EdgeID |
Operations/IntrinsicTriangulationMesh.h | ||
bool IsTriangle
(
int32 TriangleID |
Operations/IntrinsicTriangulationMesh.h | ||
bool IsVertex
(
int32 VertexID |
Operations/IntrinsicTriangulationMesh.h | ||
int32 MaxEdgeID() |
Operations/IntrinsicTriangulationMesh.h | ||
int32 MaxTriangleID() |
Operations/IntrinsicTriangulationMesh.h | ||
int32 MaxVertexID() |
Operations/IntrinsicTriangulationMesh.h | ||
Vector3Type Permute
(
int32 Index, |
Cyclic permutation of the src vector such that the 'Index' entry in the src is the first entry in the result NB: Index must be 0, 1, or 2. | Operations/IntrinsicTriangulationMesh.h | |
void Reset
(
const FDynamicMesh3& SrcMesh |
Reset the mesh to an ID-matching deep copy the basic mesh topology (but no attributes or groups) | Operations/IntrinsicTriangulationMesh.h | |
int32 TriangleCount() |
Operations/IntrinsicTriangulationMesh.h | ||
FRefCountVector::IndexEnumerable TriangleIndicesItr() |
Operations/IntrinsicTriangulationMesh.h | ||
FSmallListSet::ValueEnumerable VtxEdgesItr
(
int32 VID |
Operations/IntrinsicTriangulationMesh.h |
Protected
| Name | Remarks | Include Path | Unreal Specifiers |
|---|---|---|---|
FVector3d ComputeTriInternalAnglesR
(
const int32 TID |
Computes the angles based on the edge lengths, so must have valid EdgeLengths for this tri before calling. | Operations/IntrinsicTriangulationMesh.h | |
EMeshResult FlipEdgeTopology
(
int32 eab, |
Update the mesh topology (e.g. triangles and edges) by doing an edge flip, but does not update the intrinsic edge lengths or angles. | Operations/IntrinsicTriangulationMesh.h | |
FVector3d GetEdgeLengthTriple
(
const FIndex3i& EIDs |
Operations/IntrinsicTriangulationMesh.h | ||
double GetOpposingVerticesDistance
(
int32 EID |
Operations/IntrinsicTriangulationMesh.h | ||
FIndex2i GetOrientedEdgeV
(
int32 EID, |
Operations/IntrinsicTriangulationMesh.h | ||
int32 ReplaceEdgeTriangle
(
int32 eID, |
Replace tOld with tNew in an existing edge | Operations/IntrinsicTriangulationMesh.h | |
int32 ReplaceTriangleEdge
(
int32 tID, |
Replace eOld with eNew in and existing triangle | Operations/IntrinsicTriangulationMesh.h | |
void SetEdgeTrianglesInternal
(
int32 EdgeID, |
Update the existing edge to reference triangles t0 and t1 | Operations/IntrinsicTriangulationMesh.h | |
void SetEdgeVerticesInternal
(
int32 EdgeID, |
Update the existing edge to reference vertices 'a' and 'b'. | Operations/IntrinsicTriangulationMesh.h |