Skip to content

Commit d191ee8

Browse files
TMHSDigitalclaude
andcommitted
fix(showcase): frame the watchtower close and low, level it, weather its roof
The tower sat small in the frame (it was tilted 2 degrees about X, which the showcase level-on-the-stage rule forbids). It now turns about Z only, and the camera moves in and down so the tower fills the frame vertically (fill y 0.856). The shake roof goes from flat grey to weathered cedar brown with silvered wear. Geometry and budgets are unchanged. Evidence (live, local .scratch binaries): - Blender 5.2.1 LTS and 4.5.11 LTS: default exit 0; --skip-decimate 9, --stray-vert 15, --lift-z 16, --short-shoes 16, --short-rails 17, --open-sides 17, --short-joists 17, --float-band 18, --rake-posts 19. - --output passes framing on both (fill y 0.856, margins >= 0.072). - Contact sheet: luma 0.174 / stage 0.182 / warmth +0.129 / sat 0.161. - Asset sheet: comparable to the well and wheelbarrow; passes. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent 731c5a3 commit d191ee8

8 files changed

Lines changed: 16 additions & 11 deletions

File tree

‎README.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,18 +112,18 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
112112
<a href="showcase/shipping-crate/"><img src="showcase/shipping-crate/preview.webp" width="24%" alt="Shipping crate: a wooden slat crate stencilled PORT ROYAL and NO 17, with iron corner brackets and an end handle, on a dark studio floor, warm wedge on the back wall" /></a>
113113
<a href="showcase/stone-well/"><img src="showcase/stone-well/preview.webp" width="24%" alt="Stone well: a round well of varied grey stones with a grained wooden pyramid roof on posts, rope and a bucket on rusted iron hoops, on a dark studio floor" /></a>
114114
<a href="showcase/wooden-barrel/"><img src="showcase/wooden-barrel/preview.webp" width="24%" alt="Wooden barrel: a 20-stave wine-cask with a head of four boards, chord-lofted iron hoops, and a bung on a dark studio floor" /></a>
115-
<a href="showcase/campfire/"><img src="showcase/campfire/preview.webp" width="24%" alt="Campfire: a two-course ring of rounded fieldstones around a tripod of logs and glowing ash on a dark studio floor, warm wedge on the back wall" /></a>
115+
<a href="showcase/campfire/"><img src="showcase/campfire/preview.webp" width="24%" alt="Campfire: a two-course ring of warm, soot-dark fieldstones around a tripod of charring logs over ember-cracked coals on a dark studio floor, warm wedge on the back wall" /></a>
116116
<a href="showcase/market-stall/"><img src="showcase/market-stall/preview.webp" width="24%" alt="Market stall: a grained timber frame with post feet, diagonal side braces, slatted counter, rafters, and a striped canvas awning on a dark studio floor, warm wedge on the back wall" /></a>
117117
<a href="showcase/street-lantern/"><img src="showcase/street-lantern/preview.webp" width="24%" alt="Street lantern: an iron post with aged brass collars, a knee brace tenoned into post and arm, and a lit muntined amber cage glowing onto the post on a dark studio floor" /></a>
118118
<a href="showcase/treasure-chest/"><img src="showcase/treasure-chest/preview.webp" width="24%" alt="Treasure chest: a slatted wooden chest with iron bands, corner brackets, and an open lid on a dark studio floor" /></a>
119119
<a href="showcase/terrain-scatter/"><img src="showcase/terrain-scatter/preview.webp" width="24%" alt="Terrain scatter: a Geometry Nodes hill tile of patchy grass over dark earth, nine faceted stones sunk into it among grass tufts and pebbles, on a dark studio floor" /></a>
120120
<a href="showcase/fence-kit/"><img src="showcase/fence-kit/preview.webp" width="24%" alt="Fence kit: a run of three weathered post-and-rail sections on a packed-earth strip, joined post to post at the 1.60 m tile pitch, with pyramidal caps, diagonal board braces, and iron bands" /></a>
121-
<a href="showcase/watchtower/"><img src="showcase/watchtower/preview.webp" width="24%" alt="Watchtower: a grained timber lookout with X-braces, hatch ladder, a plank platform on deck girts, and a coursed shake roof on a dark studio floor" /></a>
121+
<a href="showcase/watchtower/"><img src="showcase/watchtower/preview.webp" width="24%" alt="Watchtower: a grained timber lookout seen from low and close, with X-braces, hatch ladder, a plank platform on deck girts, and a weathered cedar shake roof on a dark studio floor" /></a>
122122
<a href="showcase/cart/"><img src="showcase/cart/preview.webp" width="24%" alt="Cart: a two-wheel wooden cart with spoked wheels, slatted bed, and shafts on a dark studio floor" /></a>
123123
<a href="showcase/park-bench/"><img src="showcase/park-bench/preview.webp" width="24%" alt="Park bench: a wrought-iron bench whose round-bar legs curl into scrolled feet, with wooden slats and a reclined back, on a dark studio floor" /></a>
124124
<a href="showcase/wheelbarrow/"><img src="showcase/wheelbarrow/preview.webp" width="24%" alt="Wheelbarrow: a wooden tray with walls of stacked boards and iron straps, a spoked wheel, rear legs, and handles on a dark studio floor" /></a>
125125
<a href="showcase/anvil/"><img src="showcase/anvil/preview.webp" width="24%" alt="Anvil: a forged-steel London-pattern anvil with a hammer-polished face on a hooped timber stump, a hammer at its foot" /></a>
126-
<a href="showcase/water-trough/"><img src="showcase/water-trough/preview.webp" width="24%" alt="Water trough: a watertight wooden trough with plank ends, contained water, and trestle legs on a dark studio floor" /></a>
126+
<a href="showcase/water-trough/"><img src="showcase/water-trough/preview.webp" width="24%" alt="Water trough: a watertight wooden trough with plank ends, rippled water, rust-streaked iron straps and trestle legs on a dark studio floor" /></a>
127127
<a href="showcase/hitching-post/"><img src="showcase/hitching-post/preview.webp" width="24%" alt="Hitching post: a square timber post with a pyramidal cap, cross-arm, iron bands wrapped around it, two hitching rings and a nailed horseshoe on a dark studio floor" /></a>
128128
<a href="showcase/grindstone/"><img src="showcase/grindstone/preview.webp" width="24%" alt="Grindstone: a stone wheel on a timber A-frame with an iron axle, hubs, crank, and tray on a dark studio floor" /></a>
129129
<a href="showcase/hand-pump/"><img src="showcase/hand-pump/preview.webp" width="24%" alt="Hand pump: a green-enamelled cast-iron village pump on a stepped wooden plinth with a spout and handle on a dark studio floor" /></a>
56.1 KB
Loading
-668 Bytes
Loading
2.22 KB
Loading

‎showcase/gallery.json‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
"name": "campfire",
5050
"dir": "showcase/campfire",
5151
"teaches": "A procedural campfire through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
52-
"alt": "A campfire of crossed logs in a teepee, embers in the ash, inside a two-course ring of rounded grey fieldstones.",
52+
"alt": "A campfire of crossed logs in a teepee, the sticks charring toward the flames and the floor logs glowing through ember cracks, inside a two-course ring of warm fieldstones.",
5353
"witnessesFix": "Recomputed: 2760 tris, three materials with 216 wood, 48 ash and 1416 stone faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.802×0.802×0.404 m, LOD ratios in band, convex collider 162 tris, hygiene 0, 14 grounded bottom stones, teepee kiss 0.00034 m, course seat 0, stone variation 0.01269 m, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-stones 16; --float-logs 17; --gap-courses 18; --uniform-stones 20.",
5454
"hero": "docs/gallery/assets/campfire-hero.webp",
5555
"preview": "showcase/campfire/preview.webp",
@@ -128,7 +128,7 @@
128128
"name": "watchtower",
129129
"dir": "showcase/watchtower",
130130
"teaches": "A procedural timber watchtower through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
131-
"alt": "A grained timber watchtower on braced legs with a ladder, a railed platform on deck girts, rusted iron collars and a shingled pyramid roof.",
131+
"alt": "A grained timber watchtower on braced legs, seen from low and close, with a ladder, a railed platform on deck girts, rusted iron collars and a weathered cedar shake roof.",
132132
"witnessesFix": "Recomputed: 6840 tris, three materials with 300 metal and 126 roof faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.594×1.594×2.973 m, grounded zmin, 4 iron shoes, rail engage 18 mm, all four side rails tenoned at both ends, both joists bearing 31 mm into deck girts, collar standoff 2 mm, post plumb 0, LOD ratios in band (5.2 COLLAPSE leaner on LOD2), convex collider 150 tris, non-empty glTF. Hygiene all zero. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-shoes 16; --short-rails/--open-sides/--short-joists 17; --float-band 18; --rake-posts 19.",
133133
"hero": "docs/gallery/assets/watchtower-hero.webp",
134134
"preview": "showcase/watchtower/preview.webp",
@@ -195,7 +195,7 @@
195195
"name": "water-trough",
196196
"dir": "showcase/water-trough",
197197
"teaches": "A procedural watertight water trough through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
198-
"alt": "A staved wooden water trough with half-round ends built of three boards, on crossed trestle legs, half full of dark water.",
198+
"alt": "A staved wooden water trough with half-round ends built of three boards, on crossed trestle legs, half full of rippled dark water mirroring its staves.",
199199
"witnessesFix": "Recomputed: 3316 tris, three materials with 1482 wood, 156 metal and 29 water faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.093x0.552x0.5055 m, zmin 0, four shoes planted, each end three lapped boards, end rim span 21 mm, strap BVH gap 0, water-hull gap 2.6 mm, water contained on 66 of 66 rays, hull 1.045x0.466 m, LOD ratios in band, convex collider 68 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-legs 16; --box-ends 17; --float-strap/--open-ends 18; --narrow-hull 19; --slab-ends 20.",
200200
"hero": "docs/gallery/assets/water-trough-hero.webp",
201201
"preview": "showcase/water-trough/preview.webp",

‎showcase/watchtower/README.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,3 +149,7 @@ hygiene and joint-fit family.
149149
| 17 | Joint fit: rail-to-post engage, side-rail engage, or deck bearing |
150150
| 18 | Seat: girt-collar standoff |
151151
| 19 | Post plumb or plan off the stated real-world size |
152+
153+
## Hero
154+
155+
The still used to tilt the tower 2° about X, which the showcase rule "level on the stage" forbids (it sinks one row of shoes and lifts the other); it now turns about Z only. The camera moved in and down (fill y 0.856, was ~0.77) so the tower reads as tall rather than lost in the frame, and the shake roof went from flat grey to weathered cedar brown with silvered wear. Geometry and budgets are unchanged.

‎showcase/watchtower/preview.webp‎

-890 Bytes
Loading

‎showcase/watchtower/watchtower.py‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -824,8 +824,8 @@ def tower_materials():
824824
"""
825825
wood = wood_material("TowerWood")
826826
roof = principled(
827-
"TowerShake", (0.26, 0.24, 0.21, 1.0), 0.0, 0.82,
828-
noise_scale=14.0, wear=(0.16, 0.15, 0.13, 1.0),
827+
"TowerShake", (0.15, 0.105, 0.07, 1.0), 0.0, 0.78,
828+
noise_scale=14.0, wear=(0.20, 0.19, 0.175, 1.0),
829829
)
830830
metal = principled(
831831
"TowerIron", (0.17, 0.165, 0.155, 1.0), 0.80, 0.46,
@@ -1502,8 +1502,9 @@ def render_still(low, wood, tex, path, engine):
15021502
ob.hide_render = True
15031503
ob.hide_viewport = True
15041504

1505+
# turned about Z only: any tilt about X sinks one row of shoes into the
1506+
# floor and lifts the other (showcase README, level on the stage)
15051507
low.rotation_euler.z = math.radians(-28.0)
1506-
low.rotation_euler.x = math.radians(2.0)
15071508

15081509
floor_me = bpy.data.meshes.new("Floor")
15091510
bm = bmesh.new()
@@ -1551,13 +1552,13 @@ def light(name, loc, energy, size, col, rot):
15511552
cam_data = bpy.data.cameras.new("Cam")
15521553
cam_data.lens = 50.0
15531554
cam = bpy.data.objects.new("Cam", cam_data)
1554-
cam.location = (span * 1.98, -span * 2.75, span * 1.13)
1555+
cam.location = (span * 1.78, -span * 2.50, span * 0.85)
15551556
scene.collection.objects.link(cam)
15561557
aim = bpy.data.objects.new("Aim", None)
15571558
aim.location = (
15581559
0.5 * (bb[0] + bb[3]),
15591560
0.5 * (bb[1] + bb[4]),
1560-
0.42 * (bb[2] + bb[5]),
1561+
0.47 * (bb[2] + bb[5]),
15611562
)
15621563
scene.collection.objects.link(aim)
15631564
con = cam.constraints.new("TRACK_TO")

0 commit comments

Comments
 (0)