@a2f0/skyline 0.0.0-stage → 0.1.2
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/NOTICE.md +20 -0
- package/README.md +52 -2
- package/docs/package.md +224 -0
- package/docs/skyline-geography.md +503 -0
- package/lib/models/aon-center.d.ts +4 -0
- package/lib/models/aon-center.js +60 -0
- package/lib/models/aon-geographic.d.ts +9 -0
- package/lib/models/aon-geographic.js +35 -0
- package/lib/models/aon-tower.d.ts +23 -0
- package/lib/models/aon-tower.js +130 -0
- package/lib/models/blue-cross-geographic.d.ts +14 -0
- package/lib/models/blue-cross-geographic.js +248 -0
- package/lib/models/borg-warner-geographic.d.ts +20 -0
- package/lib/models/borg-warner-geographic.js +143 -0
- package/lib/models/buckingham-geographic.d.ts +10 -0
- package/lib/models/buckingham-geographic.js +121 -0
- package/lib/models/building-kit.d.ts +84 -0
- package/lib/models/building-kit.js +358 -0
- package/lib/models/celebrations.d.ts +39 -0
- package/lib/models/celebrations.js +44 -0
- package/lib/models/chicago-athletic-association-geographic.d.ts +32 -0
- package/lib/models/chicago-athletic-association-geographic.js +173 -0
- package/lib/models/crain-communications.d.ts +5 -0
- package/lib/models/crain-communications.js +75 -0
- package/lib/models/crain-geographic.d.ts +10 -0
- package/lib/models/crain-geographic.js +69 -0
- package/lib/models/crain-tower.d.ts +32 -0
- package/lib/models/crain-tower.js +378 -0
- package/lib/models/facade-grid.d.ts +18 -0
- package/lib/models/facade-grid.js +176 -0
- package/lib/models/gage-geographic.d.ts +19 -0
- package/lib/models/gage-geographic.js +154 -0
- package/lib/models/heritage-at-millennium-park.d.ts +3 -0
- package/lib/models/heritage-at-millennium-park.js +284 -0
- package/lib/models/heritage-geographic.d.ts +11 -0
- package/lib/models/heritage-geographic.js +208 -0
- package/lib/models/hyatt-west-tower-geographic.d.ts +26 -0
- package/lib/models/hyatt-west-tower-geographic.js +86 -0
- package/lib/models/keith-ascher-geographic.d.ts +29 -0
- package/lib/models/keith-ascher-geographic.js +110 -0
- package/lib/models/kemper-geographic.d.ts +8 -0
- package/lib/models/kemper-geographic.js +153 -0
- package/lib/models/kemper.d.ts +2 -0
- package/lib/models/kemper.js +78 -0
- package/lib/models/lake-view-geographic.d.ts +15 -0
- package/lib/models/lake-view-geographic.js +134 -0
- package/lib/models/maclean-center-geographic.d.ts +20 -0
- package/lib/models/maclean-center-geographic.js +162 -0
- package/lib/models/michigan-boulevard-geographic.d.ts +12 -0
- package/lib/models/michigan-boulevard-geographic.js +157 -0
- package/lib/models/michigan-plaza-south-geographic.d.ts +7 -0
- package/lib/models/michigan-plaza-south-geographic.js +84 -0
- package/lib/models/michigan-plaza-south.d.ts +2 -0
- package/lib/models/michigan-plaza-south.js +68 -0
- package/lib/models/millennium-park-plaza-geographic.d.ts +9 -0
- package/lib/models/millennium-park-plaza-geographic.js +103 -0
- package/lib/models/monroe-geographic.d.ts +19 -0
- package/lib/models/monroe-geographic.js +177 -0
- package/lib/models/north-michigan-180-geographic.d.ts +14 -0
- package/lib/models/north-michigan-180-geographic.js +117 -0
- package/lib/models/north-wabash-geographic.d.ts +14 -0
- package/lib/models/north-wabash-geographic.js +122 -0
- package/lib/models/on-the-park-geographic.d.ts +11 -0
- package/lib/models/on-the-park-geographic.js +245 -0
- package/lib/models/one-prudential-geographic.d.ts +12 -0
- package/lib/models/one-prudential-geographic.js +55 -0
- package/lib/models/one-prudential-plaza.d.ts +5 -0
- package/lib/models/one-prudential-plaza.js +72 -0
- package/lib/models/one-prudential-tower.d.ts +45 -0
- package/lib/models/one-prudential-tower.js +246 -0
- package/lib/models/peoples-gas-geographic.d.ts +23 -0
- package/lib/models/peoples-gas-geographic.js +250 -0
- package/lib/models/railway-exchange-geographic.d.ts +18 -0
- package/lib/models/railway-exchange-geographic.js +176 -0
- package/lib/models/river-plaza-geographic.d.ts +16 -0
- package/lib/models/river-plaza-geographic.js +104 -0
- package/lib/models/sheraton-grand-geographic.d.ts +24 -0
- package/lib/models/sheraton-grand-geographic.js +112 -0
- package/lib/models/six-north-michigan-geographic.d.ts +16 -0
- package/lib/models/six-north-michigan-geographic.js +180 -0
- package/lib/models/skyline-geography-data.d.ts +44 -0
- package/lib/models/skyline-geography-data.js +607 -0
- package/lib/models/skyline-geography.d.ts +23 -0
- package/lib/models/skyline-geography.js +322 -0
- package/lib/models/swissotel-geographic.d.ts +24 -0
- package/lib/models/swissotel-geographic.js +79 -0
- package/lib/models/three-illinois-center-geographic.d.ts +26 -0
- package/lib/models/three-illinois-center-geographic.js +86 -0
- package/lib/models/trump-geographic.d.ts +14 -0
- package/lib/models/trump-geographic.js +51 -0
- package/lib/models/trump-international-tower.d.ts +4 -0
- package/lib/models/trump-international-tower.js +84 -0
- package/lib/models/trump-tower.d.ts +43 -0
- package/lib/models/trump-tower.js +229 -0
- package/lib/models/two-illinois-center-geographic.d.ts +26 -0
- package/lib/models/two-illinois-center-geographic.js +85 -0
- package/lib/models/two-prudential-geographic.d.ts +25 -0
- package/lib/models/two-prudential-geographic.js +47 -0
- package/lib/models/two-prudential-plaza.d.ts +8 -0
- package/lib/models/two-prudential-plaza.js +55 -0
- package/lib/models/two-prudential-tower.d.ts +53 -0
- package/lib/models/two-prudential-tower.js +441 -0
- package/lib/models/university-club-geographic.d.ts +24 -0
- package/lib/models/university-club-geographic.js +217 -0
- package/lib/models/willoughby-tower-geographic.d.ts +17 -0
- package/lib/models/willoughby-tower-geographic.js +195 -0
- package/lib/models/window-illumination.d.ts +14 -0
- package/lib/models/window-illumination.js +64 -0
- package/lib/package-assets.d.ts +5 -0
- package/lib/package-assets.js +9 -0
- package/lib/skyline-package.d.ts +23 -0
- package/lib/skyline-package.js +25 -0
- package/lib/skyline-scene.d.ts +25 -0
- package/lib/skyline-scene.js +86 -0
- package/lib/study-types.d.ts +49 -0
- package/lib/study-types.js +1 -0
- package/lib/vendor/three-r186.d.ts +1 -0
- package/lib/vendor/three-r186.js +1 -0
- package/package.json +64 -4
- package/site/building-detail.html +54 -0
- package/site/building-detail.js +84 -0
- package/site/building-study.html +58 -0
- package/site/building-study.js +3 -0
- package/site/index.html +407 -0
- package/site/models/aon-center.js +60 -0
- package/site/models/aon-geographic.js +35 -0
- package/site/models/aon-tower.js +130 -0
- package/site/models/blue-cross-geographic.js +248 -0
- package/site/models/borg-warner-geographic.js +143 -0
- package/site/models/buckingham-geographic.js +121 -0
- package/site/models/building-kit.js +358 -0
- package/site/models/celebrations.js +44 -0
- package/site/models/chicago-athletic-association-geographic.js +173 -0
- package/site/models/crain-communications.js +75 -0
- package/site/models/crain-geographic.js +69 -0
- package/site/models/crain-reference.svg +10 -0
- package/site/models/crain-tower.js +378 -0
- package/site/models/facade-grid.js +176 -0
- package/site/models/gage-geographic.js +154 -0
- package/site/models/heritage-at-millennium-park.js +284 -0
- package/site/models/heritage-geographic.js +208 -0
- package/site/models/hyatt-west-tower-geographic.js +86 -0
- package/site/models/keith-ascher-geographic.js +110 -0
- package/site/models/kemper-geographic.js +153 -0
- package/site/models/kemper.js +78 -0
- package/site/models/lake-view-geographic.js +134 -0
- package/site/models/maclean-center-geographic.js +162 -0
- package/site/models/michigan-boulevard-geographic.js +157 -0
- package/site/models/michigan-plaza-south-geographic.js +84 -0
- package/site/models/michigan-plaza-south.js +68 -0
- package/site/models/millennium-park-plaza-geographic.js +103 -0
- package/site/models/monroe-geographic.js +177 -0
- package/site/models/north-michigan-180-geographic.js +117 -0
- package/site/models/north-wabash-geographic.js +122 -0
- package/site/models/on-the-park-geographic.js +245 -0
- package/site/models/one-prudential-geographic.js +55 -0
- package/site/models/one-prudential-plaza.js +72 -0
- package/site/models/one-prudential-tower.js +246 -0
- package/site/models/peoples-gas-geographic.js +250 -0
- package/site/models/railway-exchange-geographic.js +176 -0
- package/site/models/river-plaza-geographic.js +104 -0
- package/site/models/sheraton-grand-geographic.js +112 -0
- package/site/models/six-north-michigan-geographic.js +180 -0
- package/site/models/skyline-geography-data.js +607 -0
- package/site/models/skyline-geography.js +322 -0
- package/site/models/skyline-panorama.svg +3491 -0
- package/site/models/skyline-reference.svg +3090 -0
- package/site/models/swissotel-geographic.js +79 -0
- package/site/models/three-illinois-center-geographic.js +86 -0
- package/site/models/trump-geographic.js +51 -0
- package/site/models/trump-international-tower.js +84 -0
- package/site/models/trump-tower.js +229 -0
- package/site/models/two-illinois-center-geographic.js +85 -0
- package/site/models/two-prudential-geographic.js +47 -0
- package/site/models/two-prudential-plaza.js +55 -0
- package/site/models/two-prudential-tower.js +441 -0
- package/site/models/university-club-geographic.js +217 -0
- package/site/models/willoughby-tower-geographic.js +195 -0
- package/site/models/window-illumination.js +64 -0
- package/site/skyline-3d.html +92 -0
- package/site/skyline-3d.js +333 -0
- package/site/skyline-animated.svg +18795 -0
- package/site/skyline-comparison.js +97 -0
- package/site/skyline-original-fit.svg +18312 -0
- package/site/skyline-scene.js +86 -0
- package/site/skyline-study.html +83 -0
- package/site/skyline-study.js +109 -0
- package/site/skyline-webgl.html +667 -0
- package/site/stars.svg +176 -0
- package/site/study-loader.js +20 -0
- package/site/study-types.js +1 -0
- package/site/study-viewer.js +605 -0
- package/site/study.css +204 -0
- package/site/vendor/THREE-LICENSE.txt +21 -0
- package/site/vendor/three-r186.js +4228 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { geographicBuildings } from "./models/skyline-geography-data.js";
|
|
2
|
+
import { createGeographicBuilding, createGeographicGround } from "./models/skyline-geography.js";
|
|
3
|
+
// The panorama's viewBox, models/skyline-panorama.svg, in the drawing's layer units. Its
|
|
4
|
+
// centre is the skyline camera's sightline and its height the camera's vertical field of view.
|
|
5
|
+
const panorama = { x: -1400, y: -154.834, width: 9378.476, height: 3535.05 };
|
|
6
|
+
// The frame index.html shows the drawing in: skyline-animated.svg's viewBox, bottom-aligned
|
|
7
|
+
// and centred, in the same layer units. The file's `skyline-position` group translates the
|
|
8
|
+
// layer by (1105.5923, -87.26366) inside its viewBox.
|
|
9
|
+
const drawingFrame = { x: -1105.5923, y: 87.26366, width: 8501.0986, height: 2782.0373 };
|
|
10
|
+
// The direction the drawing's camera looks from, south-east of the skyline: its azimuth from
|
|
11
|
+
// south toward east. A building's detail faces it the same way.
|
|
12
|
+
export const skylineAzimuth = 36.1247 * Math.PI / 180;
|
|
13
|
+
// The geographic skyline, registered with Crain's mapped centre at `anchor`: every mapped
|
|
14
|
+
// building, their ground, the settings a study shows them with, and the drawing's camera.
|
|
15
|
+
export function createGeographicSkyline(anchor = [0, 0, 0]) {
|
|
16
|
+
const offset = [anchor[0], anchor[2]];
|
|
17
|
+
const models = geographicBuildings.map((record) => createGeographicBuilding(record, offset));
|
|
18
|
+
const ground = createGeographicGround(offset);
|
|
19
|
+
// The comparison views share a frame set in ground plan, which holds both layouts: the
|
|
20
|
+
// original's platform, and every mapped footprint, from 330 North Wabash's west side to
|
|
21
|
+
// The Buckingham's east, with about 50 m east and west even where a portrait phone's
|
|
22
|
+
// width binds the frame. North and south it runs from about 100 m past River Plaza's north
|
|
23
|
+
// side, across the river, to 127 m past the Railway Exchange's mapped south side at
|
|
24
|
+
// Jackson. Height comparison sees it at an angle, and on a portrait phone can clip the
|
|
25
|
+
// platform's south-west corner.
|
|
26
|
+
const center = [anchor[0] + 128, 0, anchor[2] + 85];
|
|
27
|
+
const planFit = { width: 1050, height: 1520 };
|
|
28
|
+
const settings = {
|
|
29
|
+
target: [center[0], 155, center[2]],
|
|
30
|
+
fit: { width: 1100, height: 950 },
|
|
31
|
+
platform: { width: 1200, depth: 1600, x: center[0], z: center[2] },
|
|
32
|
+
clippingMargin: 1800,
|
|
33
|
+
lightPosition: [-700, 1100, 500],
|
|
34
|
+
// Wide enough for the platform's far corners, which the geography suite checks.
|
|
35
|
+
shadowCamera: { left: -1300, right: 1300, top: 1300, bottom: -1300, near: 1, far: 2600 },
|
|
36
|
+
};
|
|
37
|
+
// The drawing traces a lakefront photograph. Fitting the mapped buildings'
|
|
38
|
+
// roofs and tips to their drawn positions (scripts/fit-geographic-camera.ts)
|
|
39
|
+
// puts its eye on the shore by the Adler Planetarium, 2 m above the street
|
|
40
|
+
// datum, looking up at the skyline; it is held there while the angles and lens
|
|
41
|
+
// are refitted, since the drawing barely tells its distance from its lens. The
|
|
42
|
+
// buildings stay where they are mapped; only the camera is fitted. Eye positions
|
|
43
|
+
// are meters east, up, and south of Crain's mapped centre.
|
|
44
|
+
const photoEye = [1471.76, 2, 1948.8];
|
|
45
|
+
const photoAzimuth = skylineAzimuth, photoPolar = 94.0182 * Math.PI / 180;
|
|
46
|
+
// The panorama's vertical field of view. The panorama is the reference excerpt's frame
|
|
47
|
+
// widened about the same centre to every building the drawing shows, so the camera aims
|
|
48
|
+
// where it always has.
|
|
49
|
+
const frameFov = 10.5279 * Math.PI / 180;
|
|
50
|
+
const back = [Math.sin(photoPolar) * Math.sin(photoAzimuth), Math.cos(photoPolar), Math.sin(photoPolar) * Math.cos(photoAzimuth)];
|
|
51
|
+
// Orbit and zoom pivot on the sightline at Crain's depth.
|
|
52
|
+
const photoDistance = photoEye[0] * back[0] + photoEye[1] * back[1] + photoEye[2] * back[2];
|
|
53
|
+
const frameHeight = 2 * photoDistance * Math.tan(frameFov / 2);
|
|
54
|
+
const photoView = {
|
|
55
|
+
azimuth: photoAzimuth,
|
|
56
|
+
polar: photoPolar,
|
|
57
|
+
distance: photoDistance,
|
|
58
|
+
target: [anchor[0] + photoEye[0] - photoDistance * back[0], photoEye[1] - photoDistance * back[1], anchor[2] + photoEye[2] - photoDistance * back[2]],
|
|
59
|
+
fit: { width: frameHeight * panorama.width / panorama.height, height: frameHeight },
|
|
60
|
+
};
|
|
61
|
+
// The same camera framing what index.html frames: the drawing's viewBox, a lens shift off
|
|
62
|
+
// the panorama's centre, held to the viewport's bottom edge. The mapped buildings then
|
|
63
|
+
// stand where the drawing shows them in the skyline viewer.
|
|
64
|
+
const unit = frameHeight / panorama.height;
|
|
65
|
+
const drawingView = {
|
|
66
|
+
...photoView,
|
|
67
|
+
label: "skyline view",
|
|
68
|
+
fit: { width: drawingFrame.width * unit, height: drawingFrame.height * unit },
|
|
69
|
+
offset: [
|
|
70
|
+
(drawingFrame.x + drawingFrame.width / 2 - panorama.x - panorama.width / 2) * unit,
|
|
71
|
+
(panorama.y + panorama.height / 2 - drawingFrame.y - drawingFrame.height / 2) * unit,
|
|
72
|
+
],
|
|
73
|
+
align: "bottom",
|
|
74
|
+
};
|
|
75
|
+
const layout = { models, extras: [ground.group], defaultView: "skyline", ...settings, views: { skyline: photoView } };
|
|
76
|
+
const comparisonViews = {
|
|
77
|
+
top: { azimuth: 0, polar: 0, projection: "orthographic", label: "ground plan · north up", fit: planFit, target: center },
|
|
78
|
+
heights: { azimuth: 0.65, polar: 1.18, projection: "orthographic", label: "height comparison", fit: planFit, target: [center[0], 155, center[2]] },
|
|
79
|
+
};
|
|
80
|
+
// The names the comparison views show over each building.
|
|
81
|
+
const labels = geographicBuildings.map(({ id, shortName }) => ({
|
|
82
|
+
id, text: shortName,
|
|
83
|
+
placement: id === "layer3" ? "right" : id === "building-one-prudential-plaza" ? "below" : "above",
|
|
84
|
+
}));
|
|
85
|
+
return { models, ground, center, settings, layout, drawingView, comparisonViews, labels };
|
|
86
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<meta name="robots" content="noindex" />
|
|
7
|
+
<meta name="theme-color" content="#080808" />
|
|
8
|
+
<link rel="icon" href="data:," />
|
|
9
|
+
<link rel="stylesheet" href="study.css" />
|
|
10
|
+
<title>Thirty-four on the skyline — Skyline Study</title>
|
|
11
|
+
</head>
|
|
12
|
+
<body class="skyline-study">
|
|
13
|
+
<header>
|
|
14
|
+
<div>
|
|
15
|
+
<p class="eyebrow">Chicago skyline / building study 02</p>
|
|
16
|
+
<h1>Thirty-four on the skyline</h1>
|
|
17
|
+
<p class="address">Geographic layout: every mapped building, from the Railway Exchange to the towers around The Buckingham · Original drawing: The Heritage · Kemper · Crain Communications · Michigan Plaza South · Trump International Hotel and Tower · One Prudential Plaza · Two Prudential Plaza · Aon Center</p>
|
|
18
|
+
</div>
|
|
19
|
+
<nav class="study-links" aria-label="Studies">
|
|
20
|
+
<a href="building-study.html">Crain solo →</a>
|
|
21
|
+
<a class="back" href="index.html">← back to skyline</a>
|
|
22
|
+
</nav>
|
|
23
|
+
</header>
|
|
24
|
+
<main>
|
|
25
|
+
<div class="layout-controls">
|
|
26
|
+
<div class="button-group" role="group" aria-label="Building layout">
|
|
27
|
+
<button type="button" data-layout="original" aria-pressed="false">original drawing</button>
|
|
28
|
+
<button type="button" data-layout="geographic" aria-pressed="true">geographic layout</button>
|
|
29
|
+
</div>
|
|
30
|
+
<p id="layout-status" role="status">Geographic layout · mapped footprints and published heights, or heights read on the drawing where none is published, with detailed facades on all thirty-four buildings. Skyline view: the drawing’s camera, on the lakefront by the Adler Planetarium. Light grey outlines: mapped ground coverage. Grey lines: street centerlines. Grid: 100 m.</p>
|
|
31
|
+
</div>
|
|
32
|
+
<div class="comparison">
|
|
33
|
+
<figure>
|
|
34
|
+
<figcaption class="caption" id="model-caption">01 / geographic study</figcaption>
|
|
35
|
+
<div class="viewport" id="viewport">
|
|
36
|
+
<canvas id="building" tabindex="0" role="img" aria-label="Interactive 3D study of the Heritage at Millennium Park, Kemper, Crain Communications, Michigan Plaza South, Trump International Hotel and Tower, One and Two Prudential Plaza, and Aon Center, with 330 North Wabash, the Blue Cross and Blue Shield Tower, 340 on the Park, The Buckingham, Millennium Park Plaza, Willoughby Tower, Six North Michigan, the Michigan Boulevard Building, 180 North Michigan Avenue, the University Club of Chicago, the Monroe Building, the MacLean Center, the Lake View Building, the Peoples Gas Building, the Borg-Warner Building, the Railway Exchange Building, the Gage Building, the Edson Keith and Theodore Ascher Buildings, the Chicago Athletic Association, Two Illinois Center, River Plaza, the Hyatt Regency Chicago West Tower, the Sheraton Grand Chicago Riverwalk, Three Illinois Center, and Swissôtel Chicago in the geographic layout" aria-describedby="camera-hint"></canvas>
|
|
37
|
+
<span class="view-label" id="view-label">skyline view</span>
|
|
38
|
+
<p class="loading" id="loading" role="status">Preparing the skyline…</p>
|
|
39
|
+
<p class="hint" id="camera-hint">Drag to orbit · scroll or pinch to zoom<br />Arrow keys rotate · + / − zoom · Home resets</p>
|
|
40
|
+
</div>
|
|
41
|
+
</figure>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="toolbar" aria-label="Skyline study controls">
|
|
44
|
+
<div class="button-group" role="group" aria-label="Camera views">
|
|
45
|
+
<button type="button" data-view="skyline" aria-pressed="true">skyline view</button>
|
|
46
|
+
<button type="button" data-view="quarter">three-quarter</button>
|
|
47
|
+
<button type="button" data-view="side">side</button>
|
|
48
|
+
<button type="button" data-view="top" aria-pressed="false">ground plan ↓</button>
|
|
49
|
+
<button type="button" data-view="heights" aria-pressed="false">height comparison</button>
|
|
50
|
+
<button type="button" id="reset">reset view</button>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="button-group" role="group" aria-label="Model display">
|
|
53
|
+
<button type="button" id="streets" aria-pressed="true" disabled>streets</button>
|
|
54
|
+
<button type="button" id="wireframe" aria-pressed="false">wireframe</button>
|
|
55
|
+
<button type="button" id="turntable" aria-pressed="false" aria-describedby="motion-status">turntable</button>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
<figure class="reference">
|
|
59
|
+
<figcaption class="caption">02 / source SVG</figcaption>
|
|
60
|
+
<img src="models/skyline-panorama.svg" alt="The whole drawn skyline, every building the drawing shows, from the Railway Exchange Building on the left to the towers around The Buckingham on the right" />
|
|
61
|
+
</figure>
|
|
62
|
+
<details class="geographic-details" open>
|
|
63
|
+
<summary>Footprints, coordinates & height differences</summary>
|
|
64
|
+
<p>Ground plan uses an orthographic camera: roofs do not grow with height. Both layouts align at Crain and keep the same camera and zoom when toggled in ground plan or height comparison. The drawing’s other positions are artistic. Only the geographic layout is mapped.</p>
|
|
65
|
+
<p>All values are meters. Ground extents are east–west × north–south bounding dimensions, including mapped podiums, rather than facade lengths. Coordinates are east and north of Crain (<span id="coordinate-origin"></span>). Top heights include modeled spires and antennas; architectural heights exclude antennas.</p>
|
|
66
|
+
<div class="dimension-scroll" tabindex="0" role="region" aria-label="Building dimension comparison">
|
|
67
|
+
<table class="dimension-table">
|
|
68
|
+
<thead><tr><th scope="col">Building / footprint source</th><th scope="col">East, north</th><th scope="col">Original ground extent</th><th scope="col">Mapped ground extent</th><th scope="col">Original → geographic top (Δ)</th><th scope="col">Height source & assumptions</th></tr></thead>
|
|
69
|
+
<tbody id="dimensions-body"></tbody>
|
|
70
|
+
</table>
|
|
71
|
+
</div>
|
|
72
|
+
<p>Footprints and streets: <a href="https://www.openstreetmap.org/copyright">© OpenStreetMap contributors · ODbL</a>, local snapshot from September 17, 2026, with 330 North Wabash's outline from September 27, 2026, and the outlines and parts of the Blue Cross and Blue Shield Tower, 340 on the Park, The Buckingham, Millennium Park Plaza, Willoughby Tower, Six North Michigan, the Michigan Boulevard Building, 180 North Michigan Avenue, the University Club of Chicago, the Monroe Building, the MacLean Center, the Lake View Building, the Peoples Gas Building, the Borg-Warner Building and the Railway Exchange Building from September 28, 2026, and the outlines and parts of the Gage, Edson Keith and Theodore Ascher Buildings, the Chicago Athletic Association, Two Illinois Center, River Plaza, the Hyatt Regency West Tower, the Sheraton Grand Chicago Riverwalk, Three Illinois Center and Swissôtel Chicago from September 29, 2026, and streets from September 30, 2026. Mapped outlines are not a survey. Street lines show location, not curb width; they are flattened to one ground plane, with lower streets omitted. Heritage has a detailed facade reconstruction using <a href="https://gisapps.chicago.gov/gisimages/zoning_pds/PD787.pdf">city design drawings</a> and published heights; its facade spacing and rooftop equipment remain approximate. Other roofs are simplified and some podium heights are estimated. This lets you inspect spacing; exact street widths and Chicago’s multiple road levels need additional data.</p>
|
|
73
|
+
</details>
|
|
74
|
+
<div class="notes">
|
|
75
|
+
<p>The page opens on the geographic layout, seen from the drawing’s camera; <strong>original drawing</strong> follows the SVG’s angle, proportions, and spacing. Orbit around the Heritage’s curved bow and finned crown, Kemper’s ribs, Crain’s diamond roof, Michigan Plaza’s window grid, Trump’s stepped shaft and spire, One Prudential’s punch-card slab and antenna, Two Prudential’s stepped gables, tiers, and turned pyramid, and Aon’s granite piers and roof screens. Depth, hidden sides, and lower floors obscured in the drawing are approximate.</p>
|
|
76
|
+
<p id="motion-status" role="status">Camera moves only when you interact or start the turntable.</p>
|
|
77
|
+
</div>
|
|
78
|
+
<noscript><p>Enable JavaScript to explore the 3D scene. The source SVG remains visible above.</p></noscript>
|
|
79
|
+
</main>
|
|
80
|
+
<div class="tooltip" id="tooltip" aria-hidden="true" hidden></div>
|
|
81
|
+
<script src="study-loader.js" data-study="./skyline-study.js"></script>
|
|
82
|
+
</body>
|
|
83
|
+
</html>
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { createBuildingStudy } from "./study-viewer.js";
|
|
2
|
+
import { createSkylineComparison } from "./skyline-comparison.js";
|
|
3
|
+
import { createCrainSkylineBuilding } from "./models/crain-communications.js";
|
|
4
|
+
import { createHeritageAtMillenniumParkBuilding } from "./models/heritage-at-millennium-park.js";
|
|
5
|
+
import { createKemperBuilding } from "./models/kemper.js";
|
|
6
|
+
import { createMichiganPlazaSouthBuilding } from "./models/michigan-plaza-south.js";
|
|
7
|
+
import { createOnePrudentialPlazaBuilding } from "./models/one-prudential-plaza.js";
|
|
8
|
+
import { createTrumpInternationalTowerBuilding } from "./models/trump-international-tower.js";
|
|
9
|
+
import { createTwoPrudentialPlazaBuilding } from "./models/two-prudential-plaza.js";
|
|
10
|
+
import { createAonCenterBuilding } from "./models/aon-center.js";
|
|
11
|
+
// The SVG's Crain facade widths suggest a ~42° azimuth. Kemper's near roof
|
|
12
|
+
// corner rises above its neighbors, placing the eye below the roof. A long
|
|
13
|
+
// lens keeps the traced verticals nearly parallel.
|
|
14
|
+
const azimuth = 41.5 * Math.PI / 180;
|
|
15
|
+
const elevation = -2 * Math.PI / 180;
|
|
16
|
+
const crain = createCrainSkylineBuilding();
|
|
17
|
+
const kemper = createKemperBuilding();
|
|
18
|
+
const michigan = createMichiganPlazaSouthBuilding();
|
|
19
|
+
const heritage = createHeritageAtMillenniumParkBuilding();
|
|
20
|
+
const prudential = createOnePrudentialPlazaBuilding();
|
|
21
|
+
const trump = createTrumpInternationalTowerBuilding();
|
|
22
|
+
const twoPrudential = createTwoPrudentialPlazaBuilding();
|
|
23
|
+
const aon = createAonCenterBuilding();
|
|
24
|
+
function place(model, across, towardCamera) {
|
|
25
|
+
// Center the wider group while retaining the drawing's relative spacing.
|
|
26
|
+
across -= 76.5;
|
|
27
|
+
model.building.position.set(across * Math.cos(azimuth) + towardCamera * Math.sin(azimuth), 0, -across * Math.sin(azimuth) + towardCamera * Math.cos(azimuth));
|
|
28
|
+
}
|
|
29
|
+
// The real Crain from the drawing's datum up, fitted through this camera to the drawn
|
|
30
|
+
// diamond and the twenty-nine drawn sills on its left face: 1.276 times its size, the
|
|
31
|
+
// same exaggeration the drawing gives the other fitted towers, and turned 4.86° to meet
|
|
32
|
+
// the drawing's view of its faces. Depth keeps the earlier placement.
|
|
33
|
+
crain.building.scale.setScalar(1.276);
|
|
34
|
+
crain.building.rotation.y = 4.86 * Math.PI / 180;
|
|
35
|
+
place(crain, 25.49, 10);
|
|
36
|
+
place(kemper, -38, -20);
|
|
37
|
+
kemper.building.rotation.y = 9.1 * Math.PI / 180;
|
|
38
|
+
place(michigan, 104, -12);
|
|
39
|
+
michigan.building.rotation.y = -1.4 * Math.PI / 180;
|
|
40
|
+
// Fitted through this camera to Heritage's drawn corners, mullions, and crown fins.
|
|
41
|
+
// The plan needs no rotation, and its depth keeps the tower behind Kemper's left face.
|
|
42
|
+
place(heritage, -91.9, -31.85);
|
|
43
|
+
// The real One Prudential from the drawing's 40 m datum up, fitted through this camera at
|
|
44
|
+
// all five test layouts to the drawn roof, band, penthouse, and mast, the drawn piers, the
|
|
45
|
+
// screen's fins, the wing's ribs and corners, and the drawn window rows: 1.314 times its
|
|
46
|
+
// size and turned 7.29°. Depth barely changes the picture, so it comes from the drawing's
|
|
47
|
+
// occlusion instead: One Prudential is drawn over Michigan Plaza's rightmost 47 layer
|
|
48
|
+
// units, so it has to stand in front of it.
|
|
49
|
+
prudential.building.scale.setScalar(1.314);
|
|
50
|
+
prudential.building.rotation.y = 7.29 * Math.PI / 180;
|
|
51
|
+
place(prudential, 179.02, 25);
|
|
52
|
+
// The real Trump shaft from the drawing's 40.7 m datum up, fitted through this camera at all
|
|
53
|
+
// five test layouts to the drawn roof, step, crown, and spire, the drawn mullion lines, and
|
|
54
|
+
// the drawn floor rows: 1.065 times its size and turned 7.95°. It stands behind One
|
|
55
|
+
// Prudential in the SVG, and its depth keeps that lower-facade occlusion.
|
|
56
|
+
trump.building.scale.setScalar(1.065);
|
|
57
|
+
trump.building.rotation.y = 7.95 * Math.PI / 180;
|
|
58
|
+
place(trump, 201.61, -40);
|
|
59
|
+
// The real Two Prudential from the drawing's 35.4 m datum up, fitted through this camera at
|
|
60
|
+
// all five test layouts to the drawn eaves, gables, pyramid, spire and tiers, and the drawn
|
|
61
|
+
// piers of its south and east faces and its lower tier: 1.289 times its size and turned
|
|
62
|
+
// 8.59°. It stands behind the shared podium, and its depth keeps that occlusion.
|
|
63
|
+
twoPrudential.building.scale.setScalar(1.289);
|
|
64
|
+
twoPrudential.building.rotation.y = 8.59 * Math.PI / 180;
|
|
65
|
+
place(twoPrudential, 269.67, -45);
|
|
66
|
+
// The real Aon Center from the drawing's datum up, fitted through this camera at all five
|
|
67
|
+
// test layouts to the drawn roof, the fifteen drawn piers on each face, and the drawn floor
|
|
68
|
+
// bands: 1.329 times its size, turned 10.2° so the camera meets its faces as the
|
|
69
|
+
// photograph does. Depth keeps the earlier placement.
|
|
70
|
+
aon.building.scale.setScalar(1.329);
|
|
71
|
+
aon.building.rotation.y = 10.2 * Math.PI / 180;
|
|
72
|
+
place(aon, 368.16, 40);
|
|
73
|
+
const models = [heritage, kemper, crain, michigan, trump, prudential, twoPrudential, aon];
|
|
74
|
+
const comparison = createSkylineComparison(models, crain.building.position);
|
|
75
|
+
// The page opens on the geographic layout; `?layout=original` opens on the drawing's fit.
|
|
76
|
+
const initialLayout = new URLSearchParams(location.search).get("layout") === "original" ? "original" : "geographic";
|
|
77
|
+
const viewer = createBuildingStudy({
|
|
78
|
+
models,
|
|
79
|
+
layouts: comparison.layouts,
|
|
80
|
+
initialLayout,
|
|
81
|
+
labels: comparison.labels,
|
|
82
|
+
onLayoutChange: comparison.onLayoutChange,
|
|
83
|
+
defaultView: "skyline",
|
|
84
|
+
views: {
|
|
85
|
+
skyline: { azimuth, polar: Math.PI / 2 - elevation, label: "skyline view" },
|
|
86
|
+
quarter: { azimuth: azimuth + 0.3, polar: Math.PI / 2 - 0.28, label: "three-quarter view" },
|
|
87
|
+
side: { azimuth: azimuth + Math.PI / 2, polar: Math.PI / 2 - 0.14, label: "side view" },
|
|
88
|
+
...comparison.views,
|
|
89
|
+
},
|
|
90
|
+
fov: 6,
|
|
91
|
+
minimumDistanceRatio: 0.1,
|
|
92
|
+
maximumZoom: 24,
|
|
93
|
+
enablePan: true,
|
|
94
|
+
// The viewer moves the near plane outward at wider views to retain precision.
|
|
95
|
+
near: 10,
|
|
96
|
+
far: 10000,
|
|
97
|
+
// The reference frame grew around the same centre to include Aon. Its platform
|
|
98
|
+
// footprint and farthest corner remain inside the clipping margin at every zoom.
|
|
99
|
+
clippingMargin: 560,
|
|
100
|
+
target: [0, 172.5, 0],
|
|
101
|
+
minimumCameraHeight: 1,
|
|
102
|
+
fit: { height: 572.658, width: 717.635 },
|
|
103
|
+
platform: { width: 750, depth: 580, color: 0x222222 },
|
|
104
|
+
lightPosition: [-330, 560, 510],
|
|
105
|
+
// Keep the key light's direction while moving it back far enough that Aon's
|
|
106
|
+
// upper corner does not cross its near plane. The solo study keeps its preset.
|
|
107
|
+
shadowCamera: { left: -540, right: 560, top: 550, bottom: -400, near: 1, far: 1300 },
|
|
108
|
+
});
|
|
109
|
+
comparison.connect(viewer);
|