This case study follows the working evidence through dimensional recovery, 3D structure, controlled generation, camera recovery, reconstruction and the current Studio runtime.
Each chapter exposes the source media, accepted measurements, rejected experiments and interactive result that followed.
Recover rooms, boundaries and dimensions from photographed drawings.
Measure reprojection support, disocclusion and surface direction.
Extend exact-camera appearance around the complete camera ring.
Inspect, edit, direct and play inside the current spatial world.
The first schema placed 0 of 23 rooms within 5% of the draftsman’s lettered dimensions, and no fitted page transform could absorb the spread. So both sheets were retraced from the written numbers themselves: rooms placed at their lettered sizes, walls built between them, floors registered on their shared outer wall.
The same dimensional check places 23 of 23 lettered rooms within 2%, median absolute error 0.0%. The implied scale, which used to run 0.49× to 2.53× across rooms, is now 1.00× to 1.00×. The sheet’s own dimension line reads 128.02 ft across and the retrace measures 128.02.


Split by sheet the picture holds: floor one lands 26 of 26 sides within 5% at a fitted factor of 0.9999, floor two 20 of 20 at 1.0001. A single fitted scale now describes each complete sheet. Retracing cost $0.00.
The retrace is calibrated on one photograph: 12.404 px per foot with its datum read off the 128 ft dimension line on the first-floor sheet. Drawing those coordinates onto the second sheet used the same three numbers, and three numbers cannot express the perspective between two photographs taken from different distances at different angles. The second floor measured 79 px off, requiring a homography.
Both sheets are photographs of the same drawing set, so the outer wall, the overall dimension line, the gazebo octagon, the angled garage wing and the title block are drawn identically on both, and the pair is related by a homography that can be measured. The daylight gradient and the hard diagonal shadow come out by dividing each image by a 41 px blur of itself, then SIFT on what is left, matches kept only where both directions agree, and a RANSAC fit at 3 px. 125 matches, 51 inliers, median reprojection 0.42 px.

Room placement was then measured inside the registered outline. Against the detected wall runs, the first floor’s room sides are a median of 0.0 px from the wall they name, with 62% of its 113 sides exactly on one. The second floor’s 92 sides are at 15.2 px, about 1.2 ft, with 36% exactly on. The second sheet writes a dimension inside ten of its rooms and draws the roof over the others, so the others were placed by which quarter of the page their label sits in.
Three wall-only placement attempts failed the first-floor control. Although all 26 lettered sides have reviewed positions, the final attempt moved 18 of 27 rooms by more than one foot. Wall coincidence cannot identify the correct cell: a 5 ft closet shifted by its own width can still align all four sides with a neighbor’s walls. Printed-label position is required to resolve the cell. The computed offsets remain recorded and unused.
The retraced rooms are extruded into walls, openings are cut where the sheets place them, and a hipped roof uses the pitch written on the elevation across the full footprint, diagonal wing and gazebo. Every generated study before this point started from one front elevation and carried no reviewed side or rear geometry. This stage adds reviewed side and rear structure.
3,509 faces. 53 openings follow the plan sheets. Roof pitch 4.5/12, read from the elevation. Footprint 131.4 × 98.3 ft, standing 29.4 ft to the ridge.
Built from the retrace, both floors, roof included.
13,205 segments, hidden line removed, drawn from the same camera.
The line map is drawn from face loops. Merging coplanar edges removes window boundaries from their walls, so the unmerged loops provide the generation constraint.
The styling study handed a Victorian Southern material brief and a landscape to exact renders of the measured massing. Early prompts preserved the ground-level elevations while drifting both aerial views to a lower camera. The final control added the hidden-line map, numeric camera orientation and measured subject framing.
Seedream v5 Pro, Qwen Image 3 and FLUX 2 Pro each received four shaded renders plus the same style brief. FLUX 2 Pro produced the strongest building identity. All three drifted the aerial cameras toward the same ground-level cottage view. The exact-camera harness corrected those views.
The successful control supplied the hidden-line map, the camera’s numeric azimuth and elevation, and the measured image-space subject bounds. The camera orientation was expressed as an aerial photograph from a drone, 30 degrees above the horizon, looking down on the house from the south east; subject framing was specified as from 26% to 93% across the picture.
Porch, balcony, gazebo and wing roof retain the measured silhouette.
Open full resolution
The measured subject bounds keep the smaller west facade in frame.
Open full resolution
The strongest aerial registration in the four-view set.
Open full resolution
The camera moved 74 px and the roof pitch changed. The frame remains in the record as rejected evidence.
Open full resolutionThe red overlay projects massing edges into each exact camera. Displaced walls cross siding; changed roof geometry crosses open sky. This makes camera and silhouette drift visible at the output resolution.

The four selected frames come from three controlled passes because the framing constraint improved the west elevation while destabilizing the south-east aerial. Selection is therefore per camera; rejected variants remain in the sealed run payload.
22 images were requested, 21 collected and $1.24 billed across four passes. The sealed victorian-styling-20260813-r1 payload contains 220 files totaling 225 MiB with file hashes.
The six-stage bd-house-pipeline-r1.mjs command accepts a plan and style file,
then produces the retrace, massing, render, line map, sheet-registration check, styled views and registration
plates. Five stages run locally without provider cost. --style=my-house.txt changes the appearance
brief while retaining the measured camera azimuth, elevation and framing bounds.
The first registration proxy compared brightness beneath the red overlay with brightness across the full frame, and pale siding and sky conspired to make overlay pixels brighter in three views. That let the visibly displaced south-west aerial score inside the same band as the registered south elevation. The edge-distance registration check replaced that proxy.
The replacement metric applies Canny edge detection to the photograph, computes an edge-distance transform and scores each overlay position by mean distance from map ink to the nearest photograph edge. Registration is measured by the displacement between the supplied position and the score minimum.
Mean distance from map ink to the nearest photograph edge at the supplied position and at the search minimum.
The search steps 4 px, so 3 to 4 px is the reporting floor and three views sit on that floor. The fourth reaches its minimum 74 px away; even there it measures 2.69 px against the 1.70 to 1.91 the registered views manage, because the model changed the roof pitch as well as moving it. Read from line-registration.json.
The same registration check applies to generated video frames with known cameras. A displacement of this size within an orbit creates incompatible wall positions for reconstruction.
A reconstruction needs continuous views around the building, so the massing was orbited three times at three heights under the same depth and line controls used for the styled stills. The three passes produced 722 frames for $4.6252, and every frame got a registration score.
Three camera paths use the same geometry controls and style file.
The wide rung contains 240 collected frames against 241 requested. Downstream manifests derive their frame counts from collected files. Read from the ledger.
Generation is capped at 1280×720. SeedVR2 doubles a clip to 2560×1440 for about $0.89 per rung; LANCZOS supplies a zero-cost resampling control. Both are compared at the same output size on matched crops from the same frame.
Laplacian sd measures high-frequency energy and rises on noise. Tenengrad, the mean Sobel gradient magnitude, rises more slowly. The paired measurements distinguish added edge detail from added grain across all three crops.
The native 1280 frame measures 72.2 Tenengrad. At the doubled output size, SeedVR2 recovers about 77% of that high-frequency energy and LANCZOS about 67%; details absent from the generated frame remain absent.
The reconstruction comparison below tests whether this added image detail survives training. Read from upscale-evidence.json.
Background continuity is the one thing the orbit never solved: sky and live oaks bookend the ring while a flat dark hedge fills the middle third. The depth control describes the house alone, so the generated background wandered off on its own and stays unusable for reconstruction.
The registration check was applied to all 722 generated frames. Depth-control edges replace the still-image line map: Canny edges are distance-transformed, and each position is scored by mean distance from control ink to the nearest generated edge. Displacement from the supplied position identifies drift at each recorded bearing.
The rejected still measured 74 px from its supplied position. The largest displacement among the 722 orbit frames is 36.2 px.
The facade trace contains isolated spikes. The roofline trace contains a continuous displaced arc from about 140 to 170 degrees, creating two incompatible wall positions across roughly thirty consecutive frames. Read from orbit-registration.json, per frame.
Both fused trainings use the same 722 cameras. The first trains on native 1280-pixel frames for 30,000 steps. The second trains on doubled frames capped at 1920 pixels for 90,000 steps, and it earns its keep: 834,011 Gaussians against 298,474, and higher scores against both native and upscaled reference sets.
Scored twice, once against the frames the generator made and once against the frames the upscaler made, over the same 91 holdouts.
Read from resolution-compare-fused-at-1280.json and at-2560, and from splat-budget.json.
Tenengrad by region on that holdout, the frame's own figure first, then each training.
The house, porch and lawn improve. Both trainings return a flat wash across the sky, while the source frames contain Spanish moss and branch structure. Additional camera coverage above the roofline is required for that region.
The training curve provides the budget basis for a comparable house.
The 1920 training needs about 1.5× the steps to reach where the 1280 one lands at 30,000, and about 3× to finish half a decibel ahead. Gaussian growth stops at the halfway mark, so everything after 45k is refinement of a fixed set and the curve flattens without going flat.
Where the splat is weakest, from its own holdout scores at 90,000 steps.
The front elevation is the weakest quadrant by 1.5 dB and the principal presentation view. It is also the quadrant whose orbit frames drift furthest from their control, at a facade median of 3.6 px against the wide rung's 1.4. The registration curve above and this table are pointing at the same 90 degrees.
Higher-resolution inputs asked for roughly 1.5 times the optimization steps to match the native-resolution run, then paid it back with recovered facade detail. The catalog keeps this result as historical-superseded evidence for that training comparison. Its limits travel with it: complete exterior coverage, real-property scale, navigation and either doorway transform all remain outside what this result can claim.
Inspect the historical reconstruction