Layers
Organizing things into groups and how to modify them
Sometimes, it is handy to organize things into groups. In Metacity, you can use Layers
.
from metacity.geometry import Layer, Model
layer = Layer()
models = [Model(), Model()]
#Layer.add_models(self, models: List[Model]) -> None
layer.add_models(models)
It is also possible to add a single model:
from metacity.geometry import Layer, Model
layer = Layer()
model = Model()
#Layer.add_model(self, model: Model) -> None
layer.add_model(model)
You can access the individual models again. Deleting a Model
from the returned list does not remove it from the Layer
. The models are not copied, the returned list contains references to the models stored inside Layer.
from metacity.geometry import Layer
layer = Layer()
#... loading data, processing it
#Layer.get_models(self) -> List[Model]
models = layer.get_models()
Moreover, it is possible to store and load the contents of a Layer
to and from the .gltf
format.
from metacity.geometry import Layer
layer = Layer()
#... loading data, processing it
#Store the data
#Layer.to_gltf(filename: str) -> None
layer.to_gltf("layer.gltf")
#Load the data
#Layer.from_gltf(filename: str) -> None
layer_copy = Layer()
layer_copy.from_gltf("layer.gltf")
Layer Modifiers
Layer
offers a few handy methods which can modify models:
Height Mapping
If you have 2D point data in one Layer
and a mesh with the height information (such as terrain) in a different one, you can easily map the original 2D data onto the terrain:
from metacity.geometry import Layer
from metacity.io import parse_recursively
terrain = Layer()
terrain.add_models(parse_recursively("terrain"))
trees = Layer()
trees.add_models(parse_recursively("trees"))
#Layer.map_to_height(self, layer: Layer) -> None
trees.map_to_height(terrain)
Simplification
In case you need to simplify your geometry by approximating it with its crude envelope (not a perfect convex hull), you can use the following method:
from metacity.geometry import Layer
from metacity.io import parse_recursively
buildings = Layer()
buildings.add_models(parse_recursively("buildings"))
#Layer.simplify_envelope(self) -> None
buildings.simplify_envelope()
Height Map Re-mesh
It is possible to re-mesh a model using a height-map approach. A grid of vertices is generated and placed "on top" of the source model, effectively covering it.
The new mesh is divided into several tiles (each is a separate Model
), and each tile is further divided according to the supplied parameters:

tile_side
is an arbitrary number (let's say 100), and tile_divisions
is equal to 4. The first tile is always aligned with the minimum coordinates of the Layer
bounding box. The dotted lines correspond to edges in the newly generated mesh, bold dots are new vertices.from metacity.geometry import Layer
from metacity.io import parse_recursively
terrain = Layer()
terrain.add_models(parse_recursively("terrain"))
#Layer.simplify_remesh_height(self, tile_side: float, tile_divisions: int) -> None
terrain.simplify_remesh_height(100, 4)
Last updated