IModel
Description
- Derived from
- Extended by
-
Model sealed
Base interface for classes that represent 3D models.
The coordinate space for untransformed top-level 3D models is defined as follows:
-
X+ : points westwards resp. sidewards.
-
Y+ : points upwards.
-
Z+ : points northwards resp. forwards.
The ground level is expected to be at Y-coordinate zero. The coordinate system for top-level IModel objects maps to standard North-East-Down (NED) coordinates as follows:
IModel | NED --------+-------- X+ axis | Y- axis / \ / \ X- axis | Y+ axis | 0 -1 0 | | 0 0 +1 | Y+ axis | Z- axis M1 = | 0 0 -1 | M2 = | -1 0 0 | Y- axis | Z+ axis | +1 0 0 | | 0 -1 0 | Z+ axis | X+ axis \ / \ / Z- axis | X- axis
The matrix M1
transforms from NED, the matrix M2
transforms to NED.
- See also
Public / Methods
BoundsWithPose
Returns the non-shared ISpatialBounds for this IModel that uses the given model pose in.
This method returns the same object as ColliderWithPose. For details on the semantic differences, please refer to Bounds and Collider.
- See also
ChildAt
Returns the index in-th child model.
The same IModel object may be a child of multiple parent IModel objects. The resulting graph of parent-child relations must not contain any cycles.
- See also
ChildTransformAt
Returns the child-to-parent transformation matrix of the index in-th child model.
The transformation matrix uses the unit of measure of the parent model (see Unit).
- See also
ChildTransformWithUnitScaleAt
Returns the child-to-parent transformation matrix of the index in-th child model.
The transformation matrix uses the unit of measure of the child model (see Unit).
- See also
ColliderLoad
Initializes the Collider object from the given precomputed spatial data structures.
As an alternative to this method, the ModelFlags.ComplexGeometry flag may be used.
If the given data in is unsuitable, this method will return silently and a new IModelCollider will be computed.
- See also
ColliderWithPose
Returns the non-shared IModelCollider for this IModel that uses the given model pose in.
The returned collider will take the following into account:
-
If ModelPoseFlags.Hide is present in ModelPose.Flags1, the model collider will behave as if ModelFlags.NoSpatialQuery had been specified for the IModel.
-
The custom transformation defined via ModelPose.Transform1 is applied for children along the model hierarchy and the spatial bounds of the parent models are updated accordingly.
- See also
Copy
Creates a mutable deep copy of this model.
Modifying the returned Model will not affect this model.
- See also
MergeFadeOut
Discards the fade out ranges of this
model and its descendants and rebuilds them based on the given visibility threshold opt.
If this
model has the ModelFlags.Group flag, the method returns without altering the fade out ranges. Otherwise, this method computes FadeOut for each model that has parts with geometry, based on ISpatialBounds.Sphere and threshold opt. Fade ranges of intermediate models are computed so that they form a nested hierarchy. Recursive traversal will stop at models that have the ModelFlags.Group flag.
- See also
MergeGeometries
Merges all IModelGeometry objects of this model and its descendants.
The collected IModelGeometry objects are grouped by their ModelVertexFormat and then merged, by concatenating the data which is returned by IModelGeometry.ReadIndices and IModelGeometry.ReadVertices, followed by an adjustment of the primitive batches in the model parts. The merged geometries will always be non-instanced, even if the input was instanced, see IModelGeometry.InstanceBuffer. After merging geometries, further simplification via ModelSimplifyFlags.MergeParts may be possible.
- See also
MergeHierarchy
Discards the hierarchical structure of this
model and builds a new one that is spatially optimized and thus suitable for efficient rendering and spatial queries.
If this
model has the ModelFlags.Group flag, the method returns without altering the hierarchical structure. Otherwise, this method collects all descendants of this
model and puts them into a flat list, while keeping their absolute position / orientation, unit of measure and fade range intact. Recursive traversal will stop at models that have the ModelFlags.Group flag. The models in the list are arranged in a hierarchical spatial structure, by creating new intermediate Model nodes where necessary.
- See also
MergeModels
If possible, merges the model parts of all descendant models into this
model and then removes them.
If this
model has the ModelFlags.Group flag, the method returns without merging any child models. The recursive merge process will stop at child models that have a different unit of measure (see Unit) as this
model, a non-identity child transform (see ChildTransformAt), non-default values for FadeIn and/or FadeOut or the ModelFlags.Group flag. All other child model data will be discarded, i.e. all Flags except ModelFlags.Group and Name. To ensure that the merge process is performed on all descendants, the MergeUnitsAndTransforms method may be used before merging models. After merging models, further simplification via ModelSimplifyFlags.MergeParts may be possible.
- See also
MergeUnitsAndTransforms
Applies Unit of this
model to all its descendants, then uses IModelGeometry.Transform on IModelPart.Geometry to effectively turn all child transforms to identity and finally uses Fade.Mul to adjust FadeIn and FadeOut accordingly.
After merging units and transforms, further simplification via ModelSimplifyFlags.RemoveRedundant may be possible.
- See also
PartAt
Returns the index in-th model part.
The same IModelPart object may be used by zero or more IModel objects.
PrepareLazy
Prepares lazy-loaded data for this model.
After calling this method, doing any of the following is guaranteed to not trigger any more lazy computations for this IModel and all of its descendants:
This method does not pre-load vertex / index data (see IModelGeometry) or textures (see IModelTexture) for rendering. However, in order to be able to perform the lazy computations, vertex / index data needs to be read. This can lead to bad performance. For example, when triggering lazy computations in a hierarchy of models by getting Bounds separately for each leaf model, data must be read for each computation. Now, if there is a big shared model geometry buffer, a lot of data will be read repeatedly. By calling PrepareLazy on the root model, all lazy computations can be performed while reading the vertex / index data only once.
- IOException
-
If an I/O error has occurred while lazy-loading model data.
- See also
Simplify
Simplifies this model by applying the given actions.
Simplification is performed in-place and only modifies the model hierarchy, without loading or computing any additional model data, such as:
-
Collider, which would trigger computation of spatial acceleration data structures.
-
IModelGeometry.ReadVertices, which would read vertex data, usually involving file I/O.
-
IModelGeometry.ReadIndices, which would read index data, usually involving file I/O.
-
IModelTexture.ReadTexels, IModelTexture.ReadPixels or IModelTexture.ReadElevation, which would read texel data, usually involving file I/O.
Public / Attributes
Bounds
Returns the spatial bounds of this model, which may be shared with other model objects.
This property returns the same object as Collider. However, by using this property, the calling code indicates that it will not use the methods and properties of the ISpatialQuery and IModelCollider interfaces, which allows the implementation to defer pre-computations which would otherwise need to be performed. A ModelFormat may choose to store pre-computed spatial bounds in a model file, which will eliminate even the pre-computation for the spatial bounds.
Collider
Returns the collider object for this model, which may be shared with other model objects.
Requesting the IModelCollider object of a model by getting this property can trigger lazy computation, which in turn invokes the following methods, if necessary:
-
IModelGeometry.ReadIndices on the IModelGeometry objects referenced by IModelPart.Geometry.
-
IModelGeometry.ReadVertices on the IModelGeometry objects referenced by IModelPart.Geometry.
If only the ISpatialBounds of the model are of interest, the Bounds property should be used instead of this property. Doing so allows to return pre-computed bounds, without triggering any lazy computation.
FadeIn
The fade-in range of this model.
When Fade.Compute would 0
for all points on model surface, the model will not be visible at all. Rendering of the model and its descendants will be skipped entirely if Fade.Compute would return 0
for all points on the surface of the bounding sphere (see ISpatialBounds.Sphere of Bounds).
Defaults to Fade.AlwaysOne, i.e. always faded in.
FadeOut
The fade-out range of this model.
When Fade.Compute would 1
for all points on model surface, the model will not be visible at all. Rendering of the model and its descendants will be skipped entirely if Fade.Compute would return 1
for all points on the surface of the bounding sphere (see ISpatialBounds.Sphere of Bounds).
Defaults to Fade.AlwaysZero, i.e. never faded out.
Unit
The unit of measure in which the vertex coordinates of the model parts are expressed.
Defaults to UnitOfMeasure.Metre.
Extensions
ChildFor
2 overloads
Returns the first child or descendant model of the given name (see IModel.Name).
Returns the first child or descendant model of the given name (see IModel.Name).
Save
Saves this model to a file.
- IOException
-
If an I/O error has occurred while writing the 3D model data.
- See also
Write
Writes this model to a file.
- IOException
-
If an I/O error has occurred while writing the 3D model data.
- See also