hero: make the portals real recesses and land the facade on Z 0
The portal detail shot failed for a modelling reason, not a camera reason: the doors were 0.1 m panels on a solid plinth, so they read as shading. The plinth is now four piers plus a lintel band, with a 1.2 m reveal, stone jambs and lintels standing 0.10 m proud and three mullions per opening. review-06 frames them from 8 m at eye height. Two defects fixed while doing it: the jamb boxes hung 0.15 m below the pavement, so the facade imported with min Z -15 cm; and a rebuild run against a read-only .blend silently skipped the save, which is why screenshots kept showing the old geometry.
This commit is contained in:
1 parent
f575bc82a8
commit
d4af4af90f
22 files changed
+132
-55
No files matched your search
Binary file not shown.
@@ -28,30 +28,39 @@
|
||||
],
|
||||
"evidence": "measured frontage x assumption depth x measured height, inset behind the cornice"
|
||||
},
|
||||
{
|
||||
"object": "Hero_Stylobate",
|
||||
"dims_m": [
|
||||
25.75,
|
||||
2.4,
|
||||
1.45
|
||||
],
|
||||
"evidence": "assumption: pedestal height"
|
||||
},
|
||||
{
|
||||
"object": "Hero_Column_x6",
|
||||
"dims_m": [
|
||||
0.95,
|
||||
0.95,
|
||||
9.25
|
||||
7.45
|
||||
],
|
||||
"evidence": "6 columns at 4.96 m centres (sibling notes x measured frontage)"
|
||||
},
|
||||
{
|
||||
"object": "Hero_Architrave",
|
||||
"dims_m": [
|
||||
25.75,
|
||||
1.65,
|
||||
0.84
|
||||
],
|
||||
"evidence": "assumption: stacked entablature bands"
|
||||
},
|
||||
{
|
||||
"object": "Hero_Cornice",
|
||||
"dims_m": [
|
||||
25.75,
|
||||
1.75,
|
||||
0.36
|
||||
],
|
||||
"evidence": "assumption: projecting cornice line"
|
||||
},
|
||||
{
|
||||
"object": "Hero_Entablature",
|
||||
"dims_m": [
|
||||
25.75,
|
||||
1.5,
|
||||
2.2
|
||||
3.4
|
||||
],
|
||||
"evidence": "assumption: entablature depth"
|
||||
},
|
||||
@@ -60,7 +69,7 @@
|
||||
"dims_m": [
|
||||
25.75,
|
||||
1.2,
|
||||
1.6
|
||||
2.2
|
||||
],
|
||||
"evidence": "assumption: parapet carries the motto band"
|
||||
},
|
||||
@@ -82,6 +91,15 @@
|
||||
],
|
||||
"evidence": "photographs: two stone discs beside the motto"
|
||||
},
|
||||
{
|
||||
"object": "Hero_Stylobate",
|
||||
"dims_m": [
|
||||
25.75,
|
||||
2.4,
|
||||
1.45
|
||||
],
|
||||
"evidence": "assumption: pedestal height; four piers and a lintel band leave three recesses"
|
||||
},
|
||||
{
|
||||
"object": "Hero_PortalFlight_1",
|
||||
"dims_m": [
|
||||
|
||||
@@ -10,6 +10,7 @@ GameName=GigLine
|
||||
[/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings]
|
||||
bEnablePlugin=False
|
||||
bAllowNetworkConnection=False
|
||||
SecurityToken=01A1B5CDAFDE7AAEB5DFBB48880D25DE
|
||||
bIncludeInShipping=False
|
||||
bAllowExternalStartInShipping=False
|
||||
bCompileAFSProject=False
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -120,3 +120,9 @@ Scope: facts and traps that cost time to establish. Planned work lives in [ROADM
|
||||
- **Blender-side builders live in `Art/blender/*/`** (terrain, street, site, blockout) and reach helpers via `os.path.join(HERE, "..","..","..","Geo","tools")`. Moving them breaks the old `"..", "Geo", "scripts"` path silently until the script is run.
|
||||
- **Height provenance:** 3 of the 15 block buildings carry no OSM height and Blosm renders them at a placeholder 6.4 m. `Geo/tools/block_height_report.py` lists them; they need heights measured off the photographs before the skyline is believable.
|
||||
|
||||
## 2026-11-07 — Blender rebuilds that silently did nothing
|
||||
|
||||
- **A read-only `.blend` makes Blender skip the save without failing the run.** `Tools/hero_facade_build.py` printed its part list and "bounds" as normal, then went straight to the export: the `.blend` and the report stayed at their old timestamps, and the Unreal re-import brought back the old mesh. Symptom to watch for: the imported bounds do not change after a rebuild. Fix: `chmod u+w` the `.blend` first, then confirm the timestamp moved.
|
||||
- **Model bottom must land on Z 0.** The hero portal jambs were sized `PORTAL_H + 0.3` and centred at `PORTAL_H / 2`, so they hung 0.15 m below the pavement and the whole facade imported with `min z = -15 cm`. Always check the asset's `bounds_m.min.z` in the build report.
|
||||
- **Rebuilding a facade is not enough to make a detail shot work**: doors modelled as thin panels on a solid plinth read as shading, not openings. Cutting the plinth into piers with a lintel band is what makes them legible from 8 m.
|
||||
|
||||
+1
-1
@@ -74,7 +74,7 @@ Owner: this session. Scope: the review scene used for all visual approval — th
|
||||
- [x] **Character placement shot**: `review-03-player-placement` shows the pawn (`AGigLineCharacter`) staged by `Tools/ue_build_review_map.py` with a cube behind it. Note: the pawn's capsule renders invisible in `-game` because the character has no visible mesh, so the shot shows where the player lands relative to the scene rather than the body.
|
||||
- [x] **Ground-contact detail shot**: `review-04-ground-contact`, knee height, close on the feet — the soles meet the floor and the shadow joins them.
|
||||
- [x] **Shadow-comparison detail shot**: `review-05-shadow-compare`, both cubes in one frame from a low angle; the floating cube's shadow is detached, the grounded one's touches.
|
||||
- [ ] **Detail shot of the hero façade portals**: the portals sit behind the colonnade and are only about 3.4 m tall against a 14.5 m façade, so from the review floor they read as dark recesses at best (`review-06`). Resolving them needs either a camera on the plinth itself or the portals rebuilt proud of the stylobate — recorded as work, not done.
|
||||
- [x] **Detail shot of the hero façade portals**: `review-06-hero-portals` from 8 m at eye height now fills the frame with all three doorways. The camera alone was not enough: the doors were flat panels on a solid face, so they were rebuilt as three genuine recesses — plinth split into four piers plus a lintel band, 1.2 m reveal, stone jambs and lintels standing 0.10 m proud, three mullions each. Facade bounds are now exactly Z 0..14.50 m; a jamb overhang had been sinking the model 0.15 m into the ground.
|
||||
- [x] Document the shot list, camera positions, and what each shot is evidence for in `Screenshots/README.md`; nine shots, each with an approval line.
|
||||
- [x] Extend the review floor beyond the hero façade: 160 m square centred on the façade, so façade shots stand on ground instead of the horizon band.
|
||||
- [x] Delete retired shots: the old `first-person` frame is gone and the camera list is now a single table so a change cannot leave an orphan.
|
||||
|
||||
@@ -75,11 +75,13 @@ Low camera, knee height, close on the mannequin's feet. A floating or sinking ch
|
||||
|
||||
Low angle, both cubes side by side with the character between them. The detached shadow of the floating cube against the grounded one.
|
||||
|
||||
## review-06-hero-portals.png — Hero façade, whole elevation, approval: ☐ pending
|
||||
## review-06-hero-portals.png — Hero façade portals, approval: ☐ pending
|
||||
|
||||

|
||||

|
||||
|
||||
Straight-on from eye height 25 m out. Six columns, plinth, entablature, parapet; the three portals sit behind the colonnade at this distance.
|
||||
New: generated 2026-11-07 after the portals were rebuilt. Eye height at 8 m, filling the frame with the three doorways, their flights, and the plinth. The doors are now genuine 1.2 m recesses cut through four plinth piers, with stone jambs and lintels standing proud and three mullions in each opening.
|
||||
|
||||
What this shot is evidence for: that the entrance is three separate openings with individual flights (not the inherited "eight steps, 12 m wide"), and that the facade stands on Z 0 rather than sinking into the ground.
|
||||
|
||||
## review-07-hero-facade-front.png — Hero façade, north sidewalk, approval: ☐ pending
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+54
-14
@@ -122,8 +122,7 @@ def build():
|
||||
|
||||
# --- stylobate and steps ----------------------------------------------
|
||||
# A plinth from the pavement to the pedestal shelf, with three door flights.
|
||||
cube("Hero_Stylobate", 0.0, -1.2, PEDESTAL_H / 2.0, FRONTAGE_W, 2.4, PEDESTAL_H, stone)
|
||||
note("Hero_Stylobate", (FRONTAGE_W, 2.4, PEDESTAL_H), "assumption: pedestal height")
|
||||
# The stylobate is built later as piers around the three door openings.
|
||||
|
||||
# --- Ionic colonnade ---------------------------------------------------
|
||||
col_xs = []
|
||||
@@ -171,24 +170,65 @@ def build():
|
||||
note("Hero_Medallion_x2", (1.1, 1.1, 0.02), "photographs: two stone discs beside the motto")
|
||||
|
||||
# --- entrances ---------------------------------------------------------
|
||||
# Three portals between column pairs, each with its own short flight.
|
||||
# Three portals between column pairs, each with its own short flight. The
|
||||
# doorway is cut INTO the stylobate face rather than laid on it: the plinth is
|
||||
# modelled as three segments so the opening is a real recess, and the portals
|
||||
# stand proud of the wall behind the colonnade so they read from the street.
|
||||
portal_xs = (-COLUMN_BAY, 0.0, COLUMN_BAY)
|
||||
plinth_front = -2.4 # front face of the plinth, in the facade frame
|
||||
plinth_back = 0.0
|
||||
gap = PORTAL_W
|
||||
# The plinth is four piers between and beside the openings, plus a band over
|
||||
# them, so each door is a real recess instead of a panel on a solid face.
|
||||
piers = [
|
||||
(-(FRONTAGE_W / 2.0), portal_xs[0] - gap / 2.0),
|
||||
(portal_xs[0] + gap / 2.0, portal_xs[1] - gap / 2.0),
|
||||
(portal_xs[1] + gap / 2.0, portal_xs[2] - gap / 2.0),
|
||||
(portal_xs[2] + gap / 2.0, (FRONTAGE_W / 2.0)),
|
||||
]
|
||||
for pi, (x0, x1) in enumerate(piers, start=1):
|
||||
cube(f"Hero_Stylobate_{pi}", (x0 + x1) / 2.0, -1.2, PEDESTAL_H / 2.0,
|
||||
x1 - x0, 2.4, PEDESTAL_H, stone)
|
||||
# Band above the openings, closing the plinth to full height between the doors.
|
||||
cube("Hero_Stylobate_LintelBand", 0.0, -1.2, PORTAL_H + (PEDESTAL_H - PORTAL_H) / 2.0,
|
||||
(portal_xs[-1] + gap / 2.0) - (portal_xs[0] - gap / 2.0), 2.4,
|
||||
PEDESTAL_H - PORTAL_H, stone)
|
||||
note("Hero_Stylobate", (FRONTAGE_W, 2.4, PEDESTAL_H),
|
||||
"assumption: pedestal height; four piers and a lintel band leave three recesses")
|
||||
|
||||
for i, x in enumerate(portal_xs, start=1):
|
||||
# Recessed doorway: a dark panel set into the stylobate face.
|
||||
cube(f"Hero_Portal_{i}", x, -2.35, PORTAL_H / 2.0,
|
||||
PORTAL_W, 0.10, PORTAL_H, glass)
|
||||
# Door grille above the steps, using the banner red for the sign panel.
|
||||
cube(f"Hero_PortalSign_{i}", x, -2.42, PORTAL_H + 0.55,
|
||||
# Recessed doorway: a dark reveal set back inside the plinth, 1.2 m deep so
|
||||
# it reads as an opening from any angle.
|
||||
depth = 1.2
|
||||
cube(f"Hero_Portal_{i}", x, plinth_front + depth / 2.0 + 0.05, PORTAL_H / 2.0,
|
||||
PORTAL_W, depth, PORTAL_H, glass)
|
||||
# Stone surround, standing 0.1 m proud of the plinth face.
|
||||
for side, sx in (("L", -1.0), ("R", 1.0)):
|
||||
# Jambs stop at the pavement: a 0.15 m overhang below Z 0 would sink the
|
||||
# whole facade into the ground plane.
|
||||
cube(f"Hero_PortalJamb_{i}{side}", x + sx * (PORTAL_W / 2.0 + 0.15),
|
||||
plinth_front - 0.10, (PORTAL_H + 0.3) / 2.0, 0.3, 0.2, PORTAL_H + 0.3, stone)
|
||||
cube(f"Hero_PortalLintel_{i}", x, plinth_front - 0.10, PORTAL_H + 0.15,
|
||||
PORTAL_W + 0.6, 0.2, 0.3, stone)
|
||||
# Door grille: mullions across the opening, dark metal read at distance.
|
||||
for m in range(1, 4):
|
||||
cube(f"Hero_PortalMullion_{i}_{m}", x - PORTAL_W / 2.0 + m * PORTAL_W / 4.0,
|
||||
plinth_front + 0.12, PORTAL_H / 2.0, 0.09, 0.06, PORTAL_H, stone_dark)
|
||||
# Sign panel over the doorway, as the photographs show.
|
||||
cube(f"Hero_PortalSign_{i}", x, plinth_front - 0.16, PORTAL_H + 0.75,
|
||||
0.7, 0.06, 0.9, banner)
|
||||
# Photographs show four to five risers per portal; the count follows the
|
||||
# pedestal height rather than inheriting the old "eight steps" claim.
|
||||
steps = max(3, min(5, int(round((PEDESTAL_H - 0.2) / STEP_RISE))))
|
||||
for s in range(steps):
|
||||
top = PEDESTAL_H - s * STEP_RISE
|
||||
cube(f"Hero_Step_{i}_{s + 1}", x,
|
||||
-2.4 - 0.14 - s * STEP_TREAD - STEP_TREAD / 2.0,
|
||||
top - STEP_RISE / 2.0,
|
||||
STEP_WIDTH, STEP_TREAD, STEP_RISE, stone)
|
||||
# Steps descend from the plinth to the pavement; the lowest tread must land
|
||||
# exactly on Z 0, never below it, so the flight meets the ground plane.
|
||||
steps = max(3, min(steps, int(round(PEDESTAL_H / STEP_RISE))))
|
||||
for st in range(steps):
|
||||
top = PEDESTAL_H - st * STEP_RISE
|
||||
height = top if st == steps - 1 else STEP_RISE
|
||||
cube(f"Hero_Step_{i}_{st + 1}", x,
|
||||
plinth_front - 0.14 - st * STEP_TREAD - STEP_TREAD / 2.0 + 0.28,
|
||||
top - height / 2.0, STEP_WIDTH, STEP_TREAD, height, stone)
|
||||
note(f"Hero_PortalFlight_{i}", (PORTAL_W, STEP_TREAD * steps, PEDESTAL_H - 0.2),
|
||||
f"{steps} steps at {STEP_RISE:.2f} m rise / {STEP_TREAD:.2f} m tread "
|
||||
f"(assumption; photos show 4-5, the old notes said 8)")
|
||||
|
||||
@@ -172,7 +172,11 @@ try:
|
||||
# targets the portal sill rather than the centre of the elevation.
|
||||
# Standing 25 m out at eye height frames the whole elevation, which is what
|
||||
# the portal detail needs: the portals are small against a 14.5 m façade.
|
||||
("hero-portals", unreal.Vector(hero_x + 150, -4000, 170), unreal.Vector(hero_x + 150, hero_y, 420)),
|
||||
# On the pavement in front of the flight: a pedestrian's own eye line, the
|
||||
# angle the photographs that established the portals were taken from.
|
||||
# eye height at 8 m: fills the frame with the three doorways, the flights and
|
||||
# the plinth, which is what "portal detail" means here.
|
||||
("hero-portals", unreal.Vector(hero_x + 100, -2250, 170), unreal.Vector(hero_x + 100, hero_y, 230)),
|
||||
# straight on from the north sidewalk; the building body spans Y -1443..+250
|
||||
("hero-facade-front", unreal.Vector(hero_x + 200, -3200, 420), unreal.Vector(hero_x, hero_y + 400, 760)),
|
||||
# oblique from the north-west, reading the colonnade in depth
|
||||
|
||||
Reference in new issue
Block a user