PxTetMaker

Defined in include/extensions/PxTetMakerExt.h

class PxTetMaker

Provides functionality to create a tetrahedral mesh from a triangle mesh.

Public Static Functions

static bool createConformingTetrahedronMesh(const PxSimpleTriangleMesh &triangleMesh, physx::PxArray<physx::PxVec3> &outVertices, physx::PxArray<physx::PxU32> &outTetIndices, const bool validate = true, PxReal volumeThreshold = 0.0f)

Create conforming tetrahedron mesh using TetMaker.

Parameters
  • triangleMesh[in] The description of the triangle mesh including vertices and indices

  • outVertices[out] The vertices to store the conforming tetrahedral mesh

  • outTetIndices[out] The indices to store the conforming tetrahedral mesh

  • validate[in] If set to true the input triangle mesh will get analyzed to find possible deficiencies

  • volumeThreshold[in] Tetrahedra with a volume smaller than the specified threshold will be removed from the mesh

Returns

True if success

static bool createVoxelTetrahedronMesh(const PxTetrahedronMeshDesc &tetMesh, const PxU32 numVoxelsAlongLongestBoundingBoxAxis, physx::PxArray<physx::PxVec3> &outVertices, physx::PxArray<physx::PxU32> &outTetIndices, PxI32 *inputPointToOutputTetIndex = NULL, const PxU32 *anchorNodeIndices = NULL, PxU32 numTetsPerVoxel = 5)

Create voxel-based tetrahedron mesh using TetMaker.

Parameters
  • tetMesh[in] The description of the tetrahedral mesh including vertices and indices

  • numVoxelsAlongLongestBoundingBoxAxis[in] The number of voxels along the longest bounding box axis

  • outVertices[out] The vertices to store the voxel-based tetrahedral mesh

  • outTetIndices[out] The indices to store the voxel-based tetrahedral mesh

  • inputPointToOutputTetIndex[out] Buffer with the size of nbTetVerts that contains the tetrahedron index containing the input point with the same index

  • anchorNodeIndices[in] Some input vertices may not be referenced by any tetrahedron. They can be mapped to another input vertex that is used by a tetrahedron to support embedding of additional points.

  • numTetsPerVoxel[in] The number of tetrahedra used to fill a voxel. Only a value of 5 or 6 is supported. 5 is recommended because it mostly avoids mesh anisotropy.

Returns

True if success

static bool createVoxelTetrahedronMeshFromEdgeLength(const PxTetrahedronMeshDesc &tetMesh, const PxReal voxelEdgeLength, physx::PxArray<physx::PxVec3> &outVertices, physx::PxArray<physx::PxU32> &outTetIndices, PxI32 *inputPointToOutputTetIndex = NULL, const PxU32 *anchorNodeIndices = NULL, PxU32 numTetsPerVoxel = 5)

Create voxel-based tetrahedron mesh using TetMaker.

Parameters
  • tetMesh[in] The description of the tetrahedral mesh including vertices and indices

  • voxelEdgeLength[in] The edge length of a voxel.Can be adjusted slightly such that a multiple of it matches the input points’ bounding box size

  • outVertices[out] The vertices to store the voxel-based tetrahedral mesh

  • outTetIndices[out] The indices to store the voxel-based tetrahedral mesh

  • inputPointToOutputTetIndex[out] Buffer with the size of nbTetVerts that contains the tetrahedron index containing the input point with the same index

  • anchorNodeIndices[in] Some input vertices may not be referenced by any tetrahedron. They can be mapped to another input vertex that is used by a tetrahedron to support embedding of additional points.

  • numTetsPerVoxel[in] The number of tetrahedra used to fill a voxel. Only a value of 5 or 6 is supported. 5 is recommended because it mostly avoids mesh anisotropy.

Returns

True if success

static PxTriangleMeshAnalysisResults validateTriangleMesh(const PxSimpleTriangleMesh &triangleMesh, const PxReal minVolumeThreshold = 1e-6f, const PxReal minTriangleAngleRadians = 10.0f * 3.1415926535898f / 180.0f)

Analyzes the triangle mesh to get a report about deficiencies.

Some deficiencies can be handled by the tetmesher, others cannot.

Parameters
  • triangleMesh[in] The description of the triangle mesh including vertices and indices

  • minVolumeThreshold[in] Minimum volume the mesh must have such that no volume warning is generated

  • minTriangleAngleRadians[in] Minimum angle allowed for triangles such that no angle warning is generated

Returns

Flags that describe the triangle mesh’s deficiencies

static PxTetrahedronMeshAnalysisResults validateTetrahedronMesh(const PxBoundedData &points, const PxBoundedData &tetrahedra, const PxReal minTetVolumeThreshold = 1e-8f)

Analyzes the tetrahedron mesh to get a report about deficiencies.

Some deficiencies can be handled by the softbody cooker, others cannot.

Parameters
  • points[in] The mesh’s points

  • tetrahedra[in] The mesh’s tetrahedra (index buffer)

  • minTetVolumeThreshold[in] Minimum volume every tetrahedron in the mesh must have such that no volume warning is generated

Returns

Flags that describe the tetrahedron mesh’s deficiencies

static void simplifyTriangleMesh(const PxArray<PxVec3> &inputVertices, const PxArray<PxU32> &inputIndices, int targetTriangleCount, PxF32 maximalEdgeLength, PxArray<PxVec3> &outputVertices, PxArray<PxU32> &outputIndices, PxArray<PxU32> *vertexMap = NULL, PxReal edgeLengthCostWeight = 0.1f, PxReal flatnessDetectionThreshold = 0.01f, bool projectSimplifiedPointsOnInputMeshSurface = false, PxArray<PxU32> *outputVertexToInputTriangle = NULL, bool removeDisconnectedPatches = false)

Simplifies (decimates) a triangle mesh using quadric simplification.

Parameters
  • inputVertices[in] The vertices of the input triangle mesh

  • inputIndices[in] The indices of the input triangle mesh of the form (id0, id1, id2), (id0, id1, id2), ..

  • targetTriangleCount[in] Desired number of triangles in the output mesh

  • maximalEdgeLength[in] Edges below this length will not be collapsed. A value of zero means there is no limit.

  • outputVertices[out] The vertices of the output (decimated) triangle mesh

  • outputIndices[out] The indices of the output (decimated) triangle mesh of the form (id0, id1, id2), (id0, id1, id2), ..

  • vertexMap[out] Optional parameter which returns the mapping from input to output vertices. Note that multiple input vertices are typically collapsed into the same output vertex.

  • edgeLengthCostWeight[in] Factor to scale influence of edge length when prioritizing edge collapses. Has no effect if set to zero.

  • flatnessDetectionThreshold[in] Threshold used to detect edges in flat regions and to improve the placement of the collapsed point. If set to a large value it will have no effect.

  • projectSimplifiedPointsOnInputMeshSurface[in] If set to true, the simplified points will lie exactly on the original surface.

  • outputVertexToInputTriangle[out] Optional indices providing the triangle index per resulting vertex. Only available when projectSimplifiedPointsOnInputMeshSurface is set to true

  • removeDisconnectedPatches[in] Enables the optional removal of disconnected triangles in the mesh. Only the largest connected set/patch will be kept

static void remeshTriangleMesh(const PxArray<PxVec3> &inputVertices, const PxArray<PxU32> &inputIndices, PxU32 gridResolution, PxArray<PxVec3> &outputVertices, PxArray<PxU32> &outputIndices, PxArray<PxU32> *vertexMap = NULL)

Creates a new mesh from a given mesh.

The input mesh is first voxelized. The new surface is created from the voxel surface and subsequent projection to the original mesh.

Parameters
  • inputVertices[in] The vertices of the input triangle mesh

  • inputIndices[in] The indices of the input triangle mesh of the form (id0, id1, id2), (id0, id1, id2), ..

  • gridResolution[in] Size of the voxel grid (number of voxels along the longest dimension)

  • outputVertices[out] The vertices of the output (decimated) triangle mesh

  • outputIndices[out] The indices of the output (decimated) triangle mesh of the form (id0, id1, id2), (id0, id1, id2), ..

  • vertexMap[out] Optional parameter which returns a mapping from input to output vertices. Since the meshes are independent, the mapping returns an output vertex that is topologically close to the input vertex.

static void remeshTriangleMesh(const PxVec3 *inputVertices, PxU32 nbVertices, const PxU32 *inputIndices, PxU32 nbIndices, PxU32 gridResolution, PxArray<PxVec3> &outputVertices, PxArray<PxU32> &outputIndices, PxArray<PxU32> *vertexMap = NULL)

Creates a new mesh from a given mesh.

The input mesh is first voxelized. The new surface is created from the voxel surface and subsequent projection to the original mesh.

Parameters
  • inputVertices[in] The vertices of the input triangle mesh

  • nbVertices[in] The number of vertices of the input triangle mesh

  • inputIndices[in] The indices of the input triangle mesh of the form (id0, id1, id2), (id0, id1, id2), ..

  • nbIndices[in] The number of indices of the input triangle mesh (equal to three times the number of triangles)

  • gridResolution[in] Size of the voxel grid (number of voxels along the longest dimension)

  • outputVertices[out] The vertices of the output (decimated) triangle mesh

  • outputIndices[out] The indices of the output (decimated) triangle mesh of the form (id0, id1, id2), (id0, id1, id2), ..

  • vertexMap[out] Optional parameter which returns a mapping from input to output vertices. Since the meshes are independent, the mapping returns an output vertex that is topologically close to the input vertex.

static void createTreeBasedTetrahedralMesh(const PxArray<PxVec3> &inputVertices, const PxArray<PxU32> &inputIndices, bool useTreeNodes, PxArray<PxVec3> &outputVertices, PxArray<PxU32> &outputIndices, PxReal volumeThreshold = 0.0f)

Creates a tetrahedral mesh using an octree.

Parameters
  • inputVertices[in] The vertices of the input triangle mesh

  • inputIndices[in] The indices of the input triangle mesh of the form (id0, id1, id2), (id0, id1, id2), ..

  • useTreeNodes[in] Using the nodes of the octree as tetrahedral vertices

  • outputVertices[out] The vertices of the output tetrahedral mesh

  • outputIndices[out] The indices of the output tetrahedral mesh of the form (id0, id1, id2, id3), (id0, id1, id2, id3), ..

  • volumeThreshold[in] Tetrahedra with a volume smaller than the specified threshold will be removed from the mesh

static void createRelaxedVoxelTetrahedralMesh(const PxArray<PxVec3> &inputVertices, const PxArray<PxU32> &inputIndices, PxArray<PxVec3> &outputVertices, PxArray<PxU32> &outputIndices, PxI32 resolution, PxI32 numRelaxationIterations = 5, PxF32 relMinTetVolume = 0.05f)

Creates a tetrahedral mesh by relaxing a voxel mesh around the input mesh.

Parameters
  • inputVertices[in] The vertices of the input triangle mesh

  • inputIndices[in] The indices of the input triangle mesh of the form (id0, id1, id2), (id0, id1, id2), ..

  • outputVertices[out] The vertices of the output tetrahedral mesh

  • outputIndices[out] The indices of the output tetrahedral mesh of the form (id0, id1, id2, id3), (id0, id1, id2, id3), ..

  • resolution[in] The grid spacing is computed as the diagonal of the bounding box of the input mesh divided by the resolution.

  • numRelaxationIterations[in] Number of iterations to pull the tetrahedral mesh towards the input mesh

  • relMinTetVolume[in] Constrains the volumes of the tetrahedra to stay abobe relMinTetvolume times the tetrahedron’s rest volume.

static void detectTriangleIslands(const PxI32 *triangles, PxU32 numTriangles, PxArray<PxU32> &islandIndexPerTriangle)

Creates a tetrahedral mesh by relaxing a voxel mesh around the input mesh.

Parameters
  • triangles[in] The indices of the input triangle mesh of the form (id0, id1, id2), (id0, id1, id2), ..

  • numTriangles[in] The number of triangles

  • islandIndexPerTriangle[out] Every triangle gets an island index assigned. Triangles with the same island index belong to the same patch of connected triangles.

static PxU32 findLargestIslandId(const PxU32 *islandIndexPerTriangle, PxU32 numTriangles)

Creates a tetrahedral mesh by relaxing a voxel mesh around the input mesh.

Parameters
  • islandIndexPerTriangle[in] An island marker per triangles. All triangles with the same marker belong to an island. Can becomputed using the method detectTriangleIslands.

  • numTriangles[in] The number of triangles

Returns

The marker value of the island that contains the most triangles