Blueprint
On this pageCase studyMeasured retraceSheet registration3D massingAppearance viewsRegistration checksControlled orbitGaussian reconstruction
Case StudyPlan to world

From photographed plans to a playable spatial world.

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.

03eRebuilt

The measured retrace restores the written room dimensions.

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.

The photographed first floor plan
    with every retraced room drawn over it in colored outline and labeled: mud room, kitchen, pantry, butler
    pantry, dining room, foyer, stair, gym, great room, office, powder, bath 1, suite 1, two car garage, tandem
    garage, gazebo and five covered porches. Each outline sits on the walls printed underneath it.
First floor. Colored outlines are the retrace; the gray linework under them is the photographed sheet. Read from retraced-fidelity.json.
The photographed second floor plan
    with the retraced upper rooms drawn over it in colored outline and labeled: bedrooms 2 to 5, baths 2 to 5,
    walk-in closets, laundry, theater, loft, stair, bridge and three balconies. The red footprint outline sits on
    the printed outer wall. Most outlines sit on the rooms they name; the theater, the loft and the two east
    baths sit up and left of theirs by a few feet.
Second floor. 9 of the 23 rooms sit within a quarter foot of the walls they name. The theater, the loft, the stair and the east baths are the ones out of place, the worst by 3.7 ft, for the reason in the next section. Read from plan-snap.json.

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.

03fRegistered

The two floor sheets register into one coordinate system.

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.

The two plan sheets overlaid after the
    solved transform, the first floor in cyan and the second in red on black. The outer walls, the gazebo
    octagon, the angled garage wing, the covered porches and the two overall dimension lines along the bottom
    appear white where both colors fall on the same line. The title block words overprint letter for letter.
The second sheet warped onto the first: cyan is the first floor, red the second and white marks overlap. The coverage check includes the outer wall, gazebo, garage wing, bottom dimension lines and title block. Interior walls remain single-color because the floors differ. Read from sheet-registration.json.

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.

Rejected wall-only room alignment

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.

03gThe solid

The registered plans define the complete building envelope.

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.

A shaded gray solid model of the house seen
      from above and to the south east: main block with a hipped roof, a two story porch along the south face,
      an octagonal gazebo at the west end and a diagonal wing running off to the south east.
Massing

The solid

Built from the retrace, both floors, roof included.

The same view as a white sheet with black line
      drawing: every face boundary of the model, hidden lines removed, including each window and door opening.
Control

The line map

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.

03hPhotographed

Exact cameras constrain four high-resolution appearance studies.

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.

Photograph of a two story cream clapboard house with a green
      standing seam hipped roof, a full width porch on turned posts with a white balustrade, dark green louvered
      shutters, an octagonal gazebo at the left and a wing at the right, on a mown lawn under live oaks with
      Spanish moss.
Southfrom the ground

South elevation

Porch, balcony, gazebo and wing roof retain the measured silhouette.

Open full resolution
Photograph of the same house from the west: the gazebo end nearest
      the camera, the two story porch running away to the right, palms and azalea beds against the foundation.
Westfrom the ground

West elevation

The measured subject bounds keep the smaller west facade in frame.

Open full resolution
Aerial photograph of the house from above and to the
      south east. The green metal hipped roof fills the middle of the frame, the two story porch runs along the
      near face, the gazebo sits at the far left and the diagonal wing runs off to the lower right, all in a
      garden of palms and live oaks.
South east30° drone

South-east aerial

The strongest aerial registration in the four-view set.

Open full resolution
Aerial photograph of the house from above and to the
      south west, the gazebo in the near corner, the main hipped roof beyond it and the wing running away to the
      far side.
RejectedSouth west · 30° drone

South-west aerial

The camera moved 74 px and the roof pitch changed. The frame remains in the record as rejected evidence.

Open full resolution
03iRegistration

Line registration measures each generated view against the massing.

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

Four rows, one per view. In each row
    the photograph on the left and the same photograph on the right with the line map painted over it in red.
    The red lines follow the ridge, the eaves, the porch posts and the window openings in the photograph.
All four views. Ink covers 2.6–3.7% of each frame. The bottom row shows the displaced south-west overlay and its measured offset. Read from styling-fidelity.json.

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.

Run details and source files

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.

03jMeasured

Edge-distance registration rejected the fourth view.

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.

The south west aerial in gray. The line map is drawn
      twice: red where it is shipped, green shifted 42 pixels right and 61 pixels down. The green railings land
      on the porch railings and the red ones float above them.
South-west aerial. Red marks the supplied position; green marks the search minimum, 42 px right and 61 px down.

Mean distance from map ink to the nearest photograph edge at the supplied position and at the search minimum.

South
2.97 → 2.38 px, moved 4.1 px
West
1.84 → 1.70 px, moved 4.0 px
South east aerial
2.11 → 1.91 px, moved 3.0 px
South west aerial
3.30 → 2.69 px, moved 74.1 px

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.

03kCircled

Three controlled orbits and one measured upscale study.

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.

The wide rung, a full 360 at 240 frames. Cream clapboard, Charleston green shutters, standing-seam metal, wraparound porch, live oaks.

Three camera paths use the same geometry controls and style file.

Facade
241 frames, eye level, close
Wide
240 frames, eye level, back
Roofline
241 frames, raised, looking down
Billed
$4.6252 of $4.63 authorized

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.

Three crops of facade frame 96 at 2560 by 1440, in
    columns. LANCZOS along the top row, SeedVR2 underneath. The shingles, muntins and porch balustrade carry
    visible separation on the bottom row and none on the top.
Facade frame 96, both at 2560×1440. LANCZOS on top, SeedVR2 underneath.

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.

Upper gable
Laplacian +130.5%, Tenengrad +21.2%
Window muntins
Laplacian +89.5%, Tenengrad +14.4%
Porch and rail
Laplacian +54.7%, Tenengrad +13.8%
Billed
$2.7242 of $2.73 authorized

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.

A contact sheet of nine frames sampled evenly around the
    wide orbit, showing the same house from nine bearings. The house is consistent; the background is sky and
    live oaks in some frames and a dark hedge in others.
Nine bearings off the wide rung, frames 0 through 239. The porch wraps, the hipped roof holds its pitch, and the shutters stay on the same windows all the way around.

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.

Three line charts, one per orbit. Each plots how
    far the generated house wants to move from its control, in pixels, against bearing from 0 to 360 degrees.
    Facade is spiky with isolated peaks; wide is flat with one small cluster; roofline is flat except for one
    continuous raised arc between about 140 and 170 degrees.
Displacement from each supplied control position to its edge-match minimum around the turn. Red marks a frame over 8 px. The search steps 4 px, so the bottom of each trace is the floor the method can report.

The rejected still measured 74 px from its supplied position. The largest displacement among the 722 orbit frames is 36.2 px.

Facade
median 3.6 px, max 36.2 px, 9.5% over 8 px
Wide
median 1.4 px, max 12.4 px, 3.3% over 8 px
Roofline
median 2.2 px, max 13.0 px, 7.5% over 8 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.

Facade frame 24 in gray with the depth
      control's edges drawn twice, red where the control puts them and green where the search prefers. The two
      are close along the porch and the grade and separate along the eave.
Facade f024, the worst frame of all 722 at 36.2 px. Red marks the supplied control position; green marks the search minimum. They agree on the porch, the balustrade and the grade, and part along the eave: the model raised the roof line and left everything under it alone.
03mRebuilt in 3D

Three registered orbits fed the 722-frame reconstruction study.

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.

Three crops of the same held-out camera at the
    upper story and porch roof. The generated frame has shutters, window muntins, siding courses and
    shingle texture. The 30,000-step reconstruction has none of them and reads as a smear. The
    90,000-step reconstruction has the shutters, the muntins and the siding back.
Holdout f_f096, each training read at the step it finished on. Tenengrad on this crop: the frame carries 55.2, the 30k training reaches 30.1, the 90k training 34.9. Numbers per region in splat-detail-house.json.

Scored twice, once against the frames the generator made and once against the frames the upscaler made, over the same 91 holdouts.

At 1280
19.9748 → 20.4292 dB, +0.4544
SSIM
0.416024 → 0.425564
At 2560
19.5361 → 20.0838 dB, +0.5477
SSIM
0.498866 → 0.526555
Gaussians
298,474 → 834,011, 2.79×
On disk
70.4 MB → 196.8 MB

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.

House
55.2 · 30.1 → 34.9
Porch
52.5 · 27.3 → 32.1
Lawn
93.1 · 31.1 → 36.5
Sky
28.8 · 2.9 → 2.8

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.

Six crops of the same holdout in a row: the generated
    frame, then the 90,000-step training at 5k, 15k, 30k, 60k and 90k steps. The 5k crop is a white
    smear, shutters appear by 15k, muntins by 30k, and the last two add siding courses and shingle
    grain. Under the row a PSNR curve rises steeply to about 30k and then climbs slowly to the end.
Training progression on one crop against the generator’s source frames: 17.30 dB at 5k to 20.43 at 90k. Every step in splat-steps-fused.json.

The training curve provides the budget basis for a comparable house.

Break-even
between 40k and 45k steps
At 45k
19.9961 dB, past the 1280 run
Last third
65k to 90k, +0.1646 dB
Final 5k
+0.0148 dB, still rising
Growth stop
45,000, half the run

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.

Front 315–45°
18.4669 dB over 22 frames
Left 225–315°
19.9603 dB over 22 frames
Right 45–135°
20.3000 dB over 24 frames
Rear 135–225°
21.6779 dB over 23 frames
Mean
20.1230 dB, SSIM 0.512335

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.

Historical result

90k training result

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
BackCreateNextDepth

Depth reprojection measures support beyond each solved camera.