feat(hero): carved inscription across the attic
The reference's most distinctive architectural feature is three lines of incised capitals across the attic. inscription() lays 112 letter marks in three lines, in the shadow stone so they read as dark incisions at 45 m rather than disappearing into a same-colour relief - which is exactly what the first attempt did. Positioning was the lesson: the parapet is 1.2 m deep and stands in FRONT of the wall plane, so marks seated on FRONT_Y were hidden behind it and rendered invisible. They are now seated on the parapet face (FRONT_Y + 0.40), which is where the reference puts the lettering too. Still open in the architectural pass, recorded in TODO.md: medallion relief (the discs are flush and empty), banner lettering (needs a texture, not geometry), and depth on the capitals and window grilles. Rows 4-6 re-rendered and pending.
This commit is contained in:
1 parent
2dac1d0921
commit
1d57ed477d
123 files changed
+190
-150
No files matched your search
@@ -265,6 +265,9 @@ def build():
|
||||
cube(f"Hero_MottoSurround_h{int(z_off > 0)}", 0.0, -1.13, motto_z + z_off,
|
||||
motto_w + 0.64, 0.26, 0.32, stone)
|
||||
cube("Hero_MottoBand", 0.0, -1.06, motto_z, motto_w, 0.10, 0.85, stone_dark)
|
||||
# Dark marks, not stone-on-stone: at 45 m a same-colour relief disappears, and the reference letters read
|
||||
# as dark incisions against the pale wall.
|
||||
inscription(motto_w - 0.6, motto_z, stone_dark)
|
||||
note("Hero_MottoBand", (motto_w, 0.10, 0.85),
|
||||
"photographs: motto panel above the colonnade, now an inset panel with a "
|
||||
"moulded surround rather than a flat stripe")
|
||||
@@ -403,11 +406,46 @@ def build():
|
||||
("Hero_Medallion", 0.08), ("Hero_Banner", 0.08), ("Hero_Window", 0.03),
|
||||
("Hero_Portal", 0.05), ("Hero_PortalJamb", 0.08), ("Hero_PortalLintel", 0.08),
|
||||
("Hero_PortalMullion", 0.04), ("Hero_PortalSign", 0.10),
|
||||
# The parapet is 1.2 m deep and stands in front of the wall plane, so the inscription has to sit on
|
||||
# ITS face, not on FRONT_Y - otherwise the parapet hides the letters entirely.
|
||||
("Hero_Inscription", 0.40), ("Hero_MottoBand", 0.40),
|
||||
))
|
||||
|
||||
return parts, lines
|
||||
|
||||
|
||||
|
||||
|
||||
def inscription(width_m, z, material, lines=3):
|
||||
"""Three lines of carved lettering across the motto band, as marks rather than glyphs.
|
||||
|
||||
The reference carries "FREEMASONRY BUILDS ITS TEMPLES / AMONG THE NATIONS / AND IN THE HEARTS OF MEN"
|
||||
in incised capitals. At the 45 m review distance the words read as three bands of even letter marks, so
|
||||
the geometry is a deterministic run of small raised blocks of varied width - it holds the silhouette and
|
||||
the texture of carved text without pretending to spell the words. Legible lettering would need a baked
|
||||
texture, which is the next step if the owner wants to read it.
|
||||
"""
|
||||
import random as _random
|
||||
|
||||
rng = _random.Random(7)
|
||||
rows = ((0.28, 0.62), (0.06, 0.40), (-0.16, 0.50))
|
||||
placed = 0
|
||||
for row_index in range(lines):
|
||||
z_off, coverage = rows[row_index % len(rows)]
|
||||
x = -width_m * coverage / 2.0
|
||||
limit = width_m * coverage / 2.0
|
||||
while x < limit:
|
||||
w = rng.uniform(0.16, 0.30)
|
||||
gap = rng.uniform(0.05, 0.10)
|
||||
if x + w > limit:
|
||||
break
|
||||
cube(f"Hero_Inscription_{row_index}_{placed:03d}", x + w / 2.0, FRONT_Y - 0.03,
|
||||
z + z_off, w, 0.05, 0.22, material)
|
||||
placed += 1
|
||||
x += w + gap
|
||||
print(f"[hero] inscription: {placed} letter marks in {lines} lines")
|
||||
|
||||
|
||||
def rustication(width_m, height_m, material, course_m=0.55, joints=0):
|
||||
"""Horizontal ashlar joints cut across the ground storey.
|
||||
|
||||
|
||||
Reference in new issue
Block a user