User Guide
Build and view 3D digital twins in the browser, drive them from live data, and publish read-only links people can open without an account. No install.
A project is a 3D scene plus everything layered on it: imported models, data charts, interactive objects, heatmaps, saved camera viewpoints, and the connections to wherever your data lives. Two kinds sit side by side on the dashboard:
| Kind | What it is |
|---|---|
| SpatialWork scene | A 3D scene you build in the browser, or one published from Unity SpatialWork. Everything in this guide applies to it. |
| GeoSense | A map-based project, opened in the geo editor. Different tool, same dashboard and the same sign-in. |
Work saves as you go. There is no Save button to forget.
Log in with your Central Platform account — the same email and password you use elsewhere in Hiverlab tooling. You land on the dashboard, which lists every project you own or that someone has shared with you.
| Action | Control |
|---|---|
| Look around | Left-drag |
| Orbit a point | Alt + left-drag — turns around whatever is under the cursor |
| Pan | Right-drag or middle-drag |
| Zoom | Scroll — towards whatever is under the cursor, not blindly forwards |
| Fly | WASD · up E/Space · down Q · Shift for 3× speed |
| Frame the selection | F |
| Straight-on views | The view pill at the top — Top, Front, Left and the rest |
| Jump to a viewpoint | Click it in Views |
| Move / Rotate / Scale the selection | 1 2 3 |
Looking and flying are deliberately separate from orbiting, the same way Blender and Unity separate them — so a fly never fights an orbit mid-drag. Any movement cancels a viewpoint fly-to.
The tree on the left lists everything in the scene, sorted by kind. Each row carries three switches, always in the same columns:
Select a row to get the gizmo — 1, 2 and 3 switch it between Move, Rotate and Scale. Double-click a name to rename. Drag a row onto a group to put it inside. New group is in the panel header — groups are the main way to keep a scene legible, and they matter later when you publish (§13).
Open Assets in the rail to browse the Central Platform library — your own uploads, folders you are a member of, and the shared libraries. Pick a model or splat and it drops into the scene.
The picker also shows In this project: everything the open scene already uses. That is the only listing that works on a project shared with you, since the folders belong to whoever uploaded into them.
Rail → Data source. A source is a connection, defined once and reused by every chart in the project. Credentials are stored encrypted on the server and never sent back to the browser.
Host, port, database, user, password. Queries are read-only SELECTs.
The URL, then as much of the rest as the API needs:
| Field | Use it for |
|---|---|
| Method | GET, or POST for a read endpoint that takes its filter in the body. |
| Request body | Appears for POST. Must be valid JSON — it is checked before saving. |
| Auth | None, an API key in a header, a bearer token, a username and password, or Sign in for a token. |
| Extra headers | Name: value, one per line. For a tenant id, an API version pin, anything that is not itself a credential. |
Press ⚡ on a source to test it. A failure says which half broke: bad credentials, a token that is not where expected, or the data call itself being refused.
Rail → Chart adds a card into the scene. Open its ✎ for the style editor.
Pick the source, say what you want in plain language — "chiller flow rate for device 100001" — choose a type or leave it on Auto, and press Generate with AI. It fills in the query, and you press Test query to see what actually comes back before anything reaches the scene. Nothing is applied behind your back.
| Type | Shows | Needs |
|---|---|---|
| Value | One big number | A query returning a single value |
| Gauge | A dial with threshold bands | A single value, plus min and max |
| Table | Rows and columns | A query returning rows |
| Bar, Line | A plotted series | Written by the assistant — these are the two the dropdown cannot offer, because their shape lives in a generated spec |
Rail → Interactive asset. Clicking an object in the scene opens a small panel of readings beside it.
Choose what is clickable: a whole group, or individual objects you select and Add selected. The difference decides how the query has to look:
| Bound to | The query should return | Object id column |
|---|---|---|
| One object | One row | Not needed — the binding already says which object |
| Several, or a group | One row per object | The column whose values match the object names |
Names are matched with the file extension dropped, so an object imported as pressure.glb matches a row keyed pressure. You do not need to rename anything, and your data does not need to know about .glb.
Fields chooses which columns the panel shows, in order. If a click produces a panel that says nothing matched, it tells you which column it was matching on and what values it saw — usually the id column is the wrong one, or the query is wider than the binding.
Rail → Spatial heatmap interpolates one numeric reading across a floor, between sensors that are ordinary objects in a group. Move a sensor in the editor and its contribution moves with it.
Point it at the group, give it a query returning one row per sensor, and say which column is the name and which the value. Min and max should come from the quantity — RSSI is about −90 to −30 dBm, a percentage 0 to 100 — not from whatever today's sample happens to span, or later readings fall off the scale. Viridis is the default colour scheme and the safest for colour blindness; the traffic-light scheme is the one to avoid if that matters to your audience.
Views in the rail saves camera positions. The first is the scene's opening view — what anyone sees when they open the project or the published link. Viewers can jump between them; they cannot change them.
A version is an authored variant — "ground floor", "night lighting", "client cut A" — not an undo history. Each has its own objects, charts and viewpoints, and each is independently shown or hidden to viewers.
Publish gives the project one link. Anyone with it can look around, jump between viewpoints and switch between the versions you marked shown — and nothing else. They cannot edit, and they do not need an account.
A published scene can let whoever opens it switch whole groups off — a floor of sensors is one idea, not forty, and hiding them is easier than explaining them.
What a viewer switches off is theirs for that visit only — it is never saved back, and it never affects anyone else opening the same link. A group inside a group gets its own switch.
People on a project card adds an editor by email address. They get the project on their own dashboard with a SHARED chip, and can do everything you can except publish, rename, delete or re-share it — those stay with the owner.
A published scene can sit in an <iframe> and talk to the page around it: your dashboard can highlight an object when someone clicks a table row, and hear about clicks in the 3D view. See the embedding guide for the full message list.
One behaviour worth knowing here: selecting an object from the host works even when the viewer has switched its group off. The host asked about an object, not a group, so the group is not revealed — expect the readout, and the camera move, for something not currently on screen.
| What you see | Usually means |
|---|---|
| A chart says no data | The query returned nothing. Press Test query in the style editor to see the raw result. |
| A chart stopped updating | A short-lived token expired. Test the source; if it is a sign-in source, that renewal is automatic and the failure is elsewhere. |
| No reading matched "…" on a click | The object id column is wrong, or the query is wider than the binding. The panel names the column it used and the values it saw. |
| A heatmap is blank | No row's name matched an object in the group. It reports how many rows it had and what the objects are called. |
| A table shows columns you did not want | Set Columns. A REST query cannot trim them itself. |
| Panels feel slow | Settings → Chart panels → Glass blur effect. The blur behind them is the most GPU-expensive part of how they look. |
| An icon shows a dashed box | Its URL no longer resolves — the asset was probably removed from the library. Clear it and choose another. |
Something here wrong or missing? It is maintained alongside the code — tell the team and it gets corrected in the same place the behaviour lives.