Procedural Environment Generation for Training Data
How to generate millions of diverse, realistic environments procedurally - the key to scaling synthetic data.
Hand-building 3D environments for training data doesn't scale, which makes it the same trap as collecting real data forever. If we need a million diverse scenes, we need a generator, not an army of artists.
Rules Instead of Rooms
Instead of modeling a specific room, you model the rules that generate rooms. Room dimensions follow distributions from real estate data. Furniture placement follows cultural conventions and physical constraints. Materials get sampled from measured BRDF libraries, and lighting varies by time of day and fixture type. The generative process becomes the data source.
Our Generation Pipeline
Space Generation
Building Template → Room Layout → Doorways/Windows →
Floor Plan Validation → Ceiling/Floor/Wall Materials
Templates cover apartments, offices, retail, and industrial spaces. A room grammar encodes how rooms relate: living rooms connect to kitchens, bedrooms have closets, and so on. Validation then checks navigability, minimum dimensions, and structural plausibility before a layout gets accepted.
Object Placement
Room Type → Required Furniture List → Placement Algorithm →
Collision Detection → Semantic Relationships
Placement rules put beds against walls, TVs facing seating, tables in open areas. Semantic relationships go a level finer: lamp on nightstand, book on coffee table. A physics simulation handles collision and stable placement.
Material Variation
Each surface gets a material sampled from a library - measured BRDFs for realism, procedural textures for infinite variation, and age and wear parameters for scratches, stains, and patina.
Lighting
Lighting is procedural too. Window positions come from the architecture, time of day sets sun angle and intensity, interior fixtures get placed per room type, and ambient terms approximate indirect light.
Quality vs Diversity Trade-off
More variation means better coverage, but past a point it also means combinations that never occur in reality. We keep that in check with constraint satisfaction (rules prevent nonsensical scenes - no toilet in the kitchen), distribution matching (dimensions and placements sampled from real distributions), and rarity weighting (edge cases are included but not over-represented).
How Do We Know a Generated Scene Is Realistic?
Three ways, none of them perfect. Human evaluation: show scenes to annotators and have them rate realism, which works but is expensive and slow. Distribution matching: compare statistics like object co-occurrence and room sizes against real datasets. Domain classifier: train a model to distinguish real from synthetic, where low accuracy is the result you want.
Current generation capability: ~1000 unique environments per day. We need a 10x improvement.
Integration with Rendering
Generated scenes are stored in USD for the path tracer, with complete material and lighting specification, multiple sensor viewpoints per scene, and variation parameters saved for reproducibility. The whole path from generation to rendered training data runs without a human in the loop, and that automation is the point of building it this way.