Scale Lucent ray florets to Citadel arms
This commit is contained in:
parent
30a188c8a5
commit
774b5851de
10 changed files with 26 additions and 21 deletions
|
|
@ -155,16 +155,17 @@ else:
|
|||
**Sunflower Utility Crest**
|
||||
|
||||
The city disk is the disk-floret region. The external crest is the ray-floret
|
||||
region: alternating solar panels and radiators, Perlin-warped and anchored
|
||||
around the flat dome base, radiating sunward outside the glass rather than
|
||||
inside the city volume.
|
||||
region: alternating solar panels and radiators, Perlin-warped and hinged around
|
||||
the flat dome base. These are Citadel-scale arms, large enough that a defensive
|
||||
folded posture can reach toward the far media-eye end of the tether and dwarf
|
||||
the dome itself.
|
||||
|
||||
```python
|
||||
for petal in range(34):
|
||||
center_a = TAU * petal / petals + 0.025 * pymath.sin(petal * 1.7)
|
||||
target_verts = solar_verts if petal % 2 == 0 else radiator_verts
|
||||
radius = 1.57 + outward_reach * smoothstep(t)
|
||||
x = CITY_GROUND_X - 0.035 - sunward_cant * smoothstep(t)
|
||||
x = CITY_GROUND_X + arm_length * smoothstep(t)
|
||||
```
|
||||
|
||||
**Shader Graphs Are Geometry Evidence Too**
|
||||
|
|
|
|||
|
|
@ -266,14 +266,14 @@ def add_yz_disk(name, x, radius, material, segments=96):
|
|||
def add_dome_base_crest(mats):
|
||||
solar_verts, solar_faces = [], []
|
||||
radiator_verts, radiator_faces = [], []
|
||||
petals = 34
|
||||
radial_steps = 5
|
||||
petals = 18
|
||||
radial_steps = 8
|
||||
for petal in range(petals):
|
||||
center_a = TAU * petal / petals + 0.025 * pymath.sin(petal * 1.7)
|
||||
width = TAU / petals * (0.82 + 0.36 * hash01(petal, 0, 251))
|
||||
outward_reach = 0.48 + 0.38 * fbm_2d(pymath.cos(center_a) * 2.1, pymath.sin(center_a) * 2.1, seed=177)
|
||||
sunward_cant = 0.18 + 0.12 * hash01(petal, 9, 277)
|
||||
twist = 0.08 * (hash01(petal, 4, 271) - 0.5)
|
||||
width = TAU / petals * (0.72 + 0.24 * hash01(petal, 0, 251))
|
||||
outward_reach = 0.8 + 0.42 * fbm_2d(pymath.cos(center_a) * 2.1, pymath.sin(center_a) * 2.1, seed=177)
|
||||
arm_length = (TETHER_END[0] - CITY_GROUND_X) * (0.88 + 0.08 * hash01(petal, 12, 277))
|
||||
twist = 0.18 * (hash01(petal, 4, 271) - 0.5)
|
||||
target_verts = solar_verts if petal % 2 == 0 else radiator_verts
|
||||
target_faces = solar_faces if petal % 2 == 0 else radiator_faces
|
||||
petal_base = len(target_verts)
|
||||
|
|
@ -284,10 +284,11 @@ def add_dome_base_crest(mats):
|
|||
noise = fbm_2d(petal * 0.41, step * 0.73 + side, seed=303) - 0.5
|
||||
local_width = width * (1.0 - 0.42 * smoothstep(t)) * edge + noise * 0.018
|
||||
a = center_a + side * local_width * 0.5 + twist * t
|
||||
radius = 1.57 + outward_reach * smoothstep(t) + 0.04 * noise
|
||||
# Outside means sunward/outboard of the flattened dome base:
|
||||
# negative X from the city ground plane, not inside the glass.
|
||||
x = CITY_GROUND_X - 0.035 - sunward_cant * smoothstep(t)
|
||||
radius = 1.62 + outward_reach * smoothstep(t) + 0.05 * noise
|
||||
# External defensive arms stow by folding along the tether
|
||||
# toward the far media-eye end; deployed they read as Citadel
|
||||
# scale ray florets rather than petals glued to the dome.
|
||||
x = CITY_GROUND_X + arm_length * smoothstep(t)
|
||||
y = radius * pymath.cos(a)
|
||||
z = radius * pymath.sin(a)
|
||||
target_verts.append((x, y, z))
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 767 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.3 MiB |
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 993 KiB After Width: | Height: | Size: 1.2 MiB |
|
|
@ -50,7 +50,7 @@ From-scratch story-bound builds:
|
|||
attachment, an orthogonal spin-gravity city plane, a flat-cut dome base,
|
||||
radial/tangential streets, irregular parcels, prestige anchor towers, parks,
|
||||
faux-rural edge falloff, and an exterior sunflower-like crest of alternating
|
||||
solar panels/radiators.
|
||||
Citadel-scale solar panels/radiators.
|
||||
Build notes: `docs/research/builds/lucent-tether-habitat.md`; verifier:
|
||||
`tools/verify_lucent_tether_habitat.py`.
|
||||
|
||||
|
|
|
|||
|
|
@ -47,3 +47,4 @@
|
|||
{"ts": "2026-05-05T02:20:23+00:00", "type": "implementation", "status": "accepted", "note": "Replaced Lucent city-bubble grid with street-generation-inspired radial/tangential field roads, irregular annular parcel cells, anchor-plaza prestige skyscrapers, park voids, midcity blocks, and faux-rural cottagecore edge falloff; tether now visibly descends to the city ground-surface plaza."}
|
||||
{"ts": "2026-05-05T03:01:59+00:00", "type": "implementation", "status": "accepted", "note": "Corrected Lucent dome city coordinate frame: ground is now a YZ disk orthogonal to the tether/spin axis, buildings extrude along +X, dome is boolean-cut flat at the base, city fills to the rim, and a Perlin-edged sunflower ray-floret crest rises from the base partway up the dome."}
|
||||
{"ts": "2026-05-05T03:16:04+00:00", "type": "implementation", "status": "accepted", "note": "Moved Lucent sunflower ray florets outside the dome: alternating solar panel and radiator meshes now radiate sunward from the flat base rim, with verifier checks that their geometry remains outside the dome cut."}
|
||||
{"ts": "2026-05-05T03:31:22+00:00", "type": "implementation", "status": "accepted", "note": "Scaled Lucent external ray florets to Citadel-like utility arms: alternating solar/radiator panels now dwarf the dome and span far along the tether, so a folded defensive posture can plausibly reach toward the media-eye end."}
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ data_flow:
|
|||
- If state grows faster than understanding, cut it back.
|
||||
|
||||
current_status:
|
||||
summary: VibeGeometry has verified Geometry Script translations for local samples, official Blender demos, and IRCSS French Houses footholds, plus from-scratch Aetheria Bloom and Lucent tether habitat builds. Durable lessons now driving the pipeline: Python orchestrates intent and batching; Geometry Script emits inspectable node groups; source-bound scenes need explicit coordinate contracts before ornament; spin-gravity habitats need ground planes orthogonal to their tether/rotation axis; utility petals, radiators, and solar arrays belong outside pressure glass; large habitat parts need visible load paths across coordinate frames; organic city maps need street fields, irregular parcels, parks, and land-use gradients rather than grids; dense detail must be batched; institutional spaces should model power as surfaces, rails, overlays, thresholds, shader behavior, and camera evidence; and visual acceptance needs domain-facing inspection renders plus verifier checks, not only overview renders. The first reusable `vibegeometry/` helper library now carries coordinate frames, fields, batching, Blender scene primitives, and verifier helpers used by the Bloom and Lucent builds. Known graph-tooling blockers remain repeat-zone feedback, repeat Top outputs, foreach zones, and gizmo nodes.
|
||||
summary: VibeGeometry has verified Geometry Script translations for local samples, official Blender demos, and IRCSS French Houses footholds, plus from-scratch Aetheria Bloom and Lucent tether habitat builds. Durable lessons now driving the pipeline: Python orchestrates intent and batching; Geometry Script emits inspectable node groups; source-bound scenes need explicit coordinate contracts before ornament; spin-gravity habitats need ground planes orthogonal to their tether/rotation axis; utility petals, radiators, and solar arrays belong outside pressure glass and may need Citadel-scale presence; large habitat parts need visible load paths across coordinate frames; organic city maps need street fields, irregular parcels, parks, and land-use gradients rather than grids; dense detail must be batched; institutional spaces should model power as surfaces, rails, overlays, thresholds, shader behavior, and camera evidence; and visual acceptance needs domain-facing inspection renders plus verifier checks, not only overview renders. The first reusable `vibegeometry/` helper library now carries coordinate frames, fields, batching, Blender scene primitives, and verifier helpers used by the Bloom and Lucent builds. Known graph-tooling blockers remain repeat-zone feedback, repeat Top outputs, foreach zones, and gizmo nodes.
|
||||
next_action: Extract the first higher-level reusable builder seam from the completed story-bound builds: either threshold/control-rail interface kits from the Lucent habitat or endcap terrace/spiral artery kits from the Bloom, then bind that seam to scene-brief, manifest, inspection-render, and verifier contract drafts.
|
||||
remotes:
|
||||
vibegeometry: https://github.com/GameCult/VibeGeometry
|
||||
|
|
|
|||
|
|
@ -103,11 +103,13 @@ def verify_city_coordinate_contract():
|
|||
raise AssertionError("City ground surface should be orthogonal to tether with minimal X depth")
|
||||
if solar.location.x > 0.001 or radiator.location.x > 0.001:
|
||||
raise AssertionError("Ray florets should use object-space geometry, not hidden object offsets")
|
||||
if max(vertex.co.x for vertex in solar.data.vertices) >= -5.45:
|
||||
raise AssertionError("Solar ray florets should sit outside the dome base, sunward of the flat cut")
|
||||
if max(vertex.co.x for vertex in radiator.data.vertices) >= -5.45:
|
||||
raise AssertionError("Radiator ray florets should sit outside the dome base, sunward of the flat cut")
|
||||
if solar.dimensions.y < 3.4 or solar.dimensions.z < 3.4 or radiator.dimensions.y < 3.4 or radiator.dimensions.z < 3.4:
|
||||
solar_min_x = min(vertex.co.x for vertex in solar.data.vertices)
|
||||
radiator_min_x = min(vertex.co.x for vertex in radiator.data.vertices)
|
||||
if solar_min_x < -5.46 or radiator_min_x < -5.46:
|
||||
raise AssertionError("Ray florets should hinge at the flat dome base, not behind it")
|
||||
if solar.dimensions.x < 10.5 or radiator.dimensions.x < 10.5:
|
||||
raise AssertionError("Ray florets should be Citadel-scale arms long enough to fold toward the far tether end")
|
||||
if solar.dimensions.y < 4.2 or solar.dimensions.z < 4.2 or radiator.dimensions.y < 4.2 or radiator.dimensions.z < 4.2:
|
||||
raise AssertionError("Alternating solar/radiator ray florets should wrap around most of the dome rim")
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue