Designing a grow facility in 3D before you build it
HomeFacilityDesigning a grow facility in 3D before you build it
Facility · Design

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.

Facility11 diagramsOperational guide~14 min read
Start here

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.
experts only
Flat 2D floor plan
Top-down lines and symbols. Accurate, but only an architect or builder can fully read it. One audience.
everyone
Same plan in 3D
A rotatable, labelled building you click to inspect. Anyone can see what a room holds and where a camera looks.
one source
From the same numbers
Both views come from one data file, so they can never disagree. Edit the data, both update.
Figure 1. The same facility, two ways to read it. The 3D view does not replace the architect's drawing. It makes that drawing legible to everyone else.
Plain-English dictionary

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.

3D modelA picture of the building you can rotate, zoom and click on a screen. Not a fixed photo, but a thing you move around.
Three.jsA free code library that draws 3D scenes inside an ordinary web browser, with nothing to install.
Floor planThe architect's flat, top-down drawing of walls, doors and rooms.
Render / sceneTo ‘render’ is to draw the picture. The ‘scene’ is everything in the model: walls, benches, lights, cameras.
JSON / data fileA plain list of facts, room names, sizes and positions, that the code reads to build the model.
FOV cone‘Field of view’ cone: a see-through wedge showing exactly what one camera can see, so blind spots show up as floor with no tint.
Fit-outThe equipment and furniture added to a bare room: benches, lights, dehumidifiers, CO₂ cylinders.
Digital twinA 3D model wired to live sensors, so it shows the real, current temperature and humidity of each room.
A clean one-way facility flowpeople and product move dirty-to-clean, never backIntake / motherVegFlowerDry / cureTrim / packQA / vaultOne-directional flow keeps clean product away from incoming material and waste, the backbone of contamination control.
Diagram. A one-way facility flow: people and product move dirty-to-clean and never double back.
Core idea 1

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.

The four record types
  • 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.

[x,y,w,d]
rooms
rect = [x, y, w, d], the interior footprint in metres.
at + width
walls
A centre-line; each opening sits ‘at’ a distance along the run, with a width and head height.
type + pos
equipment
Type plus position; each item sized from its datasheet.
pos + aim
devices
Position plus an ‘aim’ bearing for cameras and sirens.
Figure 2. The four record types, with the key fields each one carries. Roughly 25 wall rows describe the entire reference building's envelope and partitions.
One data file, three outputs1JSON datarooms, walls,equipment,devices22D SVG planthe familiartop-down drawing3Bench reportcanopy countsand areas43D scenethe clickablemodelOne source of truth: the plan, the report and the 3D view can never disagree.
Figure 3. Because all three views read the same numbers, fixing a dimension once fixes it everywhere.
Core idea 2

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.
solid
Segment
Solid wall from the corner to the first opening.
door
Opening
A door, head height 2.05 m, placed ‘at’ its distance along the run.
above
Lintel
A short box filling the wall above the opening.
solid
Segment
Solid wall continues to the next corner.
Figure 4. One wall run, read left to right. The opening's ‘at’ value is simply how far along the wall it starts.
A stair sanity-check the model performs for free. The 203 mm riser is buildable but steep against code minimums[4], a prompt to revisit it early.
CheckValueVerdict
Total rise3.25 mfixed by the two floor heights
Horizontal run4.5 mthe space allotted on the plan
Risers16 × 203 mmsteep, over the 178 mm code max
Treads281 mmcomfortable, above the 279 mm min
FitFits the 4.5 m runOK, but lengthen run to ease the riser
Core idea 3

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].

Canopy vs floor area, one flower roomThree 1.2 × 7.6 m benches give about 62% canopy coverage of the room floor.01326395227.4 m²Canopy (3 benches)44.0 m²Total floor
Figure 5. The model surfaces canopy density automatically. You never measure it by hand. 62% is a healthy, walkable density for a flower room.
Horizontal airflow loop across one roomA racetrack loop: air sweeps out across the canopy and returns, ~3500 m³/h.outward flow over benches 1–2return flow over bench 30%50%100%
Figure 6. Airflow shown as a top-down loop. Drawing it makes the air path visible to contractors and inspectors, and reveals where benches would stall the flow.[2]
The equipment schedule. Each item is a small reusable builder, and placing them in 3D reveals clashes early: a filter over an aisle, an AC head fouling a door.
ItemBuilt fromCount
Rolling benchBox + leg rails, 1.2 × 7.6 m9 (3 per flower room)
DehumidifierBox + grille face7
Carbon filter / fanCylinder + duct, hung at 2.45 m10
AC head (mini-split)Flattened box above doors8
CO₂ cylinderCapped cylinder, floor-standing6
Clashes you only see in 3D

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.

Core idea 4

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.
Camera coverage across one flower roomCones overlap mid-room; the 40–74 stretch is a candidate blind spot to re-aim.cam 1 conecam 2 conecam 3 cone0%50%100%
Figure 7. Top-down camera coverage. Any floor outside every cone is a blind spot. Here, a gap between cameras 2 and 3 that re-aiming closes.[5]
The device schedule and why each sits where it does. Cable runs and UPS placement are modelled because they are part of what an auditor checks.[5]
DeviceCountPlacement logic
Cameras22 (20 bullet, 1 doorbell, 1 PTZ)Every entrance, exit and grow/process area
Sirens16Audible coverage of all occupied zones
Drug safes2Floor-bolted, inside monitored rooms
Walk-in vault1The drying room doubles as secured storage
PoE + UPS racks3 × 6U + 1 × 13UShort cable runs; power survives an outage
Do it yourself

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.

  1. 1
    Read the dimension chains
    Off 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.
  2. 2
    Transcribe to JSON
    Enter rooms, walls, equipment and devices into the four-record schema. This is the real work, and it becomes your single source of truth.
  3. 3
    Build the shell
    Run the shell builders: floor slabs, walls with openings and lintels, then the stairs (which also sanity-check themselves).
  4. 4
    Add the fit-out
    Run the fit-out builders: benches, instanced plants, and climate gear sized from datasheets.
  5. 5
    Add the security layer
    Place cameras with their FOV cones, sirens, safes, the vault and the racks; group them under one toggle.
  6. 6
    Add interaction
    An 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.
Reuse is copy-and-replace

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.

Avoid these

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.

Six common pitfalls and the recommended fix for each. The first one is the only one that costs you weeks. The rest cost minutes.
PitfallThe fix
Modelling in code, not dataKeep the building in the JSON schema and let code only interpret it. This is the cardinal rule.
One real light per grow fixture14 shadow-casting lights kill the frame rate. Use one directional ‘sun’ plus emissive (glowing) surfaces.
Pure-white walls blow outUnder ACES tone mapping, white clips. Use a warm off-white (0xe8e6e0) at high roughness.
Shadow camera too bigAn oversized shadow camera makes mushy shadows. Size it to the building, not the world.
Picking against the whole sceneUsers accidentally select walls. Raycast a curated ‘pickables’ list instead.
Forgetting wall thickness as a globalSet thickness once (0.15 m) and reuse it. This removes a whole class of typos.
The cardinal sin, restated

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.

Reality check

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.

How far to take it1Primitivesboxes andcylinders;covers mostplanning2glTF heroBlender assetonly wherephotorealmatters3DashboardReact UI wrappedaround the scene4Digital twinlive MQTT / HomeAssistantsensorsEach rung is more effort; climb only as far as the job actually needs.
Figure 8. A capability ladder. Most facilities never need to climb past the first rung for planning.
The performance budget. Hit these and the model stays smooth almost anywhere. The 60-fps figure is a reproduce-to-verify benchmark, not a guarantee for every machine.
BudgetTargetWhy
Meshes~450A full two-storey facility shell + fit-out
Frame rate60 fpsSmooth on integrated graphics
Draw calls< 300Keeps low-end laptops and tablets usable
Pixel ratiocapped at 2Stops 4K screens overworking the GPU
Shadow lights1One sun; the rest are emissive surfaces
What it is, and what it is not

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.

Related papers

References

  1. mrdoob and contributors. three.js, JavaScript 3D Library [WebGL/WebGPU scene-graph rendering library]. GitHub repository (MIT License). Accessed 2026-06-22. (non-peer-reviewed source) https://github.com/mrdoob/three.js/
  2. 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
  3. 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
  4. 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). (non-peer-reviewed source) https://codes.iccsafe.org/s/IBC2024P1/chapter-10-means-of-egress/IBC2024P1-Ch10-Sec1011.5.2
  5. 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). (non-peer-reviewed source) https://app.leg.wa.gov/wac/default.aspx?cite=314-55-083

Citations marked in-text as [n] map to this list. Peer-reviewed sources 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.