This class provides a description of a mesh made of polygonal faces (not limited to triangles).
More...
|
| PolygonalMesh () |
| Create an empty PolygonalMesh, with no vertices or faces. More...
|
|
void | clear () |
| Restore this PolygonalMesh to its default-constructed state, meaning that it will contain no vertices or faces after this call. More...
|
|
int | getNumFaces () const |
| Get the number of faces in the mesh. More...
|
|
int | getNumVertices () const |
| Get the number of vertices in the mesh. More...
|
|
const Vec3 & | getVertexPosition (int vertex) const |
| Get the position of a vertex in the mesh. More...
|
|
int | getNumVerticesForFace (int face) const |
| Get the number of vertices that make up a particular face. More...
|
|
int | getFaceVertex (int face, int vertex) const |
| Get the index of one of the vertices of a face. More...
|
|
int | addVertex (const Vec3 &position) |
| Add a vertex to the mesh. More...
|
|
int | addFace (const Array_< int > &vertices) |
| Add a face to the mesh. More...
|
|
PolygonalMesh & | scaleMesh (Real scale) |
| Scale a mesh by multiplying every vertex by a fixed value. More...
|
|
PolygonalMesh & | transformMesh (const Transform &X_AM) |
| Transform a mesh by applying the given Transform to every vertex, leaving the mesh permanently changed. More...
|
|
void | loadFile (const String &pathname) |
| Attempt to interpret the given file as a mesh file, with the format determined from the file name extension. More...
|
|
void | loadObjFile (const String &pathname) |
| Load a Wavefront OBJ (.obj) file, adding the vertices and faces it contains to this mesh, and ignoring anything else in the file. More...
|
|
void | loadObjFile (std::istream &file) |
| Alternate signature for Wavefront OBJ format that takes an already-open istream rather than a pathname. More...
|
|
void | loadVtpFile (const String &pathname) |
| Load a VTK PolyData (.vtp) file, adding the vertices and faces it contains to this mesh and ignoring anything else in the file. More...
|
|
void | loadStlFile (const String &pathname) |
| Load an STL file, adding the vertices and faces it contains to this mesh and ignoring anything else in the file. More...
|
|
Public Member Functions inherited from SimTK::PIMPLHandle< PolygonalMesh, PolygonalMeshImpl, true > |
bool | isEmptyHandle () const |
| Returns true if this handle is empty, that is, does not refer to any implementation object. More...
|
|
bool | isOwnerHandle () const |
| Returns true if this handle is the owner of the implementation object to which it refers. More...
|
|
bool | isSameHandle (const PolygonalMesh &other) const |
| Determine whether the supplied handle is the same object as "this" PIMPLHandle. More...
|
|
void | disown (PolygonalMesh &newOwner) |
| Give up ownership of the implementation to an empty handle. More...
|
|
PIMPLHandle & | referenceAssign (const PolygonalMesh &source) |
| "Copy" assignment but with shallow (pointer) semantics. More...
|
|
PIMPLHandle & | copyAssign (const PolygonalMesh &source) |
| This is real copy assignment, with ordinary C++ object ("value") semantics. More...
|
|
void | clearHandle () |
| Make this an empty handle, deleting the implementation object if this handle is the owner of it. More...
|
|
const PolygonalMeshImpl & | getImpl () const |
| Get a const reference to the implementation associated with this Handle. More...
|
|
PolygonalMeshImpl & | updImpl () |
| Get a writable reference to the implementation associated with this Handle. More...
|
|
int | getImplHandleCount () const |
| Return the number of handles the implementation believes are referencing it. More...
|
|
|
Public Types inherited from SimTK::PIMPLHandle< PolygonalMesh, PolygonalMeshImpl, true > |
typedef PIMPLHandle< PolygonalMesh, PolygonalMeshImpl, PTR > | HandleBase |
|
typedef HandleBase | ParentHandle |
|
Protected Member Functions inherited from SimTK::PIMPLHandle< PolygonalMesh, PolygonalMeshImpl, true > |
| PIMPLHandle () |
| The default constructor makes this an empty handle. More...
|
|
| PIMPLHandle (PolygonalMeshImpl *p) |
| This provides consruction of a handle referencing an existing implementation object. More...
|
|
| PIMPLHandle (const PIMPLHandle &source) |
| The copy constructor makes either a deep (value) or shallow (reference) copy of the supplied source PIMPL object, based on whether this is a "pointer
semantics" (PTR=true) or "object (value) semantics" (PTR=false, default) class. More...
|
|
| ~PIMPLHandle () |
| Note that the destructor is non-virtual. More...
|
|
PIMPLHandle & | operator= (const PIMPLHandle &source) |
| Copy assignment makes the current handle either a deep (value) or shallow (reference) copy of the supplied source PIMPL object, based on whether this is a "pointer sematics" (PTR=true) or "object (value) semantics" (PTR=false, default) class. More...
|
|
void | setImpl (PolygonalMeshImpl *p) |
| Set the implementation for this empty handle. More...
|
|
bool | hasSameImplementation (const PolygonalMesh &other) const |
| Determine whether the supplied handle is a reference to the same implementation object as is referenced by "this" PIMPLHandle. More...
|
|
This class provides a description of a mesh made of polygonal faces (not limited to triangles).
Its primary purpose is for loading geometry from files, which can then be used for visualization or collision detection. For example, the following lines load a mesh from a Wavefront OBJ file, then create a DecorativeMesh from it.
mesh.loadObjFile("teapot.obj");
DecorativeMesh decoration(mesh);
You can also read a polygon mesh from a VTK PolyData (.vtp) file, or an STL file (.stl) that is in ascii or binary format. You can also build meshes programmatically, and some static methods are provided here for generating some common shapes. If you don't know what kind of file you have, you can attempt to read it with the loadFile() method which will examine the file extension to determine the expected format.
The mesh has its own local frame and vertex locations are given in that frame. You can scale and transform the vertices relative to that frame (changing the values stored in the mesh) but more commonly the mesh will be placed on a body relative to that body's frame, meaning you can re-use the same mesh in various places.
We expect this to be a large object so give it shared (reference) semantics; that is, the copy constructor and copy assignment default to shallow copies (both handles will refer to the same data). If you want to make a deep (non-shared) copy of a PolygonalMesh, use the copyAssign() method provided by the PIMPLHandle base class.
static PolygonalMesh SimTK::PolygonalMesh::createBrickMesh |
( |
const Vec3 & |
halfDims, |
|
|
int |
resolution = 1 |
|
) |
| |
|
static |
Create a brick-shaped mesh.
A brick is a rectangular solid (a box) centered at and aligned with the mesh local frame. Note that its size is given with half dimensions. By default you will just get two mesh faces along the longest edge of the brick, with all other edges roughly the same size. You can control the mesh density with the resolution parameter.
- Parameters
-
[in] | halfDims | The half-dimensions of the brick. The extreme vertices are at -halfDims and +halfDims, so the brick is centered around the mesh local frame. |
[in] | resolution | Control for how dense a mesh to produce. For this shape, resolution is interpreted as the number of extra vertices to insert in the longest edge of the brick. Extra vertices are inserted into the shorter edges if needed to keep the edge lengths approximately uniform for every mesh face. resolution=0 gives only vertices at the corners; the default is 1 meaning that the longest edge is split once. |
- Returns
- A PolygonalMesh representing a brick of the requested size.
Controlling the mesh density:
If you want a brick mesh where all the edges in the mesh are roughly the same length, say wantEdgeLength
, set resolution like this:
Real wantEdgeLength = ...;
int resolution = (int)(
max(halfDims)/wantEdgeLength + 0.5);
If you want a brick mesh where all the edges are roughly the same length as the shortest edge of the brick, just set wantEdgeLength=min(halfDims)
in the above calculation.