public class SkinMeshBody extends SkinMeshBase implements CollidableBody, PointAttachable
SkinMeshBody
manages this skinning by assigning a
PointSkinAttachment
to each vertex within the mesh, which stores the
master components used to control the vertex position and computes that
position using the
computePosState()
method.
PointSkinAttachment
is an instance of PointAttachment
,
and when used by SkinMeshBody
to control vertex positions it does
not connect to any Point
component as a slave (i.e., getSlave()
returns null
.
However, PointSkinAttachments
can also
be used to attach a point or a marker to the "skin" of a
SkinMeshBody
, and so allow velocities to propagate from the master
components to the point, and forces to propagate from the point to the
masters.
Master components can currently include Frame
, FemNode3d
(within a specific FemModel3d
), and individual Particle
objects. The set of master components can vary from vertex to
vertex. PointSkinAttachment
maintains a set of
connections to each master component, each with a specified
weight, and computes the final vertex position as a weighted
sum of the positions computed for each connection. In pseudocode,
this can be expressed as:
vertexPos = 0; for (each connection c) { vertexPos += c.weight * c.connectionPos(); }
Frames
control vertex positions using various skinning
techniques known in the literature. These include linear, linear dual
quaternion, and iterative dual quaternion skinning. The technique used is
controlled by the getFrameBlending()
and setFrameBlending()
methods. Implementing these
techniques requires SkinMeshBody
to maintain additional information
for each Frame. Therefore it is necessary for all Frames used in skinning to
be registered with the SkinMeshBody using
addFrame()
.
FEM nodes can control vertex positions using linear combinations of
either their current position values, or their current displacements from the
rest position. It is also recommended that any FemModel used in skinning be
registered with the SkinMeshBody using
addFemModel()
,
although neither of the currently implemented FemNode
control
methods actually require this.
Finally, it is also possible to use a vertex's initial base
position to control a portion of its final position. Vertex base
positions are also used for Frame-based skinning. Vertex base
positions are set initially when a mesh is assigned to the skin.
Base positions can be queried and set using
getBasePosition()
and
setBasePosition()
, and can be reset
en mass using resetBasePositions()
.
Setting up a SkinMeshBody
involves three basic steps:
skinMesh = new SkinMeshBody (polyMesh); skinMesh.addFrame (rigidBody1); skinMesh.addFrame (rigidBody2); skinMesh.addFemModel (femModel1); skinMesh.computeDisplacementAttachments();Here,
computeDisplacementAttachments()
automatically computes an attachment for each vertex involving
all registered Frames and FemModels that contain a polygonal mesh.
The weights connecting each vertex to these master components is based
on their current distance to the vertex. Other functions for
computing attachments, based on different schemes, may be added
in the future.
Alternatively, the application may compute attachments directly. A sketch of the required code might look like this:
skinMesh.clearAttachments(); for (int i=0; i < skinMesh.numVertices(); i++) { Vertex3d vtx = skinMesh.getVertex (i); ... use vertex position to compute weights w1, w2, w3, w4 relating it to various master components ... PointSkinAttachment a = new PointSkinAttachment(); // add new connections: a.addFrameConnection (body1Index, w1); a.addFrameConnection (body2Index, w2); a.addFemDisplacementConnection (femNode4, w3); a.addFemDisplacementConnection (femNode6, w4); a.finalizeConnections(); skinMesh.addAttachment (a); }The initial call to
clearAttachments()
is necessary if the
skinMesh already contains attachments. Then for each vertex, master
components are determined, along with their associated weights, and an
attachment is created with master connections added using various
addXXXConnection()
methods followed by a call to finalizeConnections()
. The method
addFrameConnection()
specifies a Frame
master, which controls the vertex position
using the skinning technique returned by getFrameBlending()
. The Frame itself is specified using its
FrameInfo
structure within SkinMeshBody
, which
can be obtained
using getFrameInfo()
. The method addFemDisplacementConnection()
specifies a FemNode3d
as a master,
which controls the vertex position using its current displacement from its
own rest position. Other types of connections are possible; one should
consult the source code or documentation for PointSkinAttachment
.
When calculating attachment weights, an application will likely to need
access to the Frames and FemModels that are registered with the SkinMeshBody
(for example, to make distance queries on their surface meshes).
This can be done using methods such as numFrames()
, getFrame(int)
, numFemModels()
, and getFemModel()
.
Modifier and Type | Class and Description |
---|---|
class |
SkinMeshBody.BodyInfo
Base class for information about bodies (e.g., Frames or
FemNodels) used to control the skinning.
|
class |
SkinMeshBody.FemModelInfo
Contains information for each FemModel controlling this SkinMeshBody.
|
static class |
SkinMeshBody.FrameBlending
Characterizes the blend mechanism used for the frame-based
portion of the skinning.
|
class |
SkinMeshBody.FrameInfo
Contains information for each frame controlling this SkinMeshBody.
|
Collidable.Collidability, Collidable.Group
ModelComponent.NavpanelVisibility
CompositeComponent.NavpanelDisplay
Modifier and Type | Field and Description |
---|---|
static SkinMeshBody.FrameBlending |
DEFAULT_FRAME_BLENDING |
static double |
DQ_BLEND_TOLERANCE |
static int |
DQ_MAX_BLEND_STEPS |
static double |
myDefaultSigma |
static PropertyList |
myProps |
DEFAULT_COLOR_INTERPOLATION, DEFAULT_VERTEX_COLOR_MIXING
enforceUniqueCompositeNames, enforceUniqueNames, myNumber, NULL_OBJ, useCompactPathNames
All, AllBodies, Deformable, Rigid, Self
TG_ARTICULATED, TG_DRAGGER, TG_PRESERVE_ORIENTATION, TG_SIMULATING
TRANSPARENT, TWO_DIMENSIONAL
Constructor and Description |
---|
SkinMeshBody()
Creates an empty SkinMeshBody.
|
SkinMeshBody(MeshBase mesh)
Creates a SkinMeshBody with a specified mesh.
|
Modifier and Type | Method and Description |
---|---|
void |
addAttachment(PointSkinAttachment a)
Adds an attachment to this SkinMeshBody.
|
void |
addAttachment(PointSkinAttachment a,
boolean initBase)
Adds an attachment to this SkinMeshBody.
|
void |
addFemModel(FemModel3d fem)
Registers a FemModel with this SkinMeshBody so that it can be used for skinning
control.
|
void |
addFrame(Frame frame)
Registers a Frame with this SkinMeshBody so that it can be used for skinning
control.
|
boolean |
allowCollision(ContactPoint cpnt,
Collidable other,
java.util.Set<Vertex3d> attachedVertices)
Returns
true if a collision between this Collidable
and other should be allowed for the contact point
cpnt . |
void |
clearAttachments()
Clears all the attachments associated with this SkinMeshBody.
|
void |
computeDisplacementAttachments(double sigma)
Computes displacement-based attachments for each vertex attachment in
this skin mesh.
|
void |
computeWeights() |
void |
connectToHierarchy()
Called by the system after this component is added to the
component hierarchy (i.e., when it is added as a child of another
CompositeComponent).
|
boolean |
containsContactMaster(CollidableDynamicComponent comp)
Returns true if this Collidable contains a specified contact master
component.
|
PointSkinAttachment |
createPointAttachment(Point pnt)
Returns a PointAttachment that attaches
pnt
to this component. |
void |
disconnectFromHierarchy()
Called by the system after this component is removed from the component
hierarchy (i.e., when it is removed as a child of its parent).
|
java.util.List<SkinMeshBody.FemModelInfo> |
getAllFemModelInfo()
Returns the information structures of all FemModels that are currently
registered with this SkinMeshBody.
|
java.util.List<SkinMeshBody.FrameInfo> |
getAllFrameInfo()
Returns the information structures of all Frames that are currently
registered with this SkinMeshBody.
|
PropertyList |
getAllPropertyInfo()
Returns a list giving static information about all properties exported by
this object.
|
PointSkinAttachment |
getAttachment(int idx)
Returns the attachment for the idx-th vertex of this SkinMeshBody.
|
Point3d |
getBasePosition(int idx)
Returns the base position for a specified vertex attachment in this
SkinMeshBody.
|
Collidable.Collidability |
getCollidable()
Returns the
Collidable.Collidability of this Collidable. |
Collidable |
getCollidableAncestor()
Returns the most immediate Collidable ancestor of this Collidable,
if any.
|
int |
getCollidableIndex() |
PolygonalMesh |
getCollisionMesh()
Returns the mesh that should be used for computing collisions, or
null if there is no such mesh. |
DistanceGrid |
getDistanceGrid()
Returns a signed distance grid that can be used with a
SignedDistanceCollider, or
null if this Collidable
does not support a signed distance grid (i.e., if
CollidableBody.hasDistanceGrid() returns false ). |
FemModel3d |
getFemModel(int idx)
Returns a FemModel that is currently registered with SkinMeshBody.
|
int |
getFemModelIndex(FemModel fem)
Returns the index of a FemModelthat is currently registered with t
this SkinMeshBody, or -1 if the FemModel is not registered.
|
SkinMeshBody.FemModelInfo |
getFemModelInfo(int idx)
Returns an information structure for a FemModel that is currently registered
with this SkinMeshBody.
|
Frame |
getFrame(int idx)
Returns a Frame that is currently registered with SkinMeshBody.
|
SkinMeshBody.FrameBlending |
getFrameBlending()
Returns the blend type for that part of the skinning that depends on
frames.
|
SkinMeshBody.FrameInfo |
getFrameInfo(Frame frame)
Returns the FrameInfo for a Frame that is currently registered with this
SkinMeshBody, or null if the Frame is not registered.
|
SkinMeshBody.FrameInfo |
getFrameInfo(int idx)
Returns an information structure for a Frame that is currently registered
with this SkinMeshBody.
|
double |
getMass() |
void |
getSoftReferences(java.util.List<ModelComponent> refs)
Appends all soft references for this component to a list.
|
void |
getVertexMasters(java.util.List<ContactMaster> mlist,
Vertex3d vtx)
Returns all the contact master components associated with a particular
mesh vertex.
|
boolean |
hasDistanceGrid()
Returns
true if this Collidable supports a signed
distance grid that can be used with a SignedDistanceCollider. |
boolean |
hasFemModel(FemModel3d fem)
Returns true is a specified FemModel is currently registered with this
SkinMeshBody.
|
boolean |
hasFrame(Frame frame)
Returns true is a specified Frame is currently registered with this
SkinMeshBody.
|
boolean |
isCompound()
Queries whether or not this collidable has sub-collidables.
|
boolean |
isDeformable()
Returns
true if this collidable is deformable. |
int |
numAttachments()
Returns the number of attachments currently in this SkinMeshBody.
|
int |
numFemModels()
Returns the number of FemModels currently registered with this SkinMeshBody.
|
int |
numFrames()
Returns the number of Frames currently registered with this SkinMeshBody.
|
boolean |
removeFrame(Frame frame)
Removes a Frame from this SkinMeshBody
|
void |
scan(ReaderTokenizer rtok,
java.lang.Object ref)
Scans this element from a ReaderTokenizer.
|
void |
setAttachment(int idx,
PointSkinAttachment a) |
void |
setAttachment(int idx,
PointSkinAttachment a,
boolean initBase) |
void |
setBasePosition(int idx,
Vector3d pos)
Sets the base position for a specified vertex attachment in the
SkinMeshBody.
|
void |
setCollidable(Collidable.Collidability c) |
void |
setCollidableIndex(int idx) |
void |
setFrameBlending(SkinMeshBody.FrameBlending type)
Sets the blend type for that part of the skinning that depends on frames.
|
void |
setMesh(MeshBase mesh)
Sets the mesh associated with the this SkinMeshBody.
|
void |
smoothWeights() |
void |
smoothWeights(int networkDist) |
void |
smoothWeights(SISOFunction weightFunction,
int networkDist)
Smooths weights according to a weighting function of distance.
|
void |
transformGeometry(GeometryTransformer gtr,
TransformGeometryContext context,
int flags)
Transforms the geometry of this component, using the geometry transformer
gtr to transform its individual attributes. |
void |
updateReferences(boolean undo,
java.util.Deque<java.lang.Object> undoInfo)
May be called by the system if any of the soft references for
this component are removed from the the component hierarchy.
|
void |
updateSlavePos()
Updates the mesh vertices to reflect the current position of the
attached Frames, FemModels, and points.
|
componentChanged, copy, findComponent, get, get, getByNumber, getNavpanelDisplay, getNavpanelVisibility, getNumberLimit, getSurfaceMesh, getSurfaceMeshes, hierarchyContainsReferences, indexOf, numComponents, numSurfaceMeshes, postscan, scaleDistance, setDisplayMode, setNavpanelDisplay, updateNameMap, updateSlaveVel
addTransformableDependencies, createRenderProps, createSurfaceMeshArray, getColorInterpolation, getFileTransform, getMesh, getMeshToWorld, getSurfaceMeshes, getVertex, getVertexColorMixing, isFileTransformRigid, isMeshModfied, numSurfaceMeshes, numVertices, prerender, render, render, scaleMass, setColorInterpolation, setDefaultValues, setMesh, setMesh, setMeshToWorld, setVertexColorMixing, transformGeometry, updateBounds, updatePosition
getRenderHints, getRenderProps, getSelection, isSelectable, numSelectionQueriesNeeded, setRenderProps, updateRenderProps
checkFlag, checkName, checkNameUniqueness, clearFlag, clone, createTempFlag, getChildren, getGrandParent, getHardReferences, getName, getNameRange, getNavpanelVisibility, getNumber, getParent, getProperty, hasChildren, hasState, isConnectedToHierarchy, isFixed, isMarked, isSelected, isWritable, makeValidName, makeValidName, notifyParentOfChange, printReferences, recursivelyContained, recursivelyContains, removeTempFlag, setFixed, setFlag, setMarked, setName, setNavpanelVisibility, setNavpanelVisibility, setNumber, setParent, setSelected, write
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
getHardReferences, getName, getNavpanelVisibility, getNumber, getParent, hasState, isFixed, isMarked, isSelected, notifyParentOfChange, postscan, setFixed, setMarked, setName, setNumber, setParent, setSelected
getProperty
getChildren, hasChildren
isWritable, write
public static SkinMeshBody.FrameBlending DEFAULT_FRAME_BLENDING
public static int DQ_MAX_BLEND_STEPS
public static double DQ_BLEND_TOLERANCE
public static double myDefaultSigma
public static PropertyList myProps
public SkinMeshBody()
public SkinMeshBody(MeshBase mesh)
public PropertyList getAllPropertyInfo()
HasProperties
getAllPropertyInfo
in interface HasProperties
getAllPropertyInfo
in class SkinMeshBase
public void setFrameBlending(SkinMeshBody.FrameBlending type)
public SkinMeshBody.FrameBlending getFrameBlending()
public int numAttachments()
numAttachments
in class SkinMeshBase
public void addAttachment(PointSkinAttachment a)
public void addAttachment(PointSkinAttachment a, boolean initBase)
initBase
is
true, then the attachment's base position is set to the current vertex
position. The number of attachments cannot exceed the current number of
mesh vertices.public void setAttachment(int idx, PointSkinAttachment a)
public void setAttachment(int idx, PointSkinAttachment a, boolean initBase)
public void clearAttachments()
public PointSkinAttachment getAttachment(int idx)
getAttachment
in class SkinMeshBase
idx
- index of the vertex for which the attachment is desired.
Must be less that numAttachments()
.public void setMesh(MeshBase mesh)
setMesh
in class MeshComponent
public void addFrame(Frame frame)
frame
- Frame to be registeredpublic boolean removeFrame(Frame frame)
frame
- Frmae to be removedpublic boolean hasFrame(Frame frame)
frame
- Frame to be queriedpublic int numFrames()
public SkinMeshBody.FrameInfo getFrameInfo(int idx)
idx
- identities the Frame; must be between 0 and
the number returned by numFrames()
.public java.util.List<SkinMeshBody.FrameInfo> getAllFrameInfo()
public Frame getFrame(int idx)
idx
- identities the Frame; must be between 0 and
the number returned by numFrames()
.public SkinMeshBody.FrameInfo getFrameInfo(Frame frame)
frame
- Frame whose FrameInfo is desiredpublic void addFemModel(FemModel3d fem)
fem
- FemModel to be registeredpublic boolean hasFemModel(FemModel3d fem)
fem
- FemModel to be queriedpublic int numFemModels()
public SkinMeshBody.FemModelInfo getFemModelInfo(int idx)
idx
- identities the FemModel; must be between 0 and
the number returned by numFemModels()
.public java.util.List<SkinMeshBody.FemModelInfo> getAllFemModelInfo()
public FemModel3d getFemModel(int idx)
idx
- identities the FemModel; must be between 0 and
the number returned by numFemModels()
.public int getFemModelIndex(FemModel fem)
fem
- FemModel whose index is desiredpublic Point3d getBasePosition(int idx)
idx
- index of the attachment. Must be less than
numAttachments()
.public void setBasePosition(int idx, Vector3d pos)
idx
- index of the attachment. Must be less than
numAttachments()
.pos
- new base positonpublic void smoothWeights(SISOFunction weightFunction, int networkDist)
weightFunction
- single-input single-output function of distance
to use as weightsnetworkDist
- number of paths to traverse to collect verticespublic void smoothWeights(int networkDist)
public void smoothWeights()
public void computeWeights()
public void computeDisplacementAttachments(double sigma)
Bodies further away have a lower weighting. If sigma
is non-positive, the weighting is determined using an inverse-square
attenuation. Otherwise, the weighting is determined using a
Gaussian attention controlled by sigma
.
sigma
- if greater than 0, specifies a Gaussian weighting
attenuation.public void updateSlavePos()
updateSlavePos
in interface HasSlaveObjects
updateSlavePos
in class SkinMeshBase
public void transformGeometry(GeometryTransformer gtr, TransformGeometryContext context, int flags)
TransformableGeometry
gtr
to transform its individual attributes. The
context
argument supplies information about what other
components are currently being transformed, and also allows the
requesting of update actions to be performed after all transform called
have completed. The context is also the usual entity that calls
this method, from within its TransformGeometryContext.apply(maspack.geometry.GeometryTransformer, int)
method. The argument flags
provides flags to specify
various conditions associated with the the transformation.
At present, the available flags are TransformableGeometry.TG_SIMULATING
and
TransformableGeometry.TG_ARTICULATED
.
This method is not usually called directly by applications.
Instead, it is typically called from within the
TransformGeometryContext.apply(maspack.geometry.GeometryTransformer, int)
method of the context,
which takes care of the various operations needed for a
complete transform operation, including calling
TransformableGeometry.addTransformableDependencies(artisynth.core.modelbase.TransformGeometryContext, int)
to collect other
components that should be transformed, calling
TransformableGeometry.transformGeometry(maspack.matrix.AffineTransform3dBase)
for each component, notifying
component parents that the geometry has changed, and calling
any requested TransformGeometryAction
s. More details
are given in the documentation for
TransformGeometryContext.apply(maspack.geometry.GeometryTransformer, int)
.
TransformGeometryContext
provides a number of
static convenience transform
methods
which take care of building the context and calling
apply()
for a specified set of components.
This method should not
generally call transformGeometry()
for its descendant
components. Instead, descendants needing transformation should be
specified by adding them to the context in the method TransformableGeometry.addTransformableDependencies(artisynth.core.modelbase.TransformGeometryContext, int)
.
transformGeometry
in interface TransformableGeometry
transformGeometry
in class SkinMeshBase
gtr
- transformer implementing the transformcontext
- context information, including what other components
are being transformedflags
- specifies conditions associated with the transformationpublic void scan(ReaderTokenizer rtok, java.lang.Object ref) throws java.io.IOException
ModelComponentBase
write
.scan
in interface ModelComponent
scan
in interface Scannable
scan
in class SkinMeshBase
rtok
- Tokenizer from which to scan the elementref
- optional reference object which can be used for resolving references to
other objectsjava.io.IOException
- if an I/O or formatting error occuredpublic void connectToHierarchy()
ModelComponentBase
When this method is called, ModelComponent.getParent()
will return
the new parent component; the system will have set this beforehand.
connectToHierarchy
in interface ModelComponent
connectToHierarchy
in class ModelComponentBase
public void disconnectFromHierarchy()
ModelComponentBase
When this
method is called, ModelComponent.getParent()
will still return this original
parent component; the system will set this to null
after.
disconnectFromHierarchy
in interface ModelComponent
disconnectFromHierarchy
in class ModelComponentBase
public void getSoftReferences(java.util.List<ModelComponent> refs)
updateReferences()
method will
be called to update its internal reference information.getSoftReferences
in interface ModelComponent
getSoftReferences
in class ModelComponentBase
refs
- list to which soft references are appendedpublic void updateReferences(boolean undo, java.util.Deque<java.lang.Object> undoInfo)
undo
equal to false
,
this component should then examine its soft references and
use ComponentUtils.isConnected()
to determine which of them have been disconnected from the hierarchy.
Disconnected references should be removed, and sufficient information
should be appended to undoInfo
to allow this update
to be undone if this method is called later with undo
equal to true
. When undoing an update, the undo
information should be removed from the front of undoInfo
.updateReferences
in interface ModelComponent
updateReferences
in class ModelComponentBase
undo
- if true
, indicates that the most
recent reference update should be undone, using the supplied
undo information.undoInfo
- if undo
is false
, should be used
to store information allowing the reference update to be undone.
Otherwise, if undo
is true
, then this
supplied information to undo the most recent update.public PolygonalMesh getCollisionMesh()
CollidableBody
null
if there is no such mesh. If this method
returns null
, then no collisions will
be performed for this collidable, regardless any default or explicit
collision behaviors that have been arranged by the system.getCollisionMesh
in interface CollidableBody
public boolean hasDistanceGrid()
CollidableBody
true
if this Collidable supports a signed
distance grid that can be used with a SignedDistanceCollider. At
present, this will only be true for non-deformable bodies.hasDistanceGrid
in interface CollidableBody
true
if this Collidable supports a signed
distance gridpublic DistanceGrid getDistanceGrid()
CollidableBody
null
if this Collidable
does not support a signed distance grid (i.e., if
CollidableBody.hasDistanceGrid()
returns false
).getDistanceGrid
in interface CollidableBody
public Collidable.Collidability getCollidable()
Collidable
Collidable.Collidability
of this Collidable. This provides
control over whether external and/or internal collisions are enabled for
this Collidable. This setting takes precedence over default and
explicitly requested collision behaviors.
Note that for collisions to actually occur, they still need to be enabled through either a default or explicit collision behavior in the MechModel.
getCollidable
in interface Collidable
public void setCollidable(Collidable.Collidability c)
public Collidable getCollidableAncestor()
Collidable
null
.getCollidableAncestor
in interface Collidable
null
.public boolean isCompound()
Collidable
isCompound
in interface Collidable
true
if this collidable has sub-collidablespublic boolean isDeformable()
Collidable
true
if this collidable is deformable. Whether or
not a collidable is deformable determines how it responds to default
collision behaviors involving deformable and rigid collidables. Also,
self-collisions among sub-collidables of a collidable A are permitted
only if A is deformable.isDeformable
in interface Collidable
true
if this collidable is deformablepublic double getMass()
getMass
in interface CollidableBody
public void getVertexMasters(java.util.List<ContactMaster> mlist, Vertex3d vtx)
CollidableBody
mlist
. The list should not be cleared. The vertex
should be a vertex of the mesh returned by CollidableBody.getCollisionMesh()
.getVertexMasters
in interface CollidableBody
mlist
- collected master component informationvtx
- vertex for which the master components are requestedpublic boolean containsContactMaster(CollidableDynamicComponent comp)
CollidableBody
containsContactMaster
in interface CollidableBody
comp
- component to test fortrue
if comp
is contained in
this Collidablepublic boolean allowCollision(ContactPoint cpnt, Collidable other, java.util.Set<Vertex3d> attachedVertices)
CollidableBody
true
if a collision between this Collidable
and other
should be allowed for the contact point
cpnt
. In making this decision, this method may
refer to attachedVertices
, which supplies a list
of vertices on this Collidable which are attached in some way
to the other Collidable.allowCollision
in interface CollidableBody
cpnt
- contact point being testedother
- opposing collidableattachedVertices
- list of vertices attached to other
.true
if the collision should be allowedpublic int getCollidableIndex()
getCollidableIndex
in interface CollidableBody
public void setCollidableIndex(int idx)
setCollidableIndex
in interface CollidableBody
public PointSkinAttachment createPointAttachment(Point pnt)
PointAttachable
pnt
to this component. It should not be assumed that pnt
is currently connected to the component hierarchy, and no attempt
should be made to connect the returned attachment to the hierarchy;
the latter, if desired, is the responsibility of the caller.
In some cases, it may not be possible to attach the point at its present location. In that case, the method will create an attachment to the nearest feasible location.
createPointAttachment
in interface PointAttachable
pnt
- point for which an attachment should be createdpnt
to this component