feat(hero): first pass from the masonic-temple reference folder
Art/reference/hero-masonic/ (15 images, git-ignored) replaces the single Wikimedia photo as the source of truth. Two front elevations drive this pass: 02-masonictemple01.jpg, a clean street-level frontal, and 06-el-capitan-theater-frontal-fachade.jpg; 05-hollywoodmasonictemple-1922.jpg records the original masonry. Changes: - the blank Hero_Stylobate_LintelBand across the portals is removed - the reference has open doorways with steps, and they now read as three dark openings with banners above them; - rustication(): five ashlar courses from the pavement to the portal heads, 4 cm joints proud of the wall; - balustrade(): bottom rail, top rail and 38 balusters along the roof edge, where the reference shows a cresting and railing. Still missing against the same references, and recorded: warm sandstone instead of flat pale stone, lattice grilles in the window bays, the carved inscription, and medallions that do not read at distance. The blend is read-only after a checkout - chmod u+w first or the save fails silently and the FBX is never written, which happened once here. Rows 4-6 re-rendered and pending review.
This commit is contained in:
1 parent
7b9a7a3867
commit
03ef4dc945
112 files changed
+191
-142
No files matched your search
@@ -294,9 +294,9 @@ def build():
|
||||
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)
|
||||
# The reference has no blank band across the portals - the openings run up to the entablature
|
||||
# with the banners hanging in front of them - so this filler is gone. What stays is the thin
|
||||
# lintel over each doorway, modelled with the portals.
|
||||
note("Hero_Stylobate", (FRONTAGE_W, 2.4, PEDESTAL_H),
|
||||
"assumption: pedestal height; four piers and a lintel band leave three recesses")
|
||||
|
||||
@@ -358,6 +358,13 @@ def build():
|
||||
cube(f"Hero_Window_{rank}_{i}", wx, WINDOW_Y, z, 2.0, 0.08, 1.9, glass)
|
||||
note("Hero_Window_x10", (2.0, 0.08, 1.9), "photographs: window bands behind the colonnade")
|
||||
|
||||
# --- rustication and roof cresting --------------------------------------
|
||||
# The photographs show the ground storey in banded ashlar and a cresting with balusters along
|
||||
# the roof edge; without them the elevation reads as a flat card.
|
||||
# Courses run from the pavement to the portal heads, as the street-level photograph shows.
|
||||
rustication(FRONTAGE_W, PORTAL_H, stone_dark)
|
||||
balustrade(FRONTAGE_W, HEIGHT - PARAPET_H * 0.15, stone)
|
||||
|
||||
# --- seat the applied detail on the wall ---------------------------------
|
||||
# Depth is a property of the façade, not of each call site: state it once here. Parts whose
|
||||
# front face is behind the wall plane are moved until it sits at FRONT_Y + offset.
|
||||
@@ -372,6 +379,35 @@ def build():
|
||||
return parts, lines
|
||||
|
||||
|
||||
def rustication(width_m, height_m, material, course_m=0.55, joints=0):
|
||||
"""Horizontal ashlar joints cut across the ground storey.
|
||||
|
||||
A real façade reads as stone because of the shadow in its joints, not because of its colour.
|
||||
Grooves are 3 cm deep and 4 cm tall, spaced `course_m`, and sit just proud of the wall so they
|
||||
catch the light the way the photographs show.
|
||||
"""
|
||||
z = course_m
|
||||
count = 0
|
||||
while z < height_m - 0.2:
|
||||
cube(f"Hero_Course_{count:02d}", 0.0, FRONT_Y + 0.015, z,
|
||||
width_m - 1.5, 0.04, 0.04, material)
|
||||
count += 1
|
||||
z += course_m
|
||||
print(f"[hero] rustication: {count} courses at {course_m:.2f} m")
|
||||
|
||||
|
||||
def balustrade(width_m, z, material, spacing_m=0.62):
|
||||
"""A row of balusters with a bottom and top rail along the roof edge."""
|
||||
half = width_m / 2.0 - 0.9
|
||||
count = int((2 * half) / spacing_m)
|
||||
cube("Hero_BalustradeRailBottom", 0.0, FRONT_Y - 0.05, z - 0.06, 2 * half, 0.14, 0.10, material)
|
||||
cube("Hero_BalustradeRailTop", 0.0, FRONT_Y - 0.05, z + 0.42, 2 * half, 0.16, 0.10, material)
|
||||
for i in range(count):
|
||||
x = -half + i * spacing_m + spacing_m / 2.0
|
||||
cube(f"Hero_Baluster_{i:02d}", x, FRONT_Y - 0.05, z + 0.18, 0.12, 0.12, 0.40, material)
|
||||
print(f"[hero] balustrade: {count} balusters")
|
||||
|
||||
|
||||
def seat_on_front(table):
|
||||
"""Move each named part so its street-facing face sits `offset` metres proud of FRONT_Y.
|
||||
|
||||
|
||||
Reference in new issue
Block a user