Skip to main content
9 min read

Preparing Assets for Real-Time

Models are authored for the tool that made them — CAD, BIM, or a DCC package. Real-time scenes are authored for the GPU, so close the gap before upload while the source still knows what is decorative, what moves, and what is duplicated.

3dverse's conversion pipeline extracts assets and deduplicates identical meshes. It still works with what you give it, so upstream preparation is where the real savings happen.

Remove what's not seen

The biggest win is the one only you can make: strip the geometry that serves design, not rendering.

  • Enclosed interiors. The inside of a sealed assembly, a closed housing, anything behind a panel that never opens.
  • Detail the render does not need. Thread geometry, fasteners, weld beads, gaskets, rebar, service runs, and ornamental detail that will never be viewed up close. A thousand duplications of a single bolt can cost more triangles than the machine thatholds it.
  • Construction and helper objects. Sketches, planes, axes, reference points, jigs and fixtures; rigs, guides, backup layers and disabled objects; the stray fragments and floating noise a scan leaves behind.

None of this has to be destructive. Most tools can keep a simplified export configuration, a dedicated export view, or a layer/filter set that only ships what matters.

Control geometric density

This is the most important irreversible decision on the page.

3dverse stores triangle meshes. Parametric solids, subdivision surfaces, and scans all become triangles at export time, and that is where density is decided. Export too dense and it stays dense; export too coarse and you have to go back to the authoring tool.

Each kind of source has one lever:

  • Parametric and B-Rep models. There is no STEP, IGES, JT or Parasolid in the supported file formats — your exporter tessellates, and chord height plus angular deviation decide the triangle count. Small radii are where the triangles go.
  • Subdivision and procedural geometry. Export the applied level, not the viewport preview. Set it for the viewing distance, then apply the modifier stack deliberately.
  • Captured and scanned meshes. Already triangles, usually too many, and uniformly dense where the detail does not need it. Decimate before export.

Export the same model twice at different settings and compare. The triangle count often changes by an order of magnitude with no visible difference at viewing distance.

Keep the entity count down

Triangles are one budget; entities are the other. Every exported node becomes an entity, and authoring tools are generous with nodes — one per part, body, fastener, empty group, and transform. A model that renders cheaply can still arrive as tens of thousands of entities to store, sync, and traverse.

Instancing does not help here. A thousand entities pointing at one mesh is still a thousand entities.

What reduces the count is upstream:

  • Export repeated hardware as one part rather than hundreds of individually placed copies.
  • Collapse sub-assemblies that read as a single object into a single part.
  • Drop the empty group and transform nodes that carry nothing.
  • Do not export what you already removed above.

Repeated parts that never move on their own — the screws holding one panel, a run of identical bolts — can be merged into one mesh. Do that within one kinematic branch only: merge across branches and the parts can no longer move independently.

Both figures are visible in the Editor once the model is in — see after import.

Reuse rather than duplicate

Meshes

3dverse gets instancing for free: entities hold a reference to a mesh asset by UUID, so a thousand entities can point at one mesh. The payload is stored, streamed, and uploaded to the GPU once — see natural instancing.

That only pays off if the exported file actually declares the repetition. Most exporters bake per-instance geometry by default, so five hundred identical bolts arrive as five hundred distinct meshes and the benefit is lost before upload. Look for whatever your tool calls the feature — instance or reference export, linked duplicates, component or family instances — and where it is not offered, model repeated parts as a single component reused through the assembly rather than as copies.

Note what this saves and what it does not: payload, storage and GPU memory, yes; entity count, no.

Materials

Same principle on the material side. One material shared across every steel part beats a per-part copy: fewer assets, fewer state changes, and one place to change the look later.

Material Reference
Points at a shared material asset — several entities can reference the same one
Material
Holds a material unique to that entity, for when one part really does need its own values

See visual 3D objects for the two recipes. Keep the palette small — a handful of shared materials is easier to drive later than hundreds of near-identical ones, and recoloring an entity by state is a one-line change when the target is a material_ref.

Get the basics right at export

Textures and UVs

Do not hand-compress your textures. The pipeline picks a block-compression format per texture slot — the reasoning is written up in the BCn compression devlog. Upload the best quality you have and let it choose.

One hard limit worth knowing before you author UVs: only one UV channel is currently supported (writing a custom converter has the full list of mesh caveats). A second channel for lightmaps or detail overlays will not survive the import.

Units, up axis and origin

Fix these at export, while they are still trivial to fix:

  • Units. Decide on a scale and use it everywhere. A model imported at millimeter scale next to one at meter scale is a thousand-fold mismatch that every downstream transform then has to compensate for.
  • Up axis. Z-up is common — CAD tools, Blender, 3ds Max — while most real-time formats are Y-up. Set it explicitly at export rather than discovering it when the model lies on its side.
  • Origin. Place the origin somewhere meaningful — the base of the machine, the corner of the cell, a building gridline — not wherever the design happened to start.

What the pipeline does, and what it does not

Worth being precise about, so you know where the boundary is.

It does: extract scenes, meshes, materials and textures as independent assets; store identical assets once and reference them; choose texture compression formats per slot; generate the skeleton entity for a rigged mesh.

It does not: decimate geometry, generate levels of detail, discover instancing that the source file did not declare, or collapse and merge entities. There are currently no user-facing tuning options for conversion — conversion_pipeline_options in the upload API is reserved for future use.

So the triangle budget you export with is the triangle budget you get, and the entity count you export with is the entity count you get — minus what "Simplify hierarchy" can safely remove.

Import into the console

Upload the exported file into a folder in the Asset Browser — drag it in, or use the + New button. Conversion starts automatically; the resulting assets land in the same folder as the source file, and the Scene asset among them is the one to open in the Editor.

After import

Two things are worth doing on the imported scene, in the Editor's Scene Graph extension:

  1. Read both counts, in the bottom corner: the total number of entities in the scene — including those from referenced scenes — and the triangle count. Note the documented caveat on the latter: it does not account for instancing, so a mesh of 10 triangles reused 5 times is reported as 50. It is an upper bound, not a memory figure — but if either number is alarming here, it was alarming at export time.
  2. Run "Simplify hierarchy" on the imported root — the one entity-count remedy available after the fact. Exports are often full of redundant entities — a single child, no components of their own — and this scans down the selection and removes them, applying each removed transform to its child. It cannot merge anything meaningful, so the rest of the entity budget still has to be won upstream.

Next steps