FoliMesh

Cacti & Succulents in Low-poly Style for Babylon.js

Babylon.js loads these cacti as GLB through the glTF loader in @babylonjs/loaders: ImportMeshAsync for a single plant, or LoadAssetContainerAsync with instantiateModelsToScene when a desert scene needs many copies. Each Saguaro, Barrel Cactus, Prickly Pear, Agave and Aloe ships with LOD0–LOD3 and a collision mesh, so lod0.addLODLevel(30, lod1) keeps distant plants cheap while the hidden collision mesh still answers checkCollisions or a Havok PhysicsAggregate.

Low-poly here means flat shading and vertex colours (COLOR_0) — no textures, no alpha cards, no transparent overdraw, which suits mobile GPUs and WebGL/WebGPU builds. Leaves and spines are solid geometry, so one material tints the whole set and the plants batch or go in as thin instances. Budgets run from a few hundred to a couple of thousand triangles at LOD0, comfortable for strategy, city builders, VR and stylised westerns.

Models
5
Levels of detail
LOD0 – LOD3
Formats
GLB · FBX · OBJ

About the Low-poly style

Low-poly vegetation is the cheapest style to render and to ship.

  • Flat shading: one normal per face gives the crisp faceted look; no normal maps.
  • Colour lives in vertex colours (glTF COLOR_0), so there are no textures, no UV work and almost no video memory.
  • Leaves are solid geometry, not alpha cards: no alpha testing and no transparent overdraw, which matters on mobile GPUs.
  • One material can be shared by every model in the scene, so trees batch and instance easily.
  • Typical budgets range from a few hundred to a couple of thousand triangles at LOD0.

A good fit for mobile, WebGL/WebGPU, VR, strategy, city builders and stylised indie games. In the engine, use a material that multiplies by vertex colour.

Using it in Babylon.js

Babylon.js loads GLB through the glTF loader in @babylonjs/loaders: ImportMeshAsync (or SceneLoader.ImportMeshAsync in older code), or LoadAssetContainerAsync when you need many copies via instantiateModelsToScene.

  • LOD: lod0.addLODLevel(30, lod1), addLODLevel(80, lod2) and so on; passing null as the mesh hides the object beyond that distance.
  • Thousands of trees: thin instances (thinInstanceAdd with matrices) render in one draw call per mesh; use regular createInstance when each tree needs its own picking or logic.
  • Leaves: glTF MASK maps to alpha-tested PBRMaterial (MATERIAL_ALPHATEST).
  • Collision mesh: set isVisible = false and use it with checkCollisions or Havok physics (PhysicsAggregate with a MESH shape).

Other categories

Same in other styles

Same for other engines