@a2f0/skyline 0.2.28 → 0.2.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/skyline-geography.md +8 -5
- package/lib/models/colour-materials.js +3 -3
- package/lib/models/colour-palette.js +3 -0
- package/lib/models/sheraton-grand-geographic.d.ts +3 -0
- package/lib/models/sheraton-grand-geographic.js +60 -15
- package/lib/models/skyline-geography-data.js +2 -2
- package/lib/models/swissotel-geographic.d.ts +3 -1
- package/lib/models/swissotel-geographic.js +13 -5
- package/package.json +1 -1
- package/site/models/colour-materials.js +3 -3
- package/site/models/colour-palette.js +3 -0
- package/site/models/sheraton-grand-geographic.js +60 -15
- package/site/models/skyline-geography-data.js +2 -2
- package/site/models/swissotel-geographic.js +13 -5
- package/site/skyline-3d.html +1 -1
|
@@ -463,10 +463,12 @@ Intermediate parts have less certainty than the overall height:
|
|
|
463
463
|
- The Sheraton Grand Chicago Riverwalk stands across the river, right of The Buckingham, where
|
|
464
464
|
the drawing paints a lit crown. Its levels stand on the Skyscraper Center's datum, with
|
|
465
465
|
Emporis's floor-to-floor, roof and crown heights over its top floor: the arms' roof at
|
|
466
|
-
94.76 m
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
466
|
+
94.76 m and the corner's two floors higher at 100.1 m, with the main 12.2 m
|
|
467
|
+
louvered crown reaching the published 112.3 m. The 2026-10-17 passes restore
|
|
468
|
+
the lower east wing at an estimated 84.08 m and its round end at 86.75 m,
|
|
469
|
+
then give the crowns stepped frames and narrow louvers. Photographic ratios
|
|
470
|
+
shorten the arm crowns to about 7.2 m and the wing crown to about 6 m; those
|
|
471
|
+
secondary dimensions remain estimates. The Skyscraper Center's tip, 50 cm
|
|
470
472
|
higher, names no feature the photographs resolve, so the model stops at the drum's top; see
|
|
471
473
|
the [Sheraton Grand reference audit](sheraton-grand-reference.md).
|
|
472
474
|
- Three Illinois Center stands between 340 on the Park and The Buckingham from the drawing's
|
|
@@ -476,7 +478,8 @@ Intermediate parts have less certainty than the overall height:
|
|
|
476
478
|
drawn tower there stands about 140 layer units higher, so the drawing's group keeps its
|
|
477
479
|
label; see the [Three Illinois Center reference audit](three-illinois-center-reference.md).
|
|
478
480
|
- Swissôtel Chicago stands behind Three Illinois Center and The Buckingham. Its triangular
|
|
479
|
-
glass tower
|
|
481
|
+
glass tower retains the published 139.3 m over 45 facade modules, each divided
|
|
482
|
+
into an opaque floor band and a vision panel using 2012 photographic ratios,
|
|
480
483
|
and its west corner closes the seam where those two models' corners leave sky; see the
|
|
481
484
|
[Swissôtel reference audit](swissotel-reference.md).
|
|
482
485
|
|
|
@@ -249,11 +249,11 @@ export const colourMaterials = {
|
|
|
249
249
|
shell: ["neutral"],
|
|
250
250
|
"brick and windows": ["bronze glass", { ...windows(0x6d6d6d, 0x4a4a4a), 0x2c2c2c: "dark metal", 0x3b3b3b: "orange brick" }],
|
|
251
251
|
},
|
|
252
|
-
// Cream precast
|
|
252
|
+
// Cream precast framing and dark maroon crown screens.
|
|
253
253
|
"building-buckingham-east": {
|
|
254
254
|
shell: ["precast", { 0x686868: "neutral" }],
|
|
255
255
|
"precast and windows": ["glass", { ...windows(0x8a8a8a, 0x505050), 0x848484: "precast" }],
|
|
256
|
-
drums: ["precast", { 0x5a5a5a: "maroon"
|
|
256
|
+
drums: ["precast", { 0x5a5a5a: "maroon" }],
|
|
257
257
|
},
|
|
258
258
|
// Dark brown aluminium and bronze glass.
|
|
259
259
|
"building-three-illinois-center": {
|
|
@@ -263,7 +263,7 @@ export const colourMaterials = {
|
|
|
263
263
|
// Reflective blue-green glass in its frame.
|
|
264
264
|
"building-swissotel": {
|
|
265
265
|
shell: ["neutral"],
|
|
266
|
-
"curtain wall": ["blue-green glass", windows(0x878787, 0x515151)],
|
|
266
|
+
"curtain wall": ["blue-green glass", { ...windows(0x878787, 0x515151), 0x414141: "aluminium", 0x909090: "opaque spandrel" }],
|
|
267
267
|
},
|
|
268
268
|
};
|
|
269
269
|
// A batch's materials from its mesh's name, if the trial knows the building and the batch.
|
|
@@ -204,6 +204,9 @@ export const measuredColours = {
|
|
|
204
204
|
// docs/swissotel-reference.md, 2026-10-10 — Daytime colours from Chicago.jpg.
|
|
205
205
|
"building-swissotel": {
|
|
206
206
|
...glass(0x475056, "blue-green glass"),
|
|
207
|
+
// FID-SWI-002: mixed panorama sample does not resolve these separately.
|
|
208
|
+
"opaque spandrel": null,
|
|
209
|
+
aluminium: null,
|
|
207
210
|
neutral: null,
|
|
208
211
|
},
|
|
209
212
|
// docs/north-michigan-180-reference.md, 2026-10-10 — Daytime colours from Chicago.jpg. Only the
|
|
@@ -8,12 +8,15 @@ export declare const sheratonLevels: Readonly<{
|
|
|
8
8
|
wing: number;
|
|
9
9
|
wingEnd: number;
|
|
10
10
|
drum: 12.2;
|
|
11
|
+
screen: 5.4;
|
|
11
12
|
top: 112.3;
|
|
12
13
|
}>;
|
|
13
14
|
export declare const sheratonDrums: readonly {
|
|
14
15
|
centre: Vec2;
|
|
15
16
|
radius: number;
|
|
16
17
|
base: number;
|
|
18
|
+
height: number;
|
|
19
|
+
screen: number;
|
|
17
20
|
}[];
|
|
18
21
|
export declare const sheratonPalette: Readonly<{
|
|
19
22
|
glass: number[];
|
|
@@ -9,7 +9,7 @@ import { chainSkin, chainsOf, orient, paintedSlab, planOf, turnsAt } from "./fac
|
|
|
9
9
|
//
|
|
10
10
|
// A cream precast tower on an L, its arms ending in round towers, of punched windows at the
|
|
11
11
|
// published 2.67 m floor-to-floor. The corner's round tower rises two floors over the arms,
|
|
12
|
-
// and each round end carries
|
|
12
|
+
// and each round end carries a stepped crown and louvered screen, floodlit at night. Heights stand on
|
|
13
13
|
// the Skyscraper Center's datum, its top floor at 97 m and the corner drum's top at 112.3 m;
|
|
14
14
|
// its 112.8 m tip, 50 cm higher, is not modelled. See docs/sheraton-grand-reference.md.
|
|
15
15
|
// Units are meters; +x is east, +z is south.
|
|
@@ -20,7 +20,8 @@ export const sheratonLevels = Object.freeze({
|
|
|
20
20
|
arms: 100.1 - 2 * 2.67, // the arms' roof, two floors lower, at the mapped arms' 32 levels
|
|
21
21
|
wing: 100.1 - 6 * 2.67, // 28-level east wing, relative to the 34-level corner's datum
|
|
22
22
|
wingEnd: 100.1 - 5 * 2.67, // the mapped 29-level round end, a floor above its wing
|
|
23
|
-
drum: 12.2, //
|
|
23
|
+
drum: 12.2, // total crown assembly, including its stepped base
|
|
24
|
+
screen: 5.4, // inferred upper screen, about 44% of the assembly in the 2007 photograph
|
|
24
25
|
top: 112.3, // the corner drum's top, the Skyscraper Center's architectural height
|
|
25
26
|
});
|
|
26
27
|
const h = sheratonLevels;
|
|
@@ -28,13 +29,17 @@ const h = sheratonLevels;
|
|
|
28
29
|
// the corner, part 1269924307, and the east and north arms' ends, parts 1269924306 and
|
|
29
30
|
// 1269924308, plus the east wing's end, 1269924304 (within 1.7 cm).
|
|
30
31
|
// Centres are east and north metres from Crain's centre; map precision is not survey accuracy.
|
|
32
|
+
// Only the main 12.2 m crown has a published height difference. Smaller crowns
|
|
33
|
+
// use photo ratios (7.2/6 m, about ±1.5 m), not copies of the main assembly.
|
|
31
34
|
export const sheratonDrums = Object.freeze([
|
|
32
|
-
{ centre: [407.44, 465.95], radius: 7.97, base: h.corner },
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
{ centre: [
|
|
35
|
+
{ centre: [407.44, 465.95], radius: 7.97, base: h.corner, height: h.drum, screen: h.screen },
|
|
36
|
+
// Secondary screen/base splits are inferred from the shallow-base appearance;
|
|
37
|
+
// unlike the main screen, their exact proportions have no pixel measurement.
|
|
38
|
+
{ centre: [439.52, 462.06], radius: 7.37, base: h.arms, height: 7.2, screen: 4.5 },
|
|
39
|
+
{ centre: [409.75, 498.32], radius: 7.39, base: h.arms, height: 7.2, screen: 4.5 },
|
|
40
|
+
{ centre: [482.703, 457.389], radius: 7.391, base: h.wingEnd, height: 6, screen: 4 },
|
|
36
41
|
]);
|
|
37
|
-
// The skins' colours: the window tones, the precast, and the
|
|
42
|
+
// The skins' colours: the window tones, the precast, and the crowns' pale frames and dark maroon screens,
|
|
38
43
|
// which no window shares.
|
|
39
44
|
export const sheratonPalette = Object.freeze({ glass: [0x2a2a2a, 0x2e2e2e, 0x323232, 0x262626], lit: 0x8a8a8a, dim: 0x505050, precast: 0x848484, drum: 0xb4b4b4, fin: 0x5a5a5a });
|
|
40
45
|
const palette = sheratonPalette;
|
|
@@ -69,7 +74,7 @@ export function createSheratonGrandGeographicBuilding(record, projectPlan, offse
|
|
|
69
74
|
const wall = kit.batch("Sheraton Grand · precast and windows", kit.material(0xffffff, { vertexColors: true }));
|
|
70
75
|
const drums = kit.batch("Sheraton Grand · drums", kit.material(0xffffff, { vertexColors: true }));
|
|
71
76
|
const tower = orient(polygonOf(projectPlan(record.parts[0].coordinates)));
|
|
72
|
-
const circle = (centre, radius, sides
|
|
77
|
+
const circle = (centre, radius, sides) => orient(Array.from({ length: sides }, (_, k) => {
|
|
73
78
|
const angle = (k / sides) * Math.PI * 2;
|
|
74
79
|
return [centre[0] + radius * Math.cos(angle), -centre[1] + radius * Math.sin(angle)];
|
|
75
80
|
}));
|
|
@@ -77,13 +82,13 @@ export function createSheratonGrandGeographicBuilding(record, projectPlan, offse
|
|
|
77
82
|
const wing = orient(polygonOf(projectPlan(record.parts[2].coordinates)));
|
|
78
83
|
const wingEnd = orient(polygonOf(projectPlan(record.parts[3].coordinates)));
|
|
79
84
|
// A closed solid of walls and slabs on an outline, painted by its runs.
|
|
80
|
-
const solid = (target, outline, lo, hi, paint) => {
|
|
85
|
+
const solid = (target, outline, lo, hi, paint, cap = roofing) => {
|
|
81
86
|
planOf(outline).forEach((run, k) => {
|
|
82
87
|
const a = run.at(0), b = run.at(run.length), n = run.normal(0);
|
|
83
88
|
kit.quad(target, [[a[0], lo, a[1]], [b[0], lo, b[1]], [b[0], hi, b[1]], [a[0], hi, a[1]]], [[n[0], 0, n[1]]], paint(k));
|
|
84
89
|
});
|
|
85
|
-
paintedSlab(kit, target, outline, lo, false,
|
|
86
|
-
paintedSlab(kit, target, outline, hi, true,
|
|
90
|
+
paintedSlab(kit, target, outline, lo, false, cap);
|
|
91
|
+
paintedSlab(kit, target, outline, hi, true, cap);
|
|
87
92
|
};
|
|
88
93
|
// The tower to the arms' roof, and the corner's round tower, on its mapped part, two floors
|
|
89
94
|
// over it.
|
|
@@ -91,9 +96,48 @@ export function createSheratonGrandGeographicBuilding(record, projectPlan, offse
|
|
|
91
96
|
solid(shell, cornerPlan, h.arms, h.corner, () => core);
|
|
92
97
|
solid(shell, wing, 0, h.wing, () => core);
|
|
93
98
|
solid(shell, wingEnd, h.wing, h.wingEnd, () => core);
|
|
94
|
-
//
|
|
95
|
-
|
|
96
|
-
|
|
99
|
+
// Matt Griffin's 2007 photograph resolves a stepped pale frame below a
|
|
100
|
+
// dark horizontal-louver screen. About 20 slats and alternating broad/narrow
|
|
101
|
+
// uprights are visible; the old equal-width vertical stripes were not fins.
|
|
102
|
+
// Ratios are photographic estimates, not construction dimensions. Preserve
|
|
103
|
+
// the mapped centres and published total height; see FID-SHER-002's audit.
|
|
104
|
+
for (const { centre, radius, base, height, screen } of sheratonDrums) {
|
|
105
|
+
const baseHeight = height - screen;
|
|
106
|
+
const screenBase = base + baseHeight;
|
|
107
|
+
const screenRadius = radius - 0.6;
|
|
108
|
+
const ring = (r, lo, hi, paint) => solid(drums, circle(centre, r, 48), lo, hi, () => paint, paint);
|
|
109
|
+
// Recessed opaque cores keep geometry closed. True see-through screens
|
|
110
|
+
// remain unresolved; the recess and projecting slats supply visible relief.
|
|
111
|
+
ring(radius - 0.7, base + 0.25, screenBase, fin);
|
|
112
|
+
ring(screenRadius - 0.12, screenBase, base + height, fin);
|
|
113
|
+
ring(radius, base, base + 0.5, drumFace);
|
|
114
|
+
ring(radius - 0.25, base + baseHeight / 2 - 0.1, base + baseHeight / 2 + 0.1, drumFace);
|
|
115
|
+
const baseBands = baseHeight > 5 ? 7 : 2;
|
|
116
|
+
for (let row = 1; row <= baseBands; row += 1) {
|
|
117
|
+
const y = base + 0.6 + row * (baseHeight - 1.4) / baseBands;
|
|
118
|
+
if (Math.abs(y - base - baseHeight / 2) > 0.25)
|
|
119
|
+
ring(radius - 0.55, y, y + 0.10, drumFace);
|
|
120
|
+
}
|
|
121
|
+
for (let row = 0; row < 20; row += 1) {
|
|
122
|
+
const y = screenBase + row * screen / 20;
|
|
123
|
+
ring(screenRadius, y + 0.03, y + 0.10, fin);
|
|
124
|
+
}
|
|
125
|
+
const post = (angle, width, inner, outer, lo, hi) => {
|
|
126
|
+
const c = Math.cos(angle), s = Math.sin(angle);
|
|
127
|
+
const section = [[inner, -width / 2], [outer, -width / 2], [outer, width / 2], [inner, width / 2]];
|
|
128
|
+
const corners = section.map(([r, t]) => [centre[0] + r * c - t * s, -centre[1] + r * s + t * c]);
|
|
129
|
+
solid(drums, orient(corners), lo, hi, () => drumFace, drumFace);
|
|
130
|
+
};
|
|
131
|
+
for (let k = 0; k < 24; k += 1) {
|
|
132
|
+
const angle = k / 24 * Math.PI * 2;
|
|
133
|
+
// The 2 cm clearance from the core avoids coplanar caps; slats join the posts.
|
|
134
|
+
post(angle, k % 2 ? 0.14 : 0.42, screenRadius - 0.10, screenRadius + 0.10, screenBase, base + height);
|
|
135
|
+
if (k % 2 === 0) {
|
|
136
|
+
post(angle, 0.65, radius - 0.75, radius + 0.12, base + 0.5, base + baseHeight / 2 + 0.08);
|
|
137
|
+
post(angle, 0.48, radius - 0.75, radius - 0.20, base + baseHeight / 2 + 0.08, screenBase + 0.2);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
97
141
|
// The skins, one box to a chain of runs turning less than 30°, so the round ends carry one:
|
|
98
142
|
// a window 1.4 m wide in each 2.4 m bay, set out from the chain's middle, on every floor.
|
|
99
143
|
const towerRows = rowsFor(0.25, h.arms);
|
|
@@ -141,7 +185,8 @@ export function createSheratonGrandGeographicBuilding(record, projectPlan, offse
|
|
|
141
185
|
skin(cornerPlan, h.arms, h.corner, 1);
|
|
142
186
|
skin(wing, 0.25, h.wing, 2, tower);
|
|
143
187
|
skin(wingEnd, h.wing, h.wingEnd, 3);
|
|
144
|
-
|
|
188
|
+
// Outlining every louver adds pale rings that wash out the dark screens.
|
|
189
|
+
const model = kit.finish({ height: h.top, outlines: [shell], opacity: 0.16 });
|
|
145
190
|
model.building.position.set(offset[0], 0, offset[1]);
|
|
146
191
|
model.building.userData["geography"] = record;
|
|
147
192
|
model.building.userData["geographicDetail"] = { levels: h, source: "docs/sheraton-grand-reference.md" };
|
|
@@ -44,9 +44,9 @@ export const geographicBuildings = [
|
|
|
44
44
|
{ "id": "building-office-west-of-aon", "name": "Two Illinois Center", "shortName": "Two Illinois Center", "height": 114.3, "tipHeight": 114.3, "heightSource": "https://www.skyscrapercenter.com/chicago/two-illinois-center/11095", "note": "Detailed Two Illinois Center: the mapped outline; a dark curtain wall of 32 storeys, mullions on a 5 ft module with glass over a spandrel on every floor at the photograph's 3.55 m pitch, and the top two floors' mechanical band, to a flat roof at the Skyscraper Center's 114.3 m. From the photograph's camera its lit floors fill the lower part of the gap between Two Prudential Plaza and Aon Center, in front of River Plaza.", "footprint": { "way": 236770799, "version": 3, "coordinates": [[-87.6235661, 41.8871124], [-87.6235636, 41.8871174], [-87.6235524, 41.8871216], [-87.6225645, 41.8871339], [-87.622551, 41.8871289], [-87.6225466, 41.8871186], [-87.622541, 41.8867998], [-87.6225469, 41.8867912], [-87.6225543, 41.8867879], [-87.6225638, 41.8867865], [-87.6228061, 41.8867819], [-87.6231721, 41.8867773], [-87.6235523, 41.886775], [-87.623557, 41.8867781], [-87.6235613, 41.8867836]] }, "parts": [{ "way": 236770799, "version": 3, "coordinates": [[-87.6235661, 41.8871124], [-87.6235636, 41.8871174], [-87.6235524, 41.8871216], [-87.6225645, 41.8871339], [-87.622551, 41.8871289], [-87.6225466, 41.8871186], [-87.622541, 41.8867998], [-87.6225469, 41.8867912], [-87.6225543, 41.8867879], [-87.6225638, 41.8867865], [-87.6228061, 41.8867819], [-87.6231721, 41.8867773], [-87.6235523, 41.886775], [-87.623557, 41.8867781], [-87.6235613, 41.8867836]], "bottom": 0, "top": 114.3 }] },
|
|
45
45
|
{ "id": "building-river-plaza", "name": "River Plaza", "shortName": "River Plaza", "height": 159.7, "tipHeight": 159.7, "heightSource": "https://www.skyscrapercenter.com/chicago/river-plaza/3383", "note": "Detailed River Plaza: the mapped outline and its parts; a white concrete slab of 56 storeys with notched corners, a grid of exposed frame and punched windows over the podium on the river side, to a flat roof at OpenStreetMap's 156 m, under the box on it to the Skyscraper Center's 159.7 m, its architectural height and tip; OpenStreetMap's 166 m for the box stands over the published tip. From the photograph's camera its top fills the gap between Two Prudential Plaza and Aon Center behind Two Illinois Center, the only mapped building on that sightline tall enough to reach the drawn top.", "footprint": { "way": 285867424, "version": 6, "coordinates": [[-87.6260818, 41.8900013], [-87.6261095, 41.8899782], [-87.6261086, 41.8899259], [-87.6261285, 41.8899127], [-87.6261269, 41.8898753], [-87.6261044, 41.8898588], [-87.6261035, 41.8898229], [-87.626103, 41.8898052], [-87.6260771, 41.8897865], [-87.6259425, 41.8896905], [-87.6257902, 41.8895791], [-87.6257288, 41.8895898], [-87.6255231, 41.8896255], [-87.6255256, 41.8897934], [-87.6254949, 41.8897941], [-87.6254648, 41.889817], [-87.6254664, 41.8898714], [-87.6254461, 41.8898877], [-87.6254474, 41.8899257], [-87.6254684, 41.8899384], [-87.6254701, 41.8899906], [-87.6255035, 41.8900132], [-87.625675, 41.8900085], [-87.6256968, 41.8899927], [-87.6258816, 41.8899874], [-87.6259031, 41.8900027]] }, "parts": [{ "way": 68796725, "version": 10, "coordinates": [[-87.6254648, 41.889817], [-87.6254664, 41.8898714], [-87.6254461, 41.8898877], [-87.6254474, 41.8899257], [-87.6254684, 41.8899384], [-87.6254701, 41.8899906], [-87.6255035, 41.8900132], [-87.625675, 41.8900085], [-87.6256968, 41.8899927], [-87.6258816, 41.8899874], [-87.6259031, 41.8900027], [-87.6260818, 41.8900013], [-87.6261095, 41.8899782], [-87.6261086, 41.8899259], [-87.6261285, 41.8899127], [-87.6261269, 41.8898753], [-87.6261044, 41.8898588], [-87.6261035, 41.8898229], [-87.626103, 41.8898052], [-87.6260771, 41.8897865], [-87.6258989, 41.8897905], [-87.6258799, 41.8898052], [-87.6256906, 41.8898092], [-87.6256664, 41.8897938], [-87.6255256, 41.8897934], [-87.6254949, 41.8897941]], "bottom": 0, "top": 156 }, { "way": 68796733, "version": 5, "coordinates": [[-87.6260771, 41.8897865], [-87.6259425, 41.8896905], [-87.6257902, 41.8895791], [-87.6257288, 41.8895898], [-87.6255231, 41.8896255], [-87.6255256, 41.8897934], [-87.6256664, 41.8897938], [-87.6256906, 41.8898092], [-87.6258799, 41.8898052], [-87.6258989, 41.8897905]], "bottom": 0, "top": 8 }, { "way": 285867425, "version": 1, "coordinates": [[-87.6258543, 41.8899579], [-87.6257153, 41.8899611], [-87.6257111, 41.8898629], [-87.6258501, 41.8898597]], "bottom": 156, "top": 159.7 }] },
|
|
46
46
|
{ "id": "building-hyatt-regency-west-tower", "name": "Hyatt Regency Chicago West Tower", "shortName": "Hyatt West Tower", "height": 111.3, "tipHeight": 111.3, "heightSource": "https://www.skyscrapercenter.com/building/hyatt-regency-chicago-west-tower/13132", "note": "Detailed Hyatt Regency Chicago West Tower: its mapped part of the hotel's outline; a brick slab of 33 storeys, narrow window slots continuous from the lobby to the top two floors on a 3.5 m module between solid corners, and a plain band over them to a flat roof at the Skyscraper Center's 111.3 m. From the photograph's camera it stands between Aon Center and the Blue Cross and Blue Shield Tower, where the drawing's Blue Cross group paints a dark brown sliver.", "footprint": { "way": 235920252, "version": 4, "coordinates": [[-87.6227574, 41.887587], [-87.6228537, 41.887584], [-87.6228521, 41.8874603], [-87.6228518, 41.8874165], [-87.6225427, 41.8874231], [-87.6225408, 41.8875106], [-87.6225253, 41.8875109], [-87.6225266, 41.8875277], [-87.6225277, 41.8875513], [-87.622528, 41.8875746], [-87.6225382, 41.8878947], [-87.62255, 41.8878954], [-87.6225496, 41.8879846], [-87.6228658, 41.8879789], [-87.6228643, 41.8879388], [-87.6228611, 41.8878099], [-87.6227664, 41.8878103]] }, "parts": [{ "way": 235920252, "version": 4, "coordinates": [[-87.6227574, 41.887587], [-87.6228537, 41.887584], [-87.6228521, 41.8874603], [-87.6228518, 41.8874165], [-87.6225427, 41.8874231], [-87.6225408, 41.8875106], [-87.6225253, 41.8875109], [-87.6225266, 41.8875277], [-87.6225277, 41.8875513], [-87.622528, 41.8875746], [-87.6225382, 41.8878947], [-87.62255, 41.8878954], [-87.6225496, 41.8879846], [-87.6228658, 41.8879789], [-87.6228643, 41.8879388], [-87.6228611, 41.8878099], [-87.6227664, 41.8878103]], "bottom": 0, "top": 111.3 }] },
|
|
47
|
-
{ "id": "building-buckingham-east", "name": "Sheraton Grand Chicago Riverwalk", "shortName": "Sheraton Grand", "height": 112.3, "tipHeight": 112.3, "heightSource": "https://www.skyscrapercenter.com/building/sheraton-chicago-hotel-towers/10020", "note": "Detailed Sheraton Grand Chicago Riverwalk: the mapped tower and its corner part; a cream precast tower on an L of punched windows at Emporis's 2.67 m floor-to-floor, its arms to 94.76 m, the corner's round tower two floors higher to 100.1 m, and
|
|
47
|
+
{ "id": "building-buckingham-east", "name": "Sheraton Grand Chicago Riverwalk", "shortName": "Sheraton Grand", "height": 112.3, "tipHeight": 112.3, "heightSource": "https://www.skyscrapercenter.com/building/sheraton-chicago-hotel-towers/10020", "note": "Detailed Sheraton Grand Chicago Riverwalk: the mapped tower and its corner part; a cream precast tower on an L of punched windows at Emporis's 2.67 m floor-to-floor, its arms to 94.76 m, the corner's round tower two floors higher to 100.1 m, and pale stepped frames under dark louvered screens on all four round ends, with the smaller bases approximated from the principal frame. The main crown reaches the Skyscraper Center's 112.3 m. Heights stand on the Skyscraper Center's datum: its top floor at 97 m, a floor-to-roof of 3.1 m and a 12.2 m main crown from Emporis; photographic ratios estimate about 7.2 m crowns on the arms and 6 m on the east wing; the published height nearest the drawing's reading, over Emporis's 330.56 ft. The Skyscraper Center's 112.8 m tip, 50 cm over the drum, is not modelled. The drawing's buckingham-east group is its corner's lit drum over its tower. The mapped east wing and its round end continue the hotel to the east, with estimated roofs at 84.08 m and 86.75 m on the same height datum and a fourth crown. Photographs from before 2013 establish the wing; exact roof and crown dimensions remain inferred.", "footprint": { "way": 592122464, "version": 5, "coordinates": [[-87.6199499, 41.8891119], [-87.6199176, 41.8893381], [-87.6199306, 41.8893589], [-87.6199502, 41.8893716], [-87.6199845, 41.8893878], [-87.6200276, 41.8893957], [-87.6200732, 41.8893915], [-87.6201147, 41.8893744], [-87.6201372, 41.8893482], [-87.6201463, 41.8893162], [-87.6201584, 41.8892447], [-87.6201841, 41.889063], [-87.6201875, 41.8890302], [-87.6201812, 41.8889946], [-87.6201588, 41.8889641], [-87.620121, 41.8889384], [-87.6200743, 41.8889276], [-87.6196505, 41.8888958], [-87.6196025, 41.8889162], [-87.6195726, 41.8889427], [-87.6195591, 41.8889735], [-87.6195627, 41.8890068], [-87.6195846, 41.8890373], [-87.6196228, 41.8890638], [-87.6198263, 41.8890777], [-87.6198225, 41.889104]] }, "parts": [{ "way": 592122464, "version": 5, "coordinates": [[-87.6199499, 41.8891119], [-87.6199176, 41.8893381], [-87.6199306, 41.8893589], [-87.6199502, 41.8893716], [-87.6199845, 41.8893878], [-87.6200276, 41.8893957], [-87.6200732, 41.8893915], [-87.6201147, 41.8893744], [-87.6201372, 41.8893482], [-87.6201463, 41.8893162], [-87.6201584, 41.8892447], [-87.6201841, 41.889063], [-87.6201875, 41.8890302], [-87.6201812, 41.8889946], [-87.6201588, 41.8889641], [-87.620121, 41.8889384], [-87.6200743, 41.8889276], [-87.6196505, 41.8888958], [-87.6196025, 41.8889162], [-87.6195726, 41.8889427], [-87.6195591, 41.8889735], [-87.6195627, 41.8890068], [-87.6195846, 41.8890373], [-87.6196228, 41.8890638], [-87.6198263, 41.8890777], [-87.6198225, 41.889104]], "bottom": 0, "top": 94.76 }, { "way": 1269924307, "version": 1, "coordinates": [[-87.6199691, 41.8890378], [-87.6199677, 41.889013], [-87.6199719, 41.8889952], [-87.6199903, 41.8889744], [-87.6200135, 41.88896], [-87.6200416, 41.8889517], [-87.6200717, 41.8889503], [-87.6201037, 41.8889568], [-87.6201308, 41.8889711], [-87.6201498, 41.8889914], [-87.6201583, 41.8890152], [-87.6201555, 41.8890398], [-87.6201415, 41.8890622], [-87.6201241, 41.8890776], [-87.6200882, 41.8890904], [-87.6200552, 41.8890928], [-87.6200258, 41.8890875], [-87.6200001, 41.8890757], [-87.6199805, 41.8890586]], "bottom": 94.76, "top": 100.1 }, { "way": 1269924305, "version": 1, "coordinates": [[-87.6191033, 41.8890226], [-87.6190622, 41.8889954], [-87.6190428, 41.8889627], [-87.6190431, 41.8889236], [-87.6190607, 41.8888928], [-87.619091, 41.8888724], [-87.6191278, 41.8888566], [-87.6193634, 41.8888743], [-87.6196505, 41.8888958], [-87.6196025, 41.8889162], [-87.6195726, 41.8889427], [-87.6195591, 41.8889735], [-87.6195627, 41.8890068], [-87.6195846, 41.8890373], [-87.6196228, 41.8890638]], "bottom": 0, "top": 84.08, "estimatedHeight": true }, { "way": 1269924304, "version": 1, "coordinates": [[-87.619112, 41.8888866], [-87.61909, 41.8888996], [-87.6190746, 41.888917], [-87.6190672, 41.8889372], [-87.6190685, 41.8889581], [-87.6190786, 41.8889777], [-87.6190963, 41.8889939], [-87.6191199, 41.8890052], [-87.6191471, 41.8890105], [-87.6191778, 41.8890088], [-87.6192059, 41.8889994], [-87.619228, 41.8889835], [-87.6192416, 41.8889629], [-87.6192449, 41.8889401], [-87.6192376, 41.8889179], [-87.6192207, 41.8888988], [-87.6191959, 41.8888851], [-87.6191665, 41.8888785], [-87.6191384, 41.8888793]], "bottom": 84.08, "top": 86.75, "estimatedHeight": true }], "groundFootprintWays": [592122464, 1269924305] },
|
|
48
48
|
{ "id": "building-three-illinois-center", "name": "Three Illinois Center", "shortName": "Three Illinois Center", "height": 106.7, "tipHeight": 106.7, "heightSource": "https://www.skyscrapercenter.com/building/three-illinois-center/13913", "note": "Detailed Three Illinois Center: the mapped outline; a dark bronze curtain wall of 30 storeys, mullions on a 5 ft module and glass over a spandrel on each floor at the published 11.5 ft slab to slab over a 5.06 m lobby, and the top two floors' windowless mechanical penthouse, glazed about 2019 but kept as the 2013 photograph shows it, under a flat roof at the Skyscraper Center's and Emporis's 350 ft. Its east end fills the gap between 340 on the Park and The Buckingham, where the drawing's buckingham-west group paints an office tower whose top stands about 140 layer units higher.", "footprint": { "way": 95486958, "version": 12, "coordinates": [[-87.6204966, 41.8869542], [-87.6202534, 41.8869566], [-87.6200384, 41.8869571], [-87.6200396, 41.887005], [-87.6200455, 41.8873733], [-87.620058, 41.8876286], [-87.6205101, 41.8876189], [-87.6205054, 41.8873683]] }, "parts": [{ "way": 95486958, "version": 12, "coordinates": [[-87.6204966, 41.8869542], [-87.6202534, 41.8869566], [-87.6200384, 41.8869571], [-87.6200396, 41.887005], [-87.6200455, 41.8873733], [-87.620058, 41.8876286], [-87.6205101, 41.8876189], [-87.6205054, 41.8873683]], "bottom": 0, "top": 106.7 }] },
|
|
49
|
-
{ "id": "building-swissotel", "name": "Swissôtel Chicago", "shortName": "Swissôtel", "height": 139.3, "tipHeight": 139.3, "heightSource": "https://www.skyscrapercenter.com/building/swissotel-chicago/4362", "note": "Detailed Swissôtel Chicago: the hotel's mapped tower part, a triangle; a flush grid of reflective
|
|
49
|
+
{ "id": "building-swissotel", "name": "Swissôtel Chicago", "shortName": "Swissôtel", "height": 139.3, "tipHeight": 139.3, "heightSource": "https://www.skyscrapercenter.com/building/swissotel-chicago/4362", "note": "Detailed Swissôtel Chicago: the hotel's mapped tower part, a triangle; a flush grid of reflective vision windows above pale opaque floor bands, with thin mullions about 1.5 m apart and paired transoms in each of 45 retained modules. The bands take about 45% of each module from 2012 photographic ratios; precise occupied-floor and mechanical-row counts remain unresolved. The flat roof stays at the Skyscraper Center's 139.3 m. It stands behind Three Illinois Center and The Buckingham from the drawing's camera, and fills the seam where their corners meet. The hotel's outline, 95486966, adds a small block on the tower's north-east face, and its podium, 95486953, carries no height; neither is modelled.", "footprint": { "way": 641288601, "version": 3, "coordinates": [[-87.6194102, 41.8874254], [-87.619534, 41.8875706], [-87.619676, 41.8873866], [-87.6198184, 41.8871906], [-87.6192311, 41.8871971], [-87.619375, 41.8873843]] }, "parts": [{ "way": 641288601, "version": 3, "coordinates": [[-87.6194102, 41.8874254], [-87.619534, 41.8875706], [-87.619676, 41.8873866], [-87.6198184, 41.8871906], [-87.6192311, 41.8871971], [-87.619375, 41.8873843]], "bottom": 0, "top": 139.3 }] },
|
|
50
50
|
];
|
|
51
51
|
// Every vehicular street on the upper or surface level across the 3D skyline's ground, from
|
|
52
52
|
// a separate extract retrieved 2026-09-30: OpenStreetMap's roads and their links, and its
|
|
@@ -4,6 +4,7 @@ export declare const swissotelLevels: Readonly<{
|
|
|
4
4
|
levels: 45;
|
|
5
5
|
roof: 139.3;
|
|
6
6
|
module: 1.5;
|
|
7
|
+
spandrel: 1.4;
|
|
7
8
|
frame: 0.06;
|
|
8
9
|
coping: 0.1;
|
|
9
10
|
}>;
|
|
@@ -12,11 +13,12 @@ export declare const swissotelPalette: Readonly<{
|
|
|
12
13
|
lit: 8882055;
|
|
13
14
|
dim: 5329233;
|
|
14
15
|
frame: 4276545;
|
|
16
|
+
spandrel: 9474192;
|
|
15
17
|
}>;
|
|
16
18
|
type Row = {
|
|
17
19
|
lo: number;
|
|
18
20
|
hi: number;
|
|
19
|
-
kind: "glass" | "frame";
|
|
21
|
+
kind: "glass" | "frame" | "spandrel";
|
|
20
22
|
floor: number;
|
|
21
23
|
};
|
|
22
24
|
export declare const swissotelRows: Row[];
|
|
@@ -7,24 +7,27 @@ import { chainSkin, chainsOf, orient, paintedSlab, planOf, turnsAt } from "./fac
|
|
|
7
7
|
// the seam where their corners meet.
|
|
8
8
|
//
|
|
9
9
|
// A triangular tower of reflective glass: a flush grid of thin mullions about 1.5 m apart and
|
|
10
|
-
//
|
|
10
|
+
// paired opaque spandrel / vision panels at each floor, under a flat roof at the published 139.3 m. The
|
|
11
11
|
// floors divide that height by OpenStreetMap's 45 levels. See docs/swissotel-reference.md.
|
|
12
12
|
// Units are meters; +x is east, +z is south.
|
|
13
13
|
export const swissotelLevels = Object.freeze({
|
|
14
|
-
levels: 45, //
|
|
14
|
+
levels: 45, // retained module count; OSM and Enclos both report 45 storeys
|
|
15
15
|
roof: 139.3, // the published height, the Skyscraper Center's 457 ft
|
|
16
16
|
module: 1.5, // the mullions' spacing, read on the photographs
|
|
17
|
+
spandrel: 1.4, // about 45% of the retained floor pitch; 2012 photographs, ±0.2 m
|
|
17
18
|
frame: 0.06, // each mullion's and transom's width
|
|
18
19
|
coping: 0.1, // the roof's coping over the top panel
|
|
19
20
|
});
|
|
20
21
|
const h = swissotelLevels;
|
|
21
22
|
const pitch = h.roof / h.levels;
|
|
22
|
-
//
|
|
23
|
-
|
|
23
|
+
// Window tones are distinct from frames and opaque spandrels. The pale band
|
|
24
|
+
// is an explicit grey fallback, not a calibrated sunny-day colour.
|
|
25
|
+
export const swissotelPalette = Object.freeze({ glass: [0x2d2d2d, 0x313131, 0x353535, 0x292929], lit: 0x878787, dim: 0x515151, frame: 0x414141, spandrel: 0x909090 });
|
|
24
26
|
const palette = swissotelPalette;
|
|
25
27
|
const color = (hex) => new THREE.Color(hex);
|
|
26
28
|
const glassTones = palette.glass.map(color);
|
|
27
29
|
const litGlass = color(palette.lit), dimGlass = color(palette.dim), frame = color(palette.frame);
|
|
30
|
+
const spandrel = color(palette.spandrel);
|
|
28
31
|
const core = color(0x1e1e1e), roofing = color(0x323232);
|
|
29
32
|
function paneColor(row, bay, wall) {
|
|
30
33
|
const hash = (Math.imul(row + 71, 0x9e3779b1) ^ Math.imul(bay + 13, 0x85ebca77) ^ Math.imul(wall + 47, 0xc2b2ae3d)) >>> 0;
|
|
@@ -38,7 +41,10 @@ function paneColor(row, bay, wall) {
|
|
|
38
41
|
export const swissotelRows = [];
|
|
39
42
|
for (let n = 1; n <= h.levels; n += 1) {
|
|
40
43
|
const lo = n === 1 ? 0.25 : (n - 1) * pitch + h.frame / 2, hi = n === h.levels ? h.roof - h.coping : n * pitch - h.frame / 2;
|
|
41
|
-
|
|
44
|
+
const split = (n - 1) * pitch + h.spandrel;
|
|
45
|
+
swissotelRows.push({ lo, hi: split - h.frame / 2, kind: "spandrel", floor: n });
|
|
46
|
+
swissotelRows.push({ lo: split - h.frame / 2, hi: split + h.frame / 2, kind: "frame", floor: n });
|
|
47
|
+
swissotelRows.push({ lo: split + h.frame / 2, hi, kind: "glass", floor: n });
|
|
42
48
|
swissotelRows.push({ lo: hi, hi: n === h.levels ? h.roof : n * pitch + h.frame / 2, kind: "frame", floor: n });
|
|
43
49
|
}
|
|
44
50
|
const rows = swissotelRows;
|
|
@@ -68,6 +74,8 @@ export function createSwissotelGeographicBuilding(record, projectPlan, offset) {
|
|
|
68
74
|
const row = rows[r], middle = (columns[bay - 1] + columns[bay]) / 2;
|
|
69
75
|
if (row.kind === "frame" || lines.some((c) => Math.abs(middle - c) < h.frame / 2))
|
|
70
76
|
return frame;
|
|
77
|
+
if (row.kind === "spandrel")
|
|
78
|
+
return spandrel;
|
|
71
79
|
return paneColor(row.floor, bay, index);
|
|
72
80
|
}, frame);
|
|
73
81
|
});
|
package/package.json
CHANGED
|
@@ -249,11 +249,11 @@ export const colourMaterials = {
|
|
|
249
249
|
shell: ["neutral"],
|
|
250
250
|
"brick and windows": ["bronze glass", { ...windows(0x6d6d6d, 0x4a4a4a), 0x2c2c2c: "dark metal", 0x3b3b3b: "orange brick" }],
|
|
251
251
|
},
|
|
252
|
-
// Cream precast
|
|
252
|
+
// Cream precast framing and dark maroon crown screens.
|
|
253
253
|
"building-buckingham-east": {
|
|
254
254
|
shell: ["precast", { 0x686868: "neutral" }],
|
|
255
255
|
"precast and windows": ["glass", { ...windows(0x8a8a8a, 0x505050), 0x848484: "precast" }],
|
|
256
|
-
drums: ["precast", { 0x5a5a5a: "maroon"
|
|
256
|
+
drums: ["precast", { 0x5a5a5a: "maroon" }],
|
|
257
257
|
},
|
|
258
258
|
// Dark brown aluminium and bronze glass.
|
|
259
259
|
"building-three-illinois-center": {
|
|
@@ -263,7 +263,7 @@ export const colourMaterials = {
|
|
|
263
263
|
// Reflective blue-green glass in its frame.
|
|
264
264
|
"building-swissotel": {
|
|
265
265
|
shell: ["neutral"],
|
|
266
|
-
"curtain wall": ["blue-green glass", windows(0x878787, 0x515151)],
|
|
266
|
+
"curtain wall": ["blue-green glass", { ...windows(0x878787, 0x515151), 0x414141: "aluminium", 0x909090: "opaque spandrel" }],
|
|
267
267
|
},
|
|
268
268
|
};
|
|
269
269
|
// A batch's materials from its mesh's name, if the trial knows the building and the batch.
|
|
@@ -204,6 +204,9 @@ export const measuredColours = {
|
|
|
204
204
|
// docs/swissotel-reference.md, 2026-10-10 — Daytime colours from Chicago.jpg.
|
|
205
205
|
"building-swissotel": {
|
|
206
206
|
...glass(0x475056, "blue-green glass"),
|
|
207
|
+
// FID-SWI-002: mixed panorama sample does not resolve these separately.
|
|
208
|
+
"opaque spandrel": null,
|
|
209
|
+
aluminium: null,
|
|
207
210
|
neutral: null,
|
|
208
211
|
},
|
|
209
212
|
// docs/north-michigan-180-reference.md, 2026-10-10 — Daytime colours from Chicago.jpg. Only the
|
|
@@ -9,7 +9,7 @@ import { chainSkin, chainsOf, orient, paintedSlab, planOf, turnsAt } from "./fac
|
|
|
9
9
|
//
|
|
10
10
|
// A cream precast tower on an L, its arms ending in round towers, of punched windows at the
|
|
11
11
|
// published 2.67 m floor-to-floor. The corner's round tower rises two floors over the arms,
|
|
12
|
-
// and each round end carries
|
|
12
|
+
// and each round end carries a stepped crown and louvered screen, floodlit at night. Heights stand on
|
|
13
13
|
// the Skyscraper Center's datum, its top floor at 97 m and the corner drum's top at 112.3 m;
|
|
14
14
|
// its 112.8 m tip, 50 cm higher, is not modelled. See docs/sheraton-grand-reference.md.
|
|
15
15
|
// Units are meters; +x is east, +z is south.
|
|
@@ -20,7 +20,8 @@ export const sheratonLevels = Object.freeze({
|
|
|
20
20
|
arms: 100.1 - 2 * 2.67, // the arms' roof, two floors lower, at the mapped arms' 32 levels
|
|
21
21
|
wing: 100.1 - 6 * 2.67, // 28-level east wing, relative to the 34-level corner's datum
|
|
22
22
|
wingEnd: 100.1 - 5 * 2.67, // the mapped 29-level round end, a floor above its wing
|
|
23
|
-
drum: 12.2, //
|
|
23
|
+
drum: 12.2, // total crown assembly, including its stepped base
|
|
24
|
+
screen: 5.4, // inferred upper screen, about 44% of the assembly in the 2007 photograph
|
|
24
25
|
top: 112.3, // the corner drum's top, the Skyscraper Center's architectural height
|
|
25
26
|
});
|
|
26
27
|
const h = sheratonLevels;
|
|
@@ -28,13 +29,17 @@ const h = sheratonLevels;
|
|
|
28
29
|
// the corner, part 1269924307, and the east and north arms' ends, parts 1269924306 and
|
|
29
30
|
// 1269924308, plus the east wing's end, 1269924304 (within 1.7 cm).
|
|
30
31
|
// Centres are east and north metres from Crain's centre; map precision is not survey accuracy.
|
|
32
|
+
// Only the main 12.2 m crown has a published height difference. Smaller crowns
|
|
33
|
+
// use photo ratios (7.2/6 m, about ±1.5 m), not copies of the main assembly.
|
|
31
34
|
export const sheratonDrums = Object.freeze([
|
|
32
|
-
{ centre: [407.44, 465.95], radius: 7.97, base: h.corner },
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
{ centre: [
|
|
35
|
+
{ centre: [407.44, 465.95], radius: 7.97, base: h.corner, height: h.drum, screen: h.screen },
|
|
36
|
+
// Secondary screen/base splits are inferred from the shallow-base appearance;
|
|
37
|
+
// unlike the main screen, their exact proportions have no pixel measurement.
|
|
38
|
+
{ centre: [439.52, 462.06], radius: 7.37, base: h.arms, height: 7.2, screen: 4.5 },
|
|
39
|
+
{ centre: [409.75, 498.32], radius: 7.39, base: h.arms, height: 7.2, screen: 4.5 },
|
|
40
|
+
{ centre: [482.703, 457.389], radius: 7.391, base: h.wingEnd, height: 6, screen: 4 },
|
|
36
41
|
]);
|
|
37
|
-
// The skins' colours: the window tones, the precast, and the
|
|
42
|
+
// The skins' colours: the window tones, the precast, and the crowns' pale frames and dark maroon screens,
|
|
38
43
|
// which no window shares.
|
|
39
44
|
export const sheratonPalette = Object.freeze({ glass: [0x2a2a2a, 0x2e2e2e, 0x323232, 0x262626], lit: 0x8a8a8a, dim: 0x505050, precast: 0x848484, drum: 0xb4b4b4, fin: 0x5a5a5a });
|
|
40
45
|
const palette = sheratonPalette;
|
|
@@ -69,7 +74,7 @@ export function createSheratonGrandGeographicBuilding(record, projectPlan, offse
|
|
|
69
74
|
const wall = kit.batch("Sheraton Grand · precast and windows", kit.material(0xffffff, { vertexColors: true }));
|
|
70
75
|
const drums = kit.batch("Sheraton Grand · drums", kit.material(0xffffff, { vertexColors: true }));
|
|
71
76
|
const tower = orient(polygonOf(projectPlan(record.parts[0].coordinates)));
|
|
72
|
-
const circle = (centre, radius, sides
|
|
77
|
+
const circle = (centre, radius, sides) => orient(Array.from({ length: sides }, (_, k) => {
|
|
73
78
|
const angle = (k / sides) * Math.PI * 2;
|
|
74
79
|
return [centre[0] + radius * Math.cos(angle), -centre[1] + radius * Math.sin(angle)];
|
|
75
80
|
}));
|
|
@@ -77,13 +82,13 @@ export function createSheratonGrandGeographicBuilding(record, projectPlan, offse
|
|
|
77
82
|
const wing = orient(polygonOf(projectPlan(record.parts[2].coordinates)));
|
|
78
83
|
const wingEnd = orient(polygonOf(projectPlan(record.parts[3].coordinates)));
|
|
79
84
|
// A closed solid of walls and slabs on an outline, painted by its runs.
|
|
80
|
-
const solid = (target, outline, lo, hi, paint) => {
|
|
85
|
+
const solid = (target, outline, lo, hi, paint, cap = roofing) => {
|
|
81
86
|
planOf(outline).forEach((run, k) => {
|
|
82
87
|
const a = run.at(0), b = run.at(run.length), n = run.normal(0);
|
|
83
88
|
kit.quad(target, [[a[0], lo, a[1]], [b[0], lo, b[1]], [b[0], hi, b[1]], [a[0], hi, a[1]]], [[n[0], 0, n[1]]], paint(k));
|
|
84
89
|
});
|
|
85
|
-
paintedSlab(kit, target, outline, lo, false,
|
|
86
|
-
paintedSlab(kit, target, outline, hi, true,
|
|
90
|
+
paintedSlab(kit, target, outline, lo, false, cap);
|
|
91
|
+
paintedSlab(kit, target, outline, hi, true, cap);
|
|
87
92
|
};
|
|
88
93
|
// The tower to the arms' roof, and the corner's round tower, on its mapped part, two floors
|
|
89
94
|
// over it.
|
|
@@ -91,9 +96,48 @@ export function createSheratonGrandGeographicBuilding(record, projectPlan, offse
|
|
|
91
96
|
solid(shell, cornerPlan, h.arms, h.corner, () => core);
|
|
92
97
|
solid(shell, wing, 0, h.wing, () => core);
|
|
93
98
|
solid(shell, wingEnd, h.wing, h.wingEnd, () => core);
|
|
94
|
-
//
|
|
95
|
-
|
|
96
|
-
|
|
99
|
+
// Matt Griffin's 2007 photograph resolves a stepped pale frame below a
|
|
100
|
+
// dark horizontal-louver screen. About 20 slats and alternating broad/narrow
|
|
101
|
+
// uprights are visible; the old equal-width vertical stripes were not fins.
|
|
102
|
+
// Ratios are photographic estimates, not construction dimensions. Preserve
|
|
103
|
+
// the mapped centres and published total height; see FID-SHER-002's audit.
|
|
104
|
+
for (const { centre, radius, base, height, screen } of sheratonDrums) {
|
|
105
|
+
const baseHeight = height - screen;
|
|
106
|
+
const screenBase = base + baseHeight;
|
|
107
|
+
const screenRadius = radius - 0.6;
|
|
108
|
+
const ring = (r, lo, hi, paint) => solid(drums, circle(centre, r, 48), lo, hi, () => paint, paint);
|
|
109
|
+
// Recessed opaque cores keep geometry closed. True see-through screens
|
|
110
|
+
// remain unresolved; the recess and projecting slats supply visible relief.
|
|
111
|
+
ring(radius - 0.7, base + 0.25, screenBase, fin);
|
|
112
|
+
ring(screenRadius - 0.12, screenBase, base + height, fin);
|
|
113
|
+
ring(radius, base, base + 0.5, drumFace);
|
|
114
|
+
ring(radius - 0.25, base + baseHeight / 2 - 0.1, base + baseHeight / 2 + 0.1, drumFace);
|
|
115
|
+
const baseBands = baseHeight > 5 ? 7 : 2;
|
|
116
|
+
for (let row = 1; row <= baseBands; row += 1) {
|
|
117
|
+
const y = base + 0.6 + row * (baseHeight - 1.4) / baseBands;
|
|
118
|
+
if (Math.abs(y - base - baseHeight / 2) > 0.25)
|
|
119
|
+
ring(radius - 0.55, y, y + 0.10, drumFace);
|
|
120
|
+
}
|
|
121
|
+
for (let row = 0; row < 20; row += 1) {
|
|
122
|
+
const y = screenBase + row * screen / 20;
|
|
123
|
+
ring(screenRadius, y + 0.03, y + 0.10, fin);
|
|
124
|
+
}
|
|
125
|
+
const post = (angle, width, inner, outer, lo, hi) => {
|
|
126
|
+
const c = Math.cos(angle), s = Math.sin(angle);
|
|
127
|
+
const section = [[inner, -width / 2], [outer, -width / 2], [outer, width / 2], [inner, width / 2]];
|
|
128
|
+
const corners = section.map(([r, t]) => [centre[0] + r * c - t * s, -centre[1] + r * s + t * c]);
|
|
129
|
+
solid(drums, orient(corners), lo, hi, () => drumFace, drumFace);
|
|
130
|
+
};
|
|
131
|
+
for (let k = 0; k < 24; k += 1) {
|
|
132
|
+
const angle = k / 24 * Math.PI * 2;
|
|
133
|
+
// The 2 cm clearance from the core avoids coplanar caps; slats join the posts.
|
|
134
|
+
post(angle, k % 2 ? 0.14 : 0.42, screenRadius - 0.10, screenRadius + 0.10, screenBase, base + height);
|
|
135
|
+
if (k % 2 === 0) {
|
|
136
|
+
post(angle, 0.65, radius - 0.75, radius + 0.12, base + 0.5, base + baseHeight / 2 + 0.08);
|
|
137
|
+
post(angle, 0.48, radius - 0.75, radius - 0.20, base + baseHeight / 2 + 0.08, screenBase + 0.2);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
97
141
|
// The skins, one box to a chain of runs turning less than 30°, so the round ends carry one:
|
|
98
142
|
// a window 1.4 m wide in each 2.4 m bay, set out from the chain's middle, on every floor.
|
|
99
143
|
const towerRows = rowsFor(0.25, h.arms);
|
|
@@ -141,7 +185,8 @@ export function createSheratonGrandGeographicBuilding(record, projectPlan, offse
|
|
|
141
185
|
skin(cornerPlan, h.arms, h.corner, 1);
|
|
142
186
|
skin(wing, 0.25, h.wing, 2, tower);
|
|
143
187
|
skin(wingEnd, h.wing, h.wingEnd, 3);
|
|
144
|
-
|
|
188
|
+
// Outlining every louver adds pale rings that wash out the dark screens.
|
|
189
|
+
const model = kit.finish({ height: h.top, outlines: [shell], opacity: 0.16 });
|
|
145
190
|
model.building.position.set(offset[0], 0, offset[1]);
|
|
146
191
|
model.building.userData["geography"] = record;
|
|
147
192
|
model.building.userData["geographicDetail"] = { levels: h, source: "docs/sheraton-grand-reference.md" };
|
|
@@ -44,9 +44,9 @@ export const geographicBuildings = [
|
|
|
44
44
|
{ "id": "building-office-west-of-aon", "name": "Two Illinois Center", "shortName": "Two Illinois Center", "height": 114.3, "tipHeight": 114.3, "heightSource": "https://www.skyscrapercenter.com/chicago/two-illinois-center/11095", "note": "Detailed Two Illinois Center: the mapped outline; a dark curtain wall of 32 storeys, mullions on a 5 ft module with glass over a spandrel on every floor at the photograph's 3.55 m pitch, and the top two floors' mechanical band, to a flat roof at the Skyscraper Center's 114.3 m. From the photograph's camera its lit floors fill the lower part of the gap between Two Prudential Plaza and Aon Center, in front of River Plaza.", "footprint": { "way": 236770799, "version": 3, "coordinates": [[-87.6235661, 41.8871124], [-87.6235636, 41.8871174], [-87.6235524, 41.8871216], [-87.6225645, 41.8871339], [-87.622551, 41.8871289], [-87.6225466, 41.8871186], [-87.622541, 41.8867998], [-87.6225469, 41.8867912], [-87.6225543, 41.8867879], [-87.6225638, 41.8867865], [-87.6228061, 41.8867819], [-87.6231721, 41.8867773], [-87.6235523, 41.886775], [-87.623557, 41.8867781], [-87.6235613, 41.8867836]] }, "parts": [{ "way": 236770799, "version": 3, "coordinates": [[-87.6235661, 41.8871124], [-87.6235636, 41.8871174], [-87.6235524, 41.8871216], [-87.6225645, 41.8871339], [-87.622551, 41.8871289], [-87.6225466, 41.8871186], [-87.622541, 41.8867998], [-87.6225469, 41.8867912], [-87.6225543, 41.8867879], [-87.6225638, 41.8867865], [-87.6228061, 41.8867819], [-87.6231721, 41.8867773], [-87.6235523, 41.886775], [-87.623557, 41.8867781], [-87.6235613, 41.8867836]], "bottom": 0, "top": 114.3 }] },
|
|
45
45
|
{ "id": "building-river-plaza", "name": "River Plaza", "shortName": "River Plaza", "height": 159.7, "tipHeight": 159.7, "heightSource": "https://www.skyscrapercenter.com/chicago/river-plaza/3383", "note": "Detailed River Plaza: the mapped outline and its parts; a white concrete slab of 56 storeys with notched corners, a grid of exposed frame and punched windows over the podium on the river side, to a flat roof at OpenStreetMap's 156 m, under the box on it to the Skyscraper Center's 159.7 m, its architectural height and tip; OpenStreetMap's 166 m for the box stands over the published tip. From the photograph's camera its top fills the gap between Two Prudential Plaza and Aon Center behind Two Illinois Center, the only mapped building on that sightline tall enough to reach the drawn top.", "footprint": { "way": 285867424, "version": 6, "coordinates": [[-87.6260818, 41.8900013], [-87.6261095, 41.8899782], [-87.6261086, 41.8899259], [-87.6261285, 41.8899127], [-87.6261269, 41.8898753], [-87.6261044, 41.8898588], [-87.6261035, 41.8898229], [-87.626103, 41.8898052], [-87.6260771, 41.8897865], [-87.6259425, 41.8896905], [-87.6257902, 41.8895791], [-87.6257288, 41.8895898], [-87.6255231, 41.8896255], [-87.6255256, 41.8897934], [-87.6254949, 41.8897941], [-87.6254648, 41.889817], [-87.6254664, 41.8898714], [-87.6254461, 41.8898877], [-87.6254474, 41.8899257], [-87.6254684, 41.8899384], [-87.6254701, 41.8899906], [-87.6255035, 41.8900132], [-87.625675, 41.8900085], [-87.6256968, 41.8899927], [-87.6258816, 41.8899874], [-87.6259031, 41.8900027]] }, "parts": [{ "way": 68796725, "version": 10, "coordinates": [[-87.6254648, 41.889817], [-87.6254664, 41.8898714], [-87.6254461, 41.8898877], [-87.6254474, 41.8899257], [-87.6254684, 41.8899384], [-87.6254701, 41.8899906], [-87.6255035, 41.8900132], [-87.625675, 41.8900085], [-87.6256968, 41.8899927], [-87.6258816, 41.8899874], [-87.6259031, 41.8900027], [-87.6260818, 41.8900013], [-87.6261095, 41.8899782], [-87.6261086, 41.8899259], [-87.6261285, 41.8899127], [-87.6261269, 41.8898753], [-87.6261044, 41.8898588], [-87.6261035, 41.8898229], [-87.626103, 41.8898052], [-87.6260771, 41.8897865], [-87.6258989, 41.8897905], [-87.6258799, 41.8898052], [-87.6256906, 41.8898092], [-87.6256664, 41.8897938], [-87.6255256, 41.8897934], [-87.6254949, 41.8897941]], "bottom": 0, "top": 156 }, { "way": 68796733, "version": 5, "coordinates": [[-87.6260771, 41.8897865], [-87.6259425, 41.8896905], [-87.6257902, 41.8895791], [-87.6257288, 41.8895898], [-87.6255231, 41.8896255], [-87.6255256, 41.8897934], [-87.6256664, 41.8897938], [-87.6256906, 41.8898092], [-87.6258799, 41.8898052], [-87.6258989, 41.8897905]], "bottom": 0, "top": 8 }, { "way": 285867425, "version": 1, "coordinates": [[-87.6258543, 41.8899579], [-87.6257153, 41.8899611], [-87.6257111, 41.8898629], [-87.6258501, 41.8898597]], "bottom": 156, "top": 159.7 }] },
|
|
46
46
|
{ "id": "building-hyatt-regency-west-tower", "name": "Hyatt Regency Chicago West Tower", "shortName": "Hyatt West Tower", "height": 111.3, "tipHeight": 111.3, "heightSource": "https://www.skyscrapercenter.com/building/hyatt-regency-chicago-west-tower/13132", "note": "Detailed Hyatt Regency Chicago West Tower: its mapped part of the hotel's outline; a brick slab of 33 storeys, narrow window slots continuous from the lobby to the top two floors on a 3.5 m module between solid corners, and a plain band over them to a flat roof at the Skyscraper Center's 111.3 m. From the photograph's camera it stands between Aon Center and the Blue Cross and Blue Shield Tower, where the drawing's Blue Cross group paints a dark brown sliver.", "footprint": { "way": 235920252, "version": 4, "coordinates": [[-87.6227574, 41.887587], [-87.6228537, 41.887584], [-87.6228521, 41.8874603], [-87.6228518, 41.8874165], [-87.6225427, 41.8874231], [-87.6225408, 41.8875106], [-87.6225253, 41.8875109], [-87.6225266, 41.8875277], [-87.6225277, 41.8875513], [-87.622528, 41.8875746], [-87.6225382, 41.8878947], [-87.62255, 41.8878954], [-87.6225496, 41.8879846], [-87.6228658, 41.8879789], [-87.6228643, 41.8879388], [-87.6228611, 41.8878099], [-87.6227664, 41.8878103]] }, "parts": [{ "way": 235920252, "version": 4, "coordinates": [[-87.6227574, 41.887587], [-87.6228537, 41.887584], [-87.6228521, 41.8874603], [-87.6228518, 41.8874165], [-87.6225427, 41.8874231], [-87.6225408, 41.8875106], [-87.6225253, 41.8875109], [-87.6225266, 41.8875277], [-87.6225277, 41.8875513], [-87.622528, 41.8875746], [-87.6225382, 41.8878947], [-87.62255, 41.8878954], [-87.6225496, 41.8879846], [-87.6228658, 41.8879789], [-87.6228643, 41.8879388], [-87.6228611, 41.8878099], [-87.6227664, 41.8878103]], "bottom": 0, "top": 111.3 }] },
|
|
47
|
-
{ "id": "building-buckingham-east", "name": "Sheraton Grand Chicago Riverwalk", "shortName": "Sheraton Grand", "height": 112.3, "tipHeight": 112.3, "heightSource": "https://www.skyscrapercenter.com/building/sheraton-chicago-hotel-towers/10020", "note": "Detailed Sheraton Grand Chicago Riverwalk: the mapped tower and its corner part; a cream precast tower on an L of punched windows at Emporis's 2.67 m floor-to-floor, its arms to 94.76 m, the corner's round tower two floors higher to 100.1 m, and
|
|
47
|
+
{ "id": "building-buckingham-east", "name": "Sheraton Grand Chicago Riverwalk", "shortName": "Sheraton Grand", "height": 112.3, "tipHeight": 112.3, "heightSource": "https://www.skyscrapercenter.com/building/sheraton-chicago-hotel-towers/10020", "note": "Detailed Sheraton Grand Chicago Riverwalk: the mapped tower and its corner part; a cream precast tower on an L of punched windows at Emporis's 2.67 m floor-to-floor, its arms to 94.76 m, the corner's round tower two floors higher to 100.1 m, and pale stepped frames under dark louvered screens on all four round ends, with the smaller bases approximated from the principal frame. The main crown reaches the Skyscraper Center's 112.3 m. Heights stand on the Skyscraper Center's datum: its top floor at 97 m, a floor-to-roof of 3.1 m and a 12.2 m main crown from Emporis; photographic ratios estimate about 7.2 m crowns on the arms and 6 m on the east wing; the published height nearest the drawing's reading, over Emporis's 330.56 ft. The Skyscraper Center's 112.8 m tip, 50 cm over the drum, is not modelled. The drawing's buckingham-east group is its corner's lit drum over its tower. The mapped east wing and its round end continue the hotel to the east, with estimated roofs at 84.08 m and 86.75 m on the same height datum and a fourth crown. Photographs from before 2013 establish the wing; exact roof and crown dimensions remain inferred.", "footprint": { "way": 592122464, "version": 5, "coordinates": [[-87.6199499, 41.8891119], [-87.6199176, 41.8893381], [-87.6199306, 41.8893589], [-87.6199502, 41.8893716], [-87.6199845, 41.8893878], [-87.6200276, 41.8893957], [-87.6200732, 41.8893915], [-87.6201147, 41.8893744], [-87.6201372, 41.8893482], [-87.6201463, 41.8893162], [-87.6201584, 41.8892447], [-87.6201841, 41.889063], [-87.6201875, 41.8890302], [-87.6201812, 41.8889946], [-87.6201588, 41.8889641], [-87.620121, 41.8889384], [-87.6200743, 41.8889276], [-87.6196505, 41.8888958], [-87.6196025, 41.8889162], [-87.6195726, 41.8889427], [-87.6195591, 41.8889735], [-87.6195627, 41.8890068], [-87.6195846, 41.8890373], [-87.6196228, 41.8890638], [-87.6198263, 41.8890777], [-87.6198225, 41.889104]] }, "parts": [{ "way": 592122464, "version": 5, "coordinates": [[-87.6199499, 41.8891119], [-87.6199176, 41.8893381], [-87.6199306, 41.8893589], [-87.6199502, 41.8893716], [-87.6199845, 41.8893878], [-87.6200276, 41.8893957], [-87.6200732, 41.8893915], [-87.6201147, 41.8893744], [-87.6201372, 41.8893482], [-87.6201463, 41.8893162], [-87.6201584, 41.8892447], [-87.6201841, 41.889063], [-87.6201875, 41.8890302], [-87.6201812, 41.8889946], [-87.6201588, 41.8889641], [-87.620121, 41.8889384], [-87.6200743, 41.8889276], [-87.6196505, 41.8888958], [-87.6196025, 41.8889162], [-87.6195726, 41.8889427], [-87.6195591, 41.8889735], [-87.6195627, 41.8890068], [-87.6195846, 41.8890373], [-87.6196228, 41.8890638], [-87.6198263, 41.8890777], [-87.6198225, 41.889104]], "bottom": 0, "top": 94.76 }, { "way": 1269924307, "version": 1, "coordinates": [[-87.6199691, 41.8890378], [-87.6199677, 41.889013], [-87.6199719, 41.8889952], [-87.6199903, 41.8889744], [-87.6200135, 41.88896], [-87.6200416, 41.8889517], [-87.6200717, 41.8889503], [-87.6201037, 41.8889568], [-87.6201308, 41.8889711], [-87.6201498, 41.8889914], [-87.6201583, 41.8890152], [-87.6201555, 41.8890398], [-87.6201415, 41.8890622], [-87.6201241, 41.8890776], [-87.6200882, 41.8890904], [-87.6200552, 41.8890928], [-87.6200258, 41.8890875], [-87.6200001, 41.8890757], [-87.6199805, 41.8890586]], "bottom": 94.76, "top": 100.1 }, { "way": 1269924305, "version": 1, "coordinates": [[-87.6191033, 41.8890226], [-87.6190622, 41.8889954], [-87.6190428, 41.8889627], [-87.6190431, 41.8889236], [-87.6190607, 41.8888928], [-87.619091, 41.8888724], [-87.6191278, 41.8888566], [-87.6193634, 41.8888743], [-87.6196505, 41.8888958], [-87.6196025, 41.8889162], [-87.6195726, 41.8889427], [-87.6195591, 41.8889735], [-87.6195627, 41.8890068], [-87.6195846, 41.8890373], [-87.6196228, 41.8890638]], "bottom": 0, "top": 84.08, "estimatedHeight": true }, { "way": 1269924304, "version": 1, "coordinates": [[-87.619112, 41.8888866], [-87.61909, 41.8888996], [-87.6190746, 41.888917], [-87.6190672, 41.8889372], [-87.6190685, 41.8889581], [-87.6190786, 41.8889777], [-87.6190963, 41.8889939], [-87.6191199, 41.8890052], [-87.6191471, 41.8890105], [-87.6191778, 41.8890088], [-87.6192059, 41.8889994], [-87.619228, 41.8889835], [-87.6192416, 41.8889629], [-87.6192449, 41.8889401], [-87.6192376, 41.8889179], [-87.6192207, 41.8888988], [-87.6191959, 41.8888851], [-87.6191665, 41.8888785], [-87.6191384, 41.8888793]], "bottom": 84.08, "top": 86.75, "estimatedHeight": true }], "groundFootprintWays": [592122464, 1269924305] },
|
|
48
48
|
{ "id": "building-three-illinois-center", "name": "Three Illinois Center", "shortName": "Three Illinois Center", "height": 106.7, "tipHeight": 106.7, "heightSource": "https://www.skyscrapercenter.com/building/three-illinois-center/13913", "note": "Detailed Three Illinois Center: the mapped outline; a dark bronze curtain wall of 30 storeys, mullions on a 5 ft module and glass over a spandrel on each floor at the published 11.5 ft slab to slab over a 5.06 m lobby, and the top two floors' windowless mechanical penthouse, glazed about 2019 but kept as the 2013 photograph shows it, under a flat roof at the Skyscraper Center's and Emporis's 350 ft. Its east end fills the gap between 340 on the Park and The Buckingham, where the drawing's buckingham-west group paints an office tower whose top stands about 140 layer units higher.", "footprint": { "way": 95486958, "version": 12, "coordinates": [[-87.6204966, 41.8869542], [-87.6202534, 41.8869566], [-87.6200384, 41.8869571], [-87.6200396, 41.887005], [-87.6200455, 41.8873733], [-87.620058, 41.8876286], [-87.6205101, 41.8876189], [-87.6205054, 41.8873683]] }, "parts": [{ "way": 95486958, "version": 12, "coordinates": [[-87.6204966, 41.8869542], [-87.6202534, 41.8869566], [-87.6200384, 41.8869571], [-87.6200396, 41.887005], [-87.6200455, 41.8873733], [-87.620058, 41.8876286], [-87.6205101, 41.8876189], [-87.6205054, 41.8873683]], "bottom": 0, "top": 106.7 }] },
|
|
49
|
-
{ "id": "building-swissotel", "name": "Swissôtel Chicago", "shortName": "Swissôtel", "height": 139.3, "tipHeight": 139.3, "heightSource": "https://www.skyscrapercenter.com/building/swissotel-chicago/4362", "note": "Detailed Swissôtel Chicago: the hotel's mapped tower part, a triangle; a flush grid of reflective
|
|
49
|
+
{ "id": "building-swissotel", "name": "Swissôtel Chicago", "shortName": "Swissôtel", "height": 139.3, "tipHeight": 139.3, "heightSource": "https://www.skyscrapercenter.com/building/swissotel-chicago/4362", "note": "Detailed Swissôtel Chicago: the hotel's mapped tower part, a triangle; a flush grid of reflective vision windows above pale opaque floor bands, with thin mullions about 1.5 m apart and paired transoms in each of 45 retained modules. The bands take about 45% of each module from 2012 photographic ratios; precise occupied-floor and mechanical-row counts remain unresolved. The flat roof stays at the Skyscraper Center's 139.3 m. It stands behind Three Illinois Center and The Buckingham from the drawing's camera, and fills the seam where their corners meet. The hotel's outline, 95486966, adds a small block on the tower's north-east face, and its podium, 95486953, carries no height; neither is modelled.", "footprint": { "way": 641288601, "version": 3, "coordinates": [[-87.6194102, 41.8874254], [-87.619534, 41.8875706], [-87.619676, 41.8873866], [-87.6198184, 41.8871906], [-87.6192311, 41.8871971], [-87.619375, 41.8873843]] }, "parts": [{ "way": 641288601, "version": 3, "coordinates": [[-87.6194102, 41.8874254], [-87.619534, 41.8875706], [-87.619676, 41.8873866], [-87.6198184, 41.8871906], [-87.6192311, 41.8871971], [-87.619375, 41.8873843]], "bottom": 0, "top": 139.3 }] },
|
|
50
50
|
];
|
|
51
51
|
// Every vehicular street on the upper or surface level across the 3D skyline's ground, from
|
|
52
52
|
// a separate extract retrieved 2026-09-30: OpenStreetMap's roads and their links, and its
|
|
@@ -7,24 +7,27 @@ import { chainSkin, chainsOf, orient, paintedSlab, planOf, turnsAt } from "./fac
|
|
|
7
7
|
// the seam where their corners meet.
|
|
8
8
|
//
|
|
9
9
|
// A triangular tower of reflective glass: a flush grid of thin mullions about 1.5 m apart and
|
|
10
|
-
//
|
|
10
|
+
// paired opaque spandrel / vision panels at each floor, under a flat roof at the published 139.3 m. The
|
|
11
11
|
// floors divide that height by OpenStreetMap's 45 levels. See docs/swissotel-reference.md.
|
|
12
12
|
// Units are meters; +x is east, +z is south.
|
|
13
13
|
export const swissotelLevels = Object.freeze({
|
|
14
|
-
levels: 45, //
|
|
14
|
+
levels: 45, // retained module count; OSM and Enclos both report 45 storeys
|
|
15
15
|
roof: 139.3, // the published height, the Skyscraper Center's 457 ft
|
|
16
16
|
module: 1.5, // the mullions' spacing, read on the photographs
|
|
17
|
+
spandrel: 1.4, // about 45% of the retained floor pitch; 2012 photographs, ±0.2 m
|
|
17
18
|
frame: 0.06, // each mullion's and transom's width
|
|
18
19
|
coping: 0.1, // the roof's coping over the top panel
|
|
19
20
|
});
|
|
20
21
|
const h = swissotelLevels;
|
|
21
22
|
const pitch = h.roof / h.levels;
|
|
22
|
-
//
|
|
23
|
-
|
|
23
|
+
// Window tones are distinct from frames and opaque spandrels. The pale band
|
|
24
|
+
// is an explicit grey fallback, not a calibrated sunny-day colour.
|
|
25
|
+
export const swissotelPalette = Object.freeze({ glass: [0x2d2d2d, 0x313131, 0x353535, 0x292929], lit: 0x878787, dim: 0x515151, frame: 0x414141, spandrel: 0x909090 });
|
|
24
26
|
const palette = swissotelPalette;
|
|
25
27
|
const color = (hex) => new THREE.Color(hex);
|
|
26
28
|
const glassTones = palette.glass.map(color);
|
|
27
29
|
const litGlass = color(palette.lit), dimGlass = color(palette.dim), frame = color(palette.frame);
|
|
30
|
+
const spandrel = color(palette.spandrel);
|
|
28
31
|
const core = color(0x1e1e1e), roofing = color(0x323232);
|
|
29
32
|
function paneColor(row, bay, wall) {
|
|
30
33
|
const hash = (Math.imul(row + 71, 0x9e3779b1) ^ Math.imul(bay + 13, 0x85ebca77) ^ Math.imul(wall + 47, 0xc2b2ae3d)) >>> 0;
|
|
@@ -38,7 +41,10 @@ function paneColor(row, bay, wall) {
|
|
|
38
41
|
export const swissotelRows = [];
|
|
39
42
|
for (let n = 1; n <= h.levels; n += 1) {
|
|
40
43
|
const lo = n === 1 ? 0.25 : (n - 1) * pitch + h.frame / 2, hi = n === h.levels ? h.roof - h.coping : n * pitch - h.frame / 2;
|
|
41
|
-
|
|
44
|
+
const split = (n - 1) * pitch + h.spandrel;
|
|
45
|
+
swissotelRows.push({ lo, hi: split - h.frame / 2, kind: "spandrel", floor: n });
|
|
46
|
+
swissotelRows.push({ lo: split - h.frame / 2, hi: split + h.frame / 2, kind: "frame", floor: n });
|
|
47
|
+
swissotelRows.push({ lo: split + h.frame / 2, hi, kind: "glass", floor: n });
|
|
42
48
|
swissotelRows.push({ lo: hi, hi: n === h.levels ? h.roof : n * pitch + h.frame / 2, kind: "frame", floor: n });
|
|
43
49
|
}
|
|
44
50
|
const rows = swissotelRows;
|
|
@@ -68,6 +74,8 @@ export function createSwissotelGeographicBuilding(record, projectPlan, offset) {
|
|
|
68
74
|
const row = rows[r], middle = (columns[bay - 1] + columns[bay]) / 2;
|
|
69
75
|
if (row.kind === "frame" || lines.some((c) => Math.abs(middle - c) < h.frame / 2))
|
|
70
76
|
return frame;
|
|
77
|
+
if (row.kind === "spandrel")
|
|
78
|
+
return spandrel;
|
|
71
79
|
return paneColor(row.floor, bay, index);
|
|
72
80
|
}, frame);
|
|
73
81
|
});
|
package/site/skyline-3d.html
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<span class="visually-hidden">Preparing the skyline…</span>
|
|
17
17
|
<!-- skyline-loading:start -->
|
|
18
18
|
<svg class="skyline-trace" viewBox="0 0 1000 379.13" aria-hidden="true" focusable="false">
|
|
19
|
-
<defs><path id="skyline-loading-outline" pathLength="1" d="M0 379.13 L24 379.13 L24 317.67 L36.32 311.43 L74.67 311.43 L77.22 312.72 L77.46 311.68 L85.82 311.68 L86.06 307.48 L130.22 307.99 L130.45 308.97 L130.91 308.97 L131.15 307.99 L160.43 307.99 L160.9 312.71 L176.7 312.71 L176.93 319.92 L184.6 319.92 L185.53 321.04 L202.27 321.04 L202.5 319.71 L203.2 319.28 L203.66 322.05 L206.68 328.57 L206.92 325.5 L208.31 325.5 L208.54 334.72 L210.63 334.72 L210.87 338.85 L228.3 338.85 L228.53 310.05 L232.25 310.05 L232.48 300.18 L236.2 300.18 L236.43 273.16 L238.29 273.16 L238.53 265.43 L239.46 265.43 L239.69 264.58 L242.94 264.58 L243.17 265.69 L245.03 265.69 L245.27 264.58 L247.13 264.58 L247.36 265.69 L248.52 265.43 L248.75 264.58 L250.84 264.58 L251.08 265.43 L251.77 265.43 L252.24 273.16 L253.87 273.16 L254.1 310.05 L254.56 307.48 L256.65 307.48 L256.89 310.05 L258.05 310.05 L258.28 307.48 L260.84 307.48 L261.07 324.55 L265.25 324.55 L265.49 312.2 L267.11 312.2 L267.35 305.33 L281.29 305.33 L281.52 308.77 L292.45 308.77 L292.68 302.35 L303.14 302.32 L303.37 223.64 L314.29 223.64 L314.53 216.27 L321.96 216.27 L322.2 214.04 L339.86 214.22 L340.09 223.64 L342.88 223.64 L343.12 242.7 L371.7 242.7 L371.94 372.43 L376.35 372.43 L376.58 255.25 L395.41 227.09 L396.11 226.91 L398.9 245.87 L399.36 245.89 L399.59 226.91 L400.06 226.91 L427.02 256.11 L427.25 305.08 L432.13 305.08 L432.37 197.36 L499.54 197.36 L499.77 221.93 L513.71 221.93 L513.95 75.03 L533.24 75.03 L533.47 66.02 L545.79 66.02 L546.72 16 L547.88 16 L548.81 66.02 L555.78 66.02 L556.01 81.13 L556.94 81.13 L557.18 149.08 L563.45 140.02 L563.92 125.57 L564.38 124.48 L564.61 118.88 L565.78 140.14 L579.02 159.17 L581.81 168.47 L582.04 171.95 L583.67 171.95 L583.9 175.35 L585.3 175.35 L585.53 178.75 L586.93 178.75 L587.16 182.14 L588.55 182.14 L588.79 327.64 L589.25 369.24 L591.81 369.24 L592.04 87.39 L605.29 87.39 L605.52 81.98 L623.65 81.98 L623.88 68.08 L624.81 68.08 L625.04 81.98 L643.17 81.98 L643.4 87.39 L656.42 87.39 L656.65 197.22 L656.88 184.61 L727.31 184.61 L727.77 197.22 L734.28 197.22 L734.51 203.31 L777.98 203.31 L778.44 211.51 L778.67 287.57 L783.55 287.57 L783.79 277.02 L795.41 277.02 L795.64 274.53 L813.77 274.53 L814 277.02 L824.23 277.02 L824.46 283.38 L824.93 283.38 L825.16 287.57 L830.74 287.57 L830.97 259.6 L868.85 259.6 L869.09 379.13 L910.69 379.13 L910.92 297.82 L912.78 297.82 L913.
|
|
19
|
+
<defs><path id="skyline-loading-outline" pathLength="1" d="M0 379.13 L24 379.13 L24 317.67 L36.32 311.43 L74.67 311.43 L77.22 312.72 L77.46 311.68 L85.82 311.68 L86.06 307.48 L130.22 307.99 L130.45 308.97 L130.91 308.97 L131.15 307.99 L160.43 307.99 L160.9 312.71 L176.7 312.71 L176.93 319.92 L184.6 319.92 L185.53 321.04 L202.27 321.04 L202.5 319.71 L203.2 319.28 L203.66 322.05 L206.68 328.57 L206.92 325.5 L208.31 325.5 L208.54 334.72 L210.63 334.72 L210.87 338.85 L228.3 338.85 L228.53 310.05 L232.25 310.05 L232.48 300.18 L236.2 300.18 L236.43 273.16 L238.29 273.16 L238.53 265.43 L239.46 265.43 L239.69 264.58 L242.94 264.58 L243.17 265.69 L245.03 265.69 L245.27 264.58 L247.13 264.58 L247.36 265.69 L248.52 265.43 L248.75 264.58 L250.84 264.58 L251.08 265.43 L251.77 265.43 L252.24 273.16 L253.87 273.16 L254.1 310.05 L254.56 307.48 L256.65 307.48 L256.89 310.05 L258.05 310.05 L258.28 307.48 L260.84 307.48 L261.07 324.55 L265.25 324.55 L265.49 312.2 L267.11 312.2 L267.35 305.33 L281.29 305.33 L281.52 308.77 L292.45 308.77 L292.68 302.35 L303.14 302.32 L303.37 223.64 L314.29 223.64 L314.53 216.27 L321.96 216.27 L322.2 214.04 L339.86 214.22 L340.09 223.64 L342.88 223.64 L343.12 242.7 L371.7 242.7 L371.94 372.43 L376.35 372.43 L376.58 255.25 L395.41 227.09 L396.11 226.91 L398.9 245.87 L399.36 245.89 L399.59 226.91 L400.06 226.91 L427.02 256.11 L427.25 305.08 L432.13 305.08 L432.37 197.36 L499.54 197.36 L499.77 221.93 L513.71 221.93 L513.95 75.03 L533.24 75.03 L533.47 66.02 L545.79 66.02 L546.72 16 L547.88 16 L548.81 66.02 L555.78 66.02 L556.01 81.13 L556.94 81.13 L557.18 149.08 L563.45 140.02 L563.92 125.57 L564.38 124.48 L564.61 118.88 L565.78 140.14 L579.02 159.17 L581.81 168.47 L582.04 171.95 L583.67 171.95 L583.9 175.35 L585.3 175.35 L585.53 178.75 L586.93 178.75 L587.16 182.14 L588.55 182.14 L588.79 327.64 L589.25 369.24 L591.81 369.24 L592.04 87.39 L605.29 87.39 L605.52 81.98 L623.65 81.98 L623.88 68.08 L624.81 68.08 L625.04 81.98 L643.17 81.98 L643.4 87.39 L656.42 87.39 L656.65 197.22 L656.88 184.61 L727.31 184.61 L727.77 197.22 L734.28 197.22 L734.51 203.31 L777.98 203.31 L778.44 211.51 L778.67 287.57 L783.55 287.57 L783.79 277.02 L795.41 277.02 L795.64 274.53 L813.77 274.53 L814 277.02 L824.23 277.02 L824.46 283.38 L824.93 283.38 L825.16 287.57 L830.74 287.57 L830.97 259.6 L868.85 259.6 L869.09 379.13 L910.69 379.13 L910.92 297.82 L912.78 297.82 L913.48 282.77 L926.26 282.77 L926.96 297.82 L931.14 297.82 L931.84 291.64 L946.02 291.64 L946.71 297.82 L948.34 297.82 L948.57 306.98 L961.13 306.98 L961.82 299.54 L973.68 299.54 L974.37 306.98 L976 306.98 L976 379.13 L1000 379.13" /></defs>
|
|
20
20
|
<use class="skyline-trace-rail" href="#skyline-loading-outline" />
|
|
21
21
|
<use class="skyline-trace-line" href="#skyline-loading-outline" />
|
|
22
22
|
<use class="skyline-trace-tip" href="#skyline-loading-outline" />
|