Designing a grow facility in 3D before you build it
Lay out rooms, equipment and airflow in a 3D model on your screen, and catch the expensive mistakes before anyone pours concrete.
What 3D facility planning is (and why it beats a paper plan)
A grow facility is a building full of rooms, equipment, airflow paths and security cameras. The usual way to plan one, a flat top-down architect's drawing, can only really be read by experts. A 3D model is the same plan rebuilt on your screen as a thing you can rotate, zoom into and click on, so investors, electricians, inspectors and staff all understand it instantly.
Describe the building as data instead of drawing it. You write a data file, a plain list of rooms and their dimensions, and let code draw the building from that data. Re-planning the facility for the next harvest then becomes nothing more than editing some numbers. The worked example throughout this paper is a real two-storey licensed cultivation facility measuring 14.8 by 16.7 metres.
- A 3D model makes spatial relationships visible: airflow paths, camera sightlines, bench density, and where the ducts and drains run.
- It is built with Three.js, a free web library, so the whole thing is one HTML file that opens in any browser with nothing to install.[1]
- Because the floor plan is a data file, asking ‘what if we fit a fourth bench?’ means editing a list, not redrawing the building.
- The same model serves four jobs at once: a design tool, a compliance exhibit for licensing, a staff training aid, and a live monitoring dashboard.
Accuracy, self-review, and grain-of-salt notes
We've gone to great lengths to keep these guides honest. One of the main ways we do that is self-review: we actively look for claims that are subjective, only lightly backed by literature, or based on grower practice rather than a controlled study — and we call those out instead of dressing them up as settled science.
Often there simply is no paper for the decision you're making. In those cases we're drawing on what other growers report and what has worked in our own rooms. That can still be useful — but it is not a lab proof. Do what works for your plants, your room, and your meters. If a table disagrees with your crop, believe the crop and log the difference.
- Layout clashes found in CAD cost less than clashes in concrete
- 3D planning workflow for rooms, doors, and equipment footprints
- WAC/IBC examples as your local licence rules
- Any model as engineering stamp / fire-life-safety approval
See something glaringly wrong? Tell us and we'll fix it. Please open a GitHub issue with the paper name and what looks off (include a source if you have one): Report an accuracy issue. Local law, labels, and licences always override any recipe here. Inline notes labelled grain of salt flag the highest-risk over-trust points in the text.
Key terms, defined from zero
Here is the vocabulary. None of these need prior knowledge. They are the words this topic keeps using. Read this once and the rest of the paper reads easily.
Model the building as data, not as a drawing
Do not draw the building by hand in code. This is the single most important decision in the whole approach. Describe it as data, and let the code interpret that data into geometry. The reference schema, the shape of the data file, needs only four kinds of record to capture almost any grow building.
Each room is stored as a rectangle, [x, y, width, depth] in metres. Each wall is a centre-line with openings positioned by how far along the run they sit, and a single global wall thickness (0.15 m) avoids a whole class of typos. Everything uses one unit equals one metre, so the millimetre numbers on the architect's plan (4800, 9200) are divided by 1000 once, at data-entry time, and never thought about again.
- Rooms: an interior footprint rectangle in metres.
- Walls: a centre-line with openings (doors, the 4.6 m roller door, pass-throughs) placed by distance along the run.
- Equipment: benches, dehumidifiers, AC heads, CO₂ tanks.
- Devices: cameras, sirens, safes, network and power racks.
Doors, the roller door and pass-throughs are all the same thing: an ‘opening’ on a wall, with a width and a head (top) height. That sameness keeps the data file short. Because the model is data, it survives every re-plan. You edit numbers, not geometry.
Building the shell: floors, walls, openings and stairs
Code builds the physical shell from the data: the floors, walls and stairs. Floor slabs are flat 2D shapes ‘extruded’ (pushed up) into thickness, and they can include holes. You need a hole for the void where the stairwell drops through. Each wall run is split by its openings into solid segments, with a lintel (a short beam) filling the gap above each door.
Stairs are a loop of step-shaped boxes. The reference building climbs 3.25 m over a 4.5 m run as 16 steps of 203 mm each. Drawing the stair this way doubles as a buildability check: if the steps don't fit the space at a sensible riser height, you find out now, on screen, not on site. Standard building codes cap a stair riser at about 178 mm (7 inches) with a tread of at least 279 mm (11 inches), so a 203 mm riser flags as steep and tells you to lengthen the run.[4]
- Floor slabs are extruded shapes that can carry holes for stairwells and service voids.
- A wall is a centre-line plus openings; openings split it into segments with lintels above. No complex geometry needed.
- Each storey gets its own group, so switching floors just hides one and shows the other (its labels hide automatically too).
- Details like the corrugated roller-door texture come from about 10 lines of code, with no image files.
| Check | Value | Verdict |
|---|---|---|
| Total rise | 3.25 m | fixed by the two floor heights |
| Horizontal run | 4.5 m | the space allotted on the plan |
| Risers | 16 × 203 mm | steep, over the 178 mm code max |
| Treads | 281 mm | comfortable, above the 279 mm min |
| Fit | Fits the 4.5 m run | OK, but lengthen run to ease the riser |
Fit-out: benches, plants, climate gear and airflow
Fit-out turns a generic building into a grow facility, and every piece is built from simple shapes. No modelling software required. The reference flower rooms use 1.2 by 7.6 m rolling benches, three per room, giving 27.4 m² of canopy in a 44 m² room: about 62% of the floor, a number the model shows at a glance.
Plants are the highest-count object, 210 of them here, so they are ‘instanced’, meaning drawn in one batch rather than one at a time. That single trick is the biggest performance lever in the whole model. The climate gear (dehumidifiers, carbon filter/fan units hung at 2.45 m, mini-split AC heads, CO₂ cylinders) each get a tiny builder, sized straight from the datasheet.
Moving air thins the still ‘boundary layer’ of humid air that clings to each leaf, which is what lets the leaf actually exchange water vapour and CO₂ with the room[2]. The plan's target of 3500 m³/h of horizontal airflow per flower room is drawn as toggleable arrows that an HVAC contractor reads instantly. Modest, even air movement across the canopy keeps that boundary-layer conductance high and uniform. Too little leaves dead spots, too much can close stomata[3].
| Item | Built from | Count |
|---|---|---|
| Rolling bench | Box + leg rails, 1.2 × 7.6 m | 9 (3 per flower room) |
| Dehumidifier | Box + grille face | 7 |
| Carbon filter / fan | Cylinder + duct, hung at 2.45 m | 10 |
| AC head (mini-split) | Flattened box above doors | 8 |
| CO₂ cylinder | Capped cylinder, floor-standing | 6 |
A flat plan hides height. In 3D you immediately catch a carbon filter hung at 2.45 m over a walkway, an AC head sitting above a door swing, or a dehumidifier that lands on a bench. Pair this with the airflow design paper to size the fans before you place them.
The security and compliance layer you can actually see
Licensed cultivation is audited on its security plan, and modelling that layer turns a paper checklist into something you can walk an inspector through. Each camera gets a translucent FOV cone: its length is the usable range, its width is the lens angle. Blind spots show up as floor with no tint at all.
Cannabis security rules are jurisdiction-specific, but they are concrete: a typical regime requires surveillance of every entrance, exit, and processing, storage and destruction area, at a minimum resolution and frame rate, with recordings retained for weeks[5]. Modelling the cameras as cones lets you prove that coverage visually instead of arguing it from a list. The reference facility models roughly 22 cameras (20 bullet, 1 doorbell, 1 PTZ), 16 sirens, 2 floor-bolted drug safes, a walk-in vault (the drying room itself), and the PoE/UPS racks (three 6U plus one 13U) that keep it all powered.
- Camera cones answer licensing questions visually: do three flower-room cameras cover all three benches? Does the hallway pair leave a lobby gap?
- Blind spots appear as un-tinted floor, far easier to spot than reading a coverage list.
- Sirens, safes, the vault and the network/power racks are all modelled, because cable runs and UPS placement are part of the security story.
- One checkbox shows or hides the whole security layer: audit mode versus tour mode.
- The roof PTZ camera's 70°, 12 m cone is checked against the upper open-plan office for intrusion coverage.
| Device | Count | Placement logic |
|---|---|---|
| Cameras | 22 (20 bullet, 1 doorbell, 1 PTZ) | Every entrance, exit and grow/process area |
| Sirens | 16 | Audible coverage of all occupied zones |
| Drug safes | 2 | Floor-bolted, inside monitored rooms |
| Walk-in vault | 1 | The drying room doubles as secured storage |
| PoE + UPS racks | 3 × 6U + 1 × 13U | Short cable runs; power survives an outage |
A step-by-step path from plan to clickable model
Here is the practical order of work, with nothing skipped. The whole thing is one HTML file, a JSON block, and roughly 600 lines of generator code, small enough to lift straight from a reference document and adapt.
- 1Read the dimension chainsOff the architect's plan, read the chains (e.g. 4800 + 4632.40 + 4800 across the top) and divide every millimetre figure by 1000 to get metres.
- 2Transcribe to JSONEnter rooms, walls, equipment and devices into the four-record schema. This is the real work, and it becomes your single source of truth.
- 3Build the shellRun the shell builders: floor slabs, walls with openings and lintels, then the stairs (which also sanity-check themselves).
- 4Add the fit-outRun the fit-out builders: benches, instanced plants, and climate gear sized from datasheets.
- 5Add the security layerPlace cameras with their FOV cones, sirens, safes, the vault and the racks; group them under one toggle.
- 6Add interactionAn orbit camera plus a one-click top view that reproduces the 2D plan, and click-to-inspect so each room and device reports its own contents.
To start a new facility, save the page, copy the importmap and script block, and replace the data tables with your own plan. The generator code does not change. Only the numbers do.
Common pitfalls and how to dodge them
Most mistakes come from a handful of repeatable errors. The biggest by far is modelling in code instead of in data. Do that and every re-plan becomes painful, because you have thrown away your single source of truth. The rest are rendering details that are easy to fix once you know them.
| Pitfall | The fix |
|---|---|
| Modelling in code, not data | Keep the building in the JSON schema and let code only interpret it. This is the cardinal rule. |
| One real light per grow fixture | 14 shadow-casting lights kill the frame rate. Use one directional ‘sun’ plus emissive (glowing) surfaces. |
| Pure-white walls blow out | Under ACES tone mapping, white clips. Use a warm off-white (0xe8e6e0) at high roughness. |
| Shadow camera too big | An oversized shadow camera makes mushy shadows. Size it to the building, not the world. |
| Picking against the whole scene | Users accidentally select walls. Raycast a curated ‘pickables’ list instead. |
| Forgetting wall thickness as a global | Set thickness once (0.15 m) and reuse it. This removes a whole class of typos. |
Remember one thing: the moment you start hand-placing geometry in code, you have lost the ability to re-plan cheaply. Every ‘what if’ then means re-coding instead of re-typing a number.
What 3D planning realistically gets you, and what it does not
Set expectations honestly. This kind of model is light and fast: the reference demo draws a full two-storey facility, about 450 meshes plus instanced plants, at 60 frames per second on integrated graphics, and scales to whole campuses by instancing and merging geometry while keeping draw calls under about 300.
Simple shapes carry you surprisingly far. You only reach for a proper modelling tool (Blender, exported as glTF) when you need a single photoreal ‘hero’ asset. The model is a planning, compliance and monitoring aid. It is not a structural-engineering or code-compliance sign-off. The airflow and security targets it visualises still need a qualified professional to validate.
| Budget | Target | Why |
|---|---|---|
| Meshes | ~450 | A full two-storey facility shell + fit-out |
| Frame rate | 60 fps | Smooth on integrated graphics |
| Draw calls | < 300 | Keeps low-end laptops and tablets usable |
| Pixel ratio | capped at 2 | Stops 4K screens overworking the GPU |
| Shadow lights | 1 | One sun; the rest are emissive surfaces |
A 3D facility model is a design tool, a compliance exhibit, a training aid and, wired to sensors, a live dashboard. It is not an engineering sign-off. Treat every airflow, structural and security target it shows as something to confirm with a professional, not as approved.
Start with primitives, get your plan into data, and the model pays for itself the first time it catches a clash before construction. From here, read the grow-room systems paper to see what fills each room, or the irrigation manual for wiring the model to live irrigation data.
References
- mrdoob and contributors. three.js, JavaScript 3D Library [WebGL/WebGPU scene-graph rendering library]. GitHub repository (MIT License). Accessed 2026-06-22. (industry/manufacturer or non-journal source) https://github.com/mrdoob/three.js/
- Kitaya, Y., Tsuruyama, J., Shibuya, T., Endo, M., & Yoshida, M. (2003). Effects of air current speed on gas exchange in plant leaves and plant canopies. Advances in Space Research, 31(1), 177–182. DOI:10.1016/S0273-1177(02)00747-0 https://doi.org/10.1016/S0273-1177(02)00747-0
- Kimura, K., Yasutake, D., Yamanami, A., & Kitano, M. (2020). Spatial examination of leaf-boundary-layer conductance using artificial leaves for assessment of light airflow within a plant canopy under different controlled greenhouse conditions. Agricultural and Forest Meteorology, 280, 107773. DOI:10.1016/j.agrformet.2019.107773 https://doi.org/10.1016/j.agrformet.2019.107773
- International Code Council (2024). 2024 International Building Code (IBC), Section 1011.5.2, Riser height and tread depth (stair riser 7 in. max / 4 in. min; rectangular tread 11 in. min). (industry/manufacturer or non-journal source) https://codes.iccsafe.org/s/IBC2024P1/chapter-10-means-of-egress/IBC2024P1-Ch10-Sec1011.5.2
- Washington State Liquor and Cannabis Board. WAC 314-55-083, Security and traceability requirements for cannabis licensees (surveillance of all entrances/exits, processing/storage/destruction areas and POS; min. 640x470 resolution; min. 10 fps; recordings retained >=45 days; storage device secured against tampering/theft). (industry/manufacturer or non-journal source) https://app.leg.wa.gov/wac/default.aspx?cite=314-55-083
Citations marked in-text as [n] map to this list. Primary literature and official guidance except where noted. Cannabis tissue culture is strongly genotype-dependent, verify dilutions, hormone doses and local regulations against the primary sources before relying on them.