3D model asset spec (for the modeler)

This page is the hand-off doc you send to whoever’s producing the 3D model of the building. Send this in advance — the modeler will deliver something usable on the first pass instead of whatever Clock Tower asked for last time.

Goal: a glTF/glb file that loads into the WiqAIa+ digital twin (Three.js) without runtime surprises, with named meshes so the operator UI can attach cameras, zones, and alarm overlays to specific architectural elements.

Required format

  • File format: glTF 2.0, binary (.glb) preferred. Embedded textures, no external dependencies. We can accept .gltf + textures bundled in a zip, but .glb removes a class of path-bug.
  • No FBX, no OBJ, no STL. glTF is the modern web standard; everything else needs conversion on our side and risks losing material/lighting information.
  • Single file per building. Multi-storey buildings come as ONE .glb with named per-floor groups (see below) — separate files per floor make the twin loader’s job harder.

Coordinate system + scale

  • Right-handed, Y-up. This is glTF’s default; just don’t flip it.
  • Unit = 1 metre. A 30-metre-wide hall measures 30 in the file. We will not rescale on import; out-of-spec scale = visible drift between cameras and the model.
  • Origin at the building’s ground floor SW corner unless otherwise agreed. Cameras + zone polygons in our DB use the same origin.

Level of detail

  • Polycount budget: ≤ 250 k triangles per building. The pilot tablet hardware (1080p browser, mid-range GPU) is the constraint, not your modeling tool.
  • LOD ranges are nice-to-have, not required for the pilot. If you ship LOD0 (fine) and LOD1 (coarse), name them floor-NN-LOD0 / floor-NN-LOD1. We’ll wire LOD selection later.
  • Textures: 2048×2048 max per material, JPEG for diffuse, PNG for masks. Compressed (KTX2/BasisU) is great if your toolchain supports it, but not required.

Named meshes (THIS IS THE IMPORTANT PART)

The operator UI needs to programmatically identify specific architectural elements to overlay cameras, zone polygons, and alarm flashes. Use these naming conventions; case-sensitive:

PatternExampleWhat
floor-NNfloor-03One mesh per floor, top-down view. Zero-padded 2 digits. Ground floor is floor-00.
zone-NN-<slug>zone-03-prayer-hallNamed zones, child of the matching floor mesh. <slug> is kebab-case, alphanumeric.
stair-<id>stair-eastVertical circulation. The id matches the zone graph on our side.
lift-<id>lift-1Lift / elevator.
exit-<id>exit-main-wEmergency exits. We highlight these during evacuation scenarios.
door-<id>door-server-roomNamed doors that have access-control sensors.
wall, floor-slab, ceiling, furniture-group(literal)Bulk geometry; we treat these as decorative.

If a mesh isn’t on this list, name it descriptively in lowercase-kebab-case and we’ll fold it into “decorative” automatically. Reserved names (floor-NN, zone-NN-*, stair-*, lift-*, exit-*, door-*) must follow the patterns above exactly.

Texture handling

  • One material per visually-distinct surface, max 12 unique materials per building.
  • Emissive materials only for things that emit light in real life (lamps, exit signs). We use the emissive slot for alarm-flash overlays at runtime; if you bake emissive into structural geometry we lose that channel.
  • No baked AO/shadows in the diffuse texture. We render lighting at runtime; baked shadows fight with our dynamic lights.

What we DON’T need

  • Animations, skeletons, blend shapes — the twin is static-geometry only at pilot scale.
  • Cameras or lights inside the glTF — we add those programmatically.
  • Visual effects (particles, water shaders).

File size budget

  • ≤ 25 MB compressed .glb per building. We serve this to the tablet over the building’s WiFi; bigger files = longer load times in operator-experience tests.
  • If you’re at 40 MB+, the win is usually merging duplicate materials or reducing texture resolution. Polycount is rarely the culprit.

Validation checklist (before sending us the file)

Run these locally; they catch 80% of import issues:

  1. Open the .glb in https://gltf-viewer.donmccurdy.com/. It should render correctly out of the box.
  2. Check the geometry tab for triangle count.
  3. Confirm node names match the patterns above. (The viewer’s “scene graph” panel lists them.)
  4. Check origin: load the file, position camera at (0, 1.7, 0); you should see the SW corner of the ground floor.

Hand-off

Once the file passes the checklist, send via secure file transfer (not email attachment for files > 10 MB). Include:

  • The .glb file.
  • A meshes.txt plain-text dump of every named mesh’s path inside the scene graph (so we can diff against our zone DB before import).
  • Source files (.blend / .fbx / .max) under separate cover — we keep these in cold storage for future revisions.

Re-deliveries

The first version will likely have 2–4 fixes; that’s expected. We’ll send a diff against your file with the specific changes (e.g. “zone-03 needs to be renamed zone-03-prayer-hall to match the floor plan”). Re-deliveries should preserve coordinate system + scale.

Contact

For the Saudi Airlines Hajj Arafat pilot:

  • 3D coordinator (us): the melissa@beamwave.sa address from the project kickoff.
  • File transfer: agreed channel from the LOA (no public links).

When the modeler asks “is feature X OK?” — Reply: if it fits the named-mesh patterns + the polycount + file size budget, ship it. Anything outside that we’ll iterate on after the first import.

WiqAIa+ Docs · Rizoma