Deploy App / deploy (push) Successful in 49s
Nach der Plankontrolle ueberarbeitet: - Belaege sind eben. Je Belag wird aus den Hoehenkoten eine Ebene bestimmt (Gefaelle <= 5 %, am Kotenschwerpunkt aufgehaengt, nur Koten derselben Gelaendezone). Das Raster wird darauf gezwungen und dort nicht geglaettet. Jeder Belag bekommt eine senkrechte Sichtkante zum Gelaende. - Mauern sind Bauteile: Travertin-Schichtmauerwerk mit versetzten Stossfugen und Abdeckplatte, einzelne Winkelelemente mit Fussplatte, Ortbeton in Schaltafelfeldern. - Sichtschutz: die Eibenreihen des Plans werden zu geschnittenen Hecken verkettet, ebenso die Ligusterhecke. Lamellenwand im Planrhythmus. - Der Plan zeichnet die Travertinplatten 40x60 einzeln im Dekorkies - jetzt 30 erhabene Platten an den Planpositionen statt geschlossenem Belag. - Normalmaps aus dem Fugenbild fuer Platten, Pflaster, Holzschalung und Laub. - Nachbarhaus Zollet richtig platziert (stand auf dem Nachbargarten) und wie Haus 9a ausgebildet. Behobene Fehler: boxGeometry erzeugte Seiten und Deckel mit umgekehrtem Wickelsinn - saemtliche Boxen waren innen nach aussen gekehrt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
318 lines
14 KiB
JavaScript
318 lines
14 KiB
JavaScript
/**
|
|
* Handgepflegte Ergaenzungen zum Plan.
|
|
*
|
|
* Der PDF-Plan liefert Flaechen, Pflanzensymbole und Hoehenkoten. Alles, was
|
|
* im Plan nur beschriftet ist (Mauerhoehen, Bauteile, Gebaeude), steht hier -
|
|
* abgeleitet aus den Planbeschriftungen, den Architekturplaenen von EHLE
|
|
* Architekten (Haus 9a, 27.04.2021) und den Fotos des Ist-Zustands.
|
|
*
|
|
* Alle Koordinaten im Site-Frame in Metern:
|
|
* X = Hausachse ENE (Peilung 61.16 deg)
|
|
* Z = senkrecht SSE (Peilung 151.16 deg)
|
|
* Y = Hoehe relativ zum Fixpunkt 0.00 = 651.17 m ue. M. (= OK FB EG Haus 9a)
|
|
*/
|
|
|
|
/** Farbe im Plan -> Belagsart. Reihenfolge egal, Zuordnung ueber Hex. */
|
|
export const SURFACE_BY_COLOR = {
|
|
'#ffffcc': 'travertin80', // Travertinplatten: grosse Felder 80x80x3, kleine Rechtecke 40x60x3
|
|
'#fcffe7': 'dekorkies', // Dekorkies-Bett; noerdlich der Grenze die Keramikterrasse Zollet
|
|
'#f8ffcc': 'travertinstell',// Travertinstellplatten-Streifen
|
|
'#eee8cc': 'travertinmauer',// Mauerkronen, Sitzmauern, schwebende Stufen
|
|
'#e5ffe5': 'rasen',
|
|
'#ccffcc': 'rasen',
|
|
'#ccff99': 'schotterwiese',
|
|
'#eeeeee': 'keramik', // Keramikplatten 60x60x2 (bauseits vorhanden)
|
|
'#bbbbbb': 'verbundstein', // Anpassung Verbundsteine Nachbar
|
|
'#ddba99': 'beet',
|
|
'#c0bab4': 'spielsand',
|
|
'#ffaa00': 'tegula', // Tegula-Pflastersteine grau (im Plan orange markiert)
|
|
'#ddd299': 'travertinstell',
|
|
'#73e900': 'ligusterhecke',
|
|
'#cccccc': 'winkelelement',
|
|
'#aaaaaa': 'spielhaus',
|
|
'#b29f3c': 'spielhaus',
|
|
'#80712a': 'gartenhaus',
|
|
'#335533': 'roboter',
|
|
};
|
|
|
|
/** Pflanzensymbole: Planfarbe -> Art. Radius kommt aus dem Plankreis. */
|
|
export const PLANT_BY_COLOR = {
|
|
'#00bb00': 'eibe', // Eiben `Hilli` 80/100 cm - Heckenpflanzen und ein Solitaer
|
|
'#66ff33': 'solitaer',
|
|
'#33ff99': 'solitaer',
|
|
'#cc5599': 'solitaer', // Parrotia persica, persischer Eisenholzbaum
|
|
'#99ff66': 'strauch', // Heidelbeeren / Beerenstraeucher
|
|
'#7fff00': 'gras',
|
|
'#99ff00': 'kraut',
|
|
'#cbe900': 'kraut',
|
|
'#74ff63': 'kraut',
|
|
'#e8ff64': 'kraut',
|
|
'#59b500': 'kraut',
|
|
'#0c8e2d': 'kraut',
|
|
'#00e93c': 'kraut',
|
|
'#33ff66': 'kraut',
|
|
'#339966': 'kraut',
|
|
'#00dbdd': 'kraut',
|
|
'#ccccff': 'kraut',
|
|
'#ff66cc': 'kraut',
|
|
'#7863ff': 'kraut',
|
|
};
|
|
|
|
/**
|
|
* Solitaergehoelze und Baeume. Die Kronenradien stammen aus den Plankreisen,
|
|
* die Stammhoehen sind Erfahrungswerte fuer die im Plan gezeigten Groessen.
|
|
*/
|
|
export const TREES = [
|
|
{ name: 'Solitärgehölz Sitzplatz Süd', x: -17.5, z: 1.6, crown: 1.34, height: 4.6, species: 'parrotia' },
|
|
{ name: 'Solitärgehölz Terrasse NW', x: -19.1, z: -5.5, crown: 0.67, height: 3.2, species: 'parrotia' },
|
|
{ name: 'Solitärgehölz Flammengrill', x: -4.0, z: 3.9, crown: 0.63, height: 3.0, species: 'parrotia' },
|
|
{ name: 'Apfelbaum', x: 1.69, z: 4.05, crown: 0.9, height: 3.4, species: 'apfel' },
|
|
// Nachbargarten Zollet, im Plan mitgezeichnet
|
|
{ name: 'Solitärgehölz Zollet', x: -17.6, z: -10.2, crown: 1.34, height: 4.6, species: 'parrotia', neighbour: true },
|
|
];
|
|
|
|
/**
|
|
* Mauern, Stuetzelemente und Waende.
|
|
* `path` = Mittellinie, `t` = Dicke, `top`/`base` = Hoehe der Krone bzw. des Fusses
|
|
* (null = folgt dem Gelaende). Alle Werte aus den Planbeschriftungen und Koten.
|
|
*/
|
|
export const WALLS = [
|
|
{
|
|
id: 'travertinmauer-nord', type: 'travertin',
|
|
note: 'Travertinmauer an der Grenze zum Nachbargrundstueck Zollet, stuetzt rund 1.5 m ab',
|
|
path: [[-18.17, -6.895], [-13.82, -6.895]], t: 0.55, top: -0.30, base: -1.90,
|
|
},
|
|
{
|
|
id: 'sitzmauer-nord', type: 'travertin',
|
|
note: 'Sitzmauer 25 cm ueber der Travertinmauer (gelbe Kote "25" im Plan)',
|
|
path: [[-20.08, -6.47], [-13.82, -6.47]], t: 0.30, top: -0.03, base: -0.45,
|
|
},
|
|
{
|
|
id: 'winkelelemente-west', type: 'beton',
|
|
note: 'Winkelelemente aus Beton entlang der Westgrenze, stuetzen den Garten ueber der Feuerwehrzufahrt',
|
|
path: [[-20.12, -6.62], [-20.66, 0.51], [-21.70, 0.52], [-21.70, 2.37]],
|
|
t: 0.22, top: null, base: null, retains: 'west',
|
|
},
|
|
{
|
|
id: 'travertinsitzmauer-west', type: 'travertin',
|
|
note: 'Travertinsitzmauer als Abschluss des Hauptsitzplatzes gegen den Rasen',
|
|
path: [[-18.64, 0.755], [-14.73, 0.755]], t: 0.41, top: 0.40, base: -0.45, seating: true,
|
|
},
|
|
{
|
|
id: 'travertinsitzmauer-sued', type: 'travertin',
|
|
note: 'Schenkel der Travertinsitzmauer laengs des Rasens',
|
|
path: [[-18.44, 0.55], [-18.44, 3.94]], t: 0.40, top: 0.40, base: -0.40, seating: true,
|
|
},
|
|
{
|
|
id: 'betonmauer-nachbar', type: 'beton',
|
|
note: 'Bestehende Betonmauer des Suednachbarn entlang der Grenze',
|
|
path: [[-17.41, 6.07], [1.99, 6.07]], t: 0.20, top: 1.10, base: -0.60,
|
|
},
|
|
{
|
|
id: 'betonmauer-nachbar-ost', type: 'beton',
|
|
note: 'Rueckspringender Schenkel der Nachbarmauer',
|
|
path: [[2.09, 6.07], [2.09, 9.05]], t: 0.20, top: 1.10, base: -0.60,
|
|
},
|
|
{
|
|
id: 'holzscheiterwand', type: 'holzscheiter',
|
|
note: 'Holzscheiterwand 150 cm breit, 200 cm hoch, hinter dem Flammengrill',
|
|
path: [[-5.75, 4.35], [-4.25, 4.35]], t: 0.45, top: 2.26, base: 0.20,
|
|
},
|
|
{
|
|
id: 'stufe-gartentor', type: 'travertin',
|
|
note: 'Blockstufen beim Gartentor an der Suedwestecke',
|
|
path: [[-21.05, 2.15], [-21.05, 3.75]], t: 0.80, top: -0.13, base: -0.75,
|
|
},
|
|
{
|
|
id: 'lamellenwand', type: 'lamellen',
|
|
note: 'Lamellenwand zum Sitzen: senkrechte Holzlamellen am gedeckten Sitzplatz',
|
|
path: [[-13.26, 0.91], [-8.73, 0.91]], t: 0.34, top: 2.72, base: -0.05, openSlats: true,
|
|
},
|
|
];
|
|
|
|
/** Freistehende Bauteile und Moeblierung. rot = Drehung um Y in Grad. */
|
|
export const PROPS = [
|
|
{ id: 'gartenhaus', type: 'gartenhaus', x: 1.20, z: -3.60, w: 1.8, d: 1.8, h: 2.15, rot: 0,
|
|
note: 'Standort Gartenhaus 1,8 x 1,8 m' },
|
|
{ id: 'spielhaus', type: 'spielhaus', x: 0.0, z: 3.15, w: 1.8, d: 2.7, h: 2.30, rot: 0,
|
|
note: 'Spielhaus durch Zimmermann, Podest auf 1.47' },
|
|
{ id: 'flammengrill', type: 'flammengrill', x: -6.95, z: 2.45, w: 0.7, d: 0.7, h: 0.85, rot: 0,
|
|
note: 'Flammengrill im Dekorkiesfeld' },
|
|
{ id: 'baenkli', type: 'bank', x: -20.62, z: 1.42, w: 0.50, d: 1.50, h: 0.45, rot: 90,
|
|
note: 'Baenkli aus Travertin' },
|
|
{ id: 'maehroboter', type: 'roboter', x: -17.87, z: 3.72, w: 0.75, d: 0.55, h: 0.40, rot: 0,
|
|
note: 'Garage Maehroboter' },
|
|
{ id: 'wasserhahn', type: 'wasserhahn', x: -13.90, z: -4.60, w: 0.12, d: 0.12, h: 0.85, rot: 0 },
|
|
{ id: 'schlaufschacht', type: 'schacht', x: -14.35, z: -3.95, w: 0.30, d: 0.30, h: 0.02, rot: 0,
|
|
note: 'Schlaufschacht D = 30 cm' },
|
|
{ id: 'gartentor', type: 'tor', x: -21.60, z: 3.30, w: 1.00, d: 0.06, h: 1.10, rot: 0 },
|
|
];
|
|
|
|
/**
|
|
* Flaechen, die der Plan nur als weisses Raster zeigt und die deshalb bei der
|
|
* Farbklassierung durchfallen - Masse aus den Planlinien.
|
|
*/
|
|
export const EXTRA_SURFACES = [
|
|
{
|
|
type: 'keramik',
|
|
note: 'Gedeckter Sitzplatz 14.4 m2, Keramikplatten 60x60x2 cm',
|
|
polygon: [[-13.93, -3.06], [-8.73, -3.06], [-8.73, 0.86], [-13.93, 0.86]],
|
|
},
|
|
{
|
|
type: 'tegula',
|
|
note: 'Feuerwehrzufahrt und Zugangsweg, Tegula-Pflastersteine grau',
|
|
polygon: [[-25.60, -9.00], [-22.10, -9.00], [-22.10, 6.40], [-25.60, 6.40]],
|
|
},
|
|
{
|
|
// Die schwebenden Stufen im Plan: eine Zwischenebene zwischen dem
|
|
// gedeckten Sitzplatz (-0.02) und dem Hauptsitzplatz (rund -0.15).
|
|
// Die Hoehensprünge zeigen sich als Sichtkanten der Belaege.
|
|
type: 'travertin80',
|
|
note: 'Schwebende Stufen (Travertin) zwischen den beiden Sitzplaetzen',
|
|
polygon: [[-15.32, -3.12], [-13.87, -3.12], [-13.87, 0.60], [-15.32, 0.60]],
|
|
},
|
|
];
|
|
|
|
/**
|
|
* Travertinstelen: aufrechte Steinstelen als Raumteiler entlang der Beete.
|
|
* Positionen aus den Planbeschriftungen "Travertinstelen".
|
|
*/
|
|
export const STELEN = [
|
|
{ x: -19.55, z: -3.10, h: 0.90 }, { x: -19.30, z: -2.30, h: 1.15 }, { x: -19.05, z: -1.55, h: 0.75 },
|
|
{ x: -13.30, z: 4.45, h: 1.05 }, { x: -12.60, z: 4.45, h: 0.80 }, { x: -10.30, z: 4.60, h: 1.10 },
|
|
{ x: -9.60, z: 4.60, h: 0.85 }, { x: -1.30, z: 4.55, h: 1.00 }, { x: -0.60, z: 4.55, h: 0.75 },
|
|
];
|
|
|
|
/**
|
|
* Gebaeude. Das Wohnhaus 9a ist massgetreu aus dem Gartenplan uebernommen,
|
|
* die Hoehen stammen aus der Suedwest- und Nordostfassade 1:100:
|
|
* OK FB EG 651.17 -> 0.00 OK FB OG 654.07 -> +2.90
|
|
* OK Attika 657.32 -> +6.15 Nachbar Nr. 9 OK FB EG 649.47 -> -1.70
|
|
*/
|
|
export const BUILDING = {
|
|
id: 'haus-9a',
|
|
name: 'Haus 9a - Jeanine und Damian Kellenberger',
|
|
floorLevel: 0.0,
|
|
upperLevel: 2.9,
|
|
roofLevel: 6.15,
|
|
parapet: 0.35,
|
|
/**
|
|
* Aussenkante Fassade. Der Baukoerper ist im Grundriss ein Rechteck von
|
|
* 14.10 x 7.83 m; die Masse stammen aus den schwarzen Wandflaechen des
|
|
* Gartenplans (Nordostfassade z = -6.87, Suedwestfassade z = +0.96).
|
|
*/
|
|
outline: [[-13.82, -6.87], [0.28, -6.87], [0.28, 0.96], [-13.82, 0.96]],
|
|
/**
|
|
* Gedeckter Sitzplatz 14.4 m2: im Erdgeschoss zurueckspringende Nische in
|
|
* der Suedwestecke, oben vom Obergeschoss ueberdeckt.
|
|
*/
|
|
loggia: { x0: -13.82, z0: -3.06, x1: -9.06, z1: 0.96, ceiling: 2.75 },
|
|
/** Vordach ueber dem Hauseingang an der Nordostfassade (siehe Foto). */
|
|
canopy: { a: -3.20, b: 0.28, depth: 1.35, y: 2.60, thickness: 0.16 },
|
|
openings: [
|
|
// Suedwestfassade (z = 0.96 / 0.51) - grosse Fensterfronten zum Garten
|
|
{ face: 'south', a: -4.40, b: -0.20, sill: 0.0, head: 2.45, kind: 'glass' },
|
|
{ face: 'south', a: -12.90, b: -9.40, sill: 0.0, head: 2.45, kind: 'glass' },
|
|
{ face: 'south', a: -3.90, b: -0.60, sill: 3.35, head: 5.00, kind: 'glass', upper: true },
|
|
{ face: 'south', a: -12.60, b: -9.70, sill: 3.35, head: 5.00, kind: 'glass', upper: true },
|
|
// Westfassade (x = -13.82) - Fenster
|
|
{ face: 'west', a: -5.84, b: -4.24, sill: 0.85, head: 2.35, kind: 'window' },
|
|
{ face: 'west', a: -5.60, b: -4.50, sill: 3.75, head: 5.00, kind: 'window', upper: true },
|
|
// Nordostfassade (z = -6.87) - Eingang und Lamellenfenster
|
|
{ face: 'north', a: -1.90, b: -0.90, sill: 0.0, head: 2.35, kind: 'door' },
|
|
{ face: 'north', a: -5.60, b: -3.90, sill: 0.90, head: 2.35, kind: 'window' },
|
|
{ face: 'north', a: -11.60, b: -10.20, sill: 0.90, head: 2.35, kind: 'slats' },
|
|
{ face: 'north', a: -5.40, b: -4.10, sill: 3.75, head: 5.10, kind: 'window', upper: true },
|
|
{ face: 'north', a: -11.40, b: -10.40, sill: 3.75, head: 5.10, kind: 'slats', upper: true },
|
|
// Ostfassade (x = 0.28)
|
|
{ face: 'east', a: -5.60, b: -4.30, sill: 0.90, head: 2.35, kind: 'window' },
|
|
],
|
|
};
|
|
|
|
/**
|
|
* Nachbargebaeude als Kontext-Volumen. Haus 9 (Zollet) haengt am gleichen
|
|
* Baukoerper, liegt aber 1.70 m tiefer und ist gegen Nordwesten versetzt.
|
|
*/
|
|
export const NEIGHBOUR_BUILDINGS = [
|
|
{
|
|
// Gleicher Baukoerper wie 9a, gegen Nordwesten versetzt und 1.70 m tiefer.
|
|
// Die Westkante endet bei x = -13.9, damit die Keramikterrasse des
|
|
// Nachbargartens (Plan: Schwerpunkt -17.1 / -8.6) frei bleibt.
|
|
id: 'haus-9', name: 'Haus 9 - Sharon und Alan Zollet',
|
|
outline: [[-13.90, -14.70], [0.20, -14.70], [0.20, -6.87], [-13.90, -6.87]],
|
|
floorLevel: -1.70, roofLevel: 4.45,
|
|
},
|
|
];
|
|
|
|
/**
|
|
* Gelaendezonen. Innerhalb einer Zone wird zwischen den Hoehenkoten
|
|
* interpoliert; ueber Zonengrenzen hinweg nicht - dort stehen die Stuetzmauern.
|
|
*/
|
|
export const TERRAIN_ZONES = [
|
|
{
|
|
id: 'garten', label: 'Garten Kellenberger',
|
|
polygon: [[-20.90, -6.60], [3.00, -6.60], [3.00, 5.95], [-20.90, 5.95]],
|
|
fallback: -0.05,
|
|
},
|
|
{
|
|
id: 'zufahrt', label: 'Feuerwehrzufahrt / Schotterwiese West',
|
|
polygon: [[-26.00, -9.00], [-20.90, -9.00], [-20.90, 6.50], [-26.00, 6.50]],
|
|
fallback: -1.20,
|
|
},
|
|
{
|
|
id: 'zollet', label: 'Nachbargarten Zollet',
|
|
polygon: [[-24.00, -14.50], [3.00, -14.50], [3.00, -6.60], [-24.00, -6.60]],
|
|
fallback: -1.70,
|
|
},
|
|
{
|
|
id: 'sued', label: 'Nachbargrundstück Süd',
|
|
polygon: [[-22.00, 5.95], [6.00, 5.95], [6.00, 12.00], [-22.00, 12.00]],
|
|
fallback: -0.20,
|
|
},
|
|
{
|
|
id: 'ost', label: 'Wiese Ost',
|
|
polygon: [[3.00, -6.60], [9.00, -6.60], [9.00, 5.95], [3.00, 5.95]],
|
|
fallback: 0.55,
|
|
},
|
|
];
|
|
|
|
/**
|
|
* Zusaetzliche Hoehenpunkte, die im Plan nicht als Kote stehen, fuer ein
|
|
* plausibles Gelaende aber noetig sind (Auslauf gegen die Grundstuecksraender).
|
|
*/
|
|
export const EXTRA_SPOTS = [
|
|
{ x: -24.5, z: -8.0, y: -2.60, zone: 'zufahrt' },
|
|
{ x: -24.5, z: 0.0, y: -1.60, zone: 'zufahrt' },
|
|
{ x: -24.5, z: 5.0, y: -0.60, zone: 'zufahrt' },
|
|
{ x: -22.6, z: 5.5, y: -0.30, zone: 'zufahrt' },
|
|
{ x: -20.0, z: -12.5, y: -1.75, zone: 'zollet' },
|
|
{ x: -8.0, z: -12.5, y: -1.70, zone: 'zollet' },
|
|
{ x: 2.0, z: -11.5, y: -1.65, zone: 'zollet' },
|
|
{ x: -18.0, z: 9.0, y: -0.40, zone: 'sued' },
|
|
{ x: -6.0, z: 9.0, y: 0.10, zone: 'sued' },
|
|
{ x: 4.0, z: 9.0, y: 0.60, zone: 'sued' },
|
|
{ x: 7.5, z: -5.0, y: 0.10, zone: 'ost' },
|
|
{ x: 7.5, z: 0.0, y: 0.45, zone: 'ost' },
|
|
{ x: 7.5, z: 5.0, y: 0.80, zone: 'ost' },
|
|
];
|
|
|
|
/** Startposition und Blickrichtung beim Betreten der Szene. yaw = Grad ab Nord. */
|
|
export const START_VIEWS = [
|
|
{ id: 'sitzplatz', label: 'Hauptsitzplatz', x: -18.6, z: -2.6, yaw: 135, note: 'Travertinplatten 80x80x3 cm, Blick über den Sitzplatz gegen den Rasen' },
|
|
{ id: 'gedeckt', label: 'Gedeckter Sitzplatz', x: -11.0, z: -1.2, yaw: 215, note: 'Keramikplatten unter dem Obergeschoss, hinter der Lamellenwand' },
|
|
{ id: 'rasen', label: 'Rasen Süd', x: -13.0, z: 2.8, yaw: 75, note: 'Blick der Südfassade entlang zum Spielbereich' },
|
|
{ id: 'grill', label: 'Flammengrill', x: -7.8, z: 2.6, yaw: 110, note: 'Dekorkiesfeld mit Flammengrill und Holzscheiterwand' },
|
|
{ id: 'spielplatz', label: 'Spielbereich', x: -3.4, z: 1.4, yaw: 150, note: 'Spielsand, Spielhaus und Apfelbaum' },
|
|
{ id: 'eingang', label: 'Hauseingang', x: 1.3, z: -1.8, yaw: 250, note: 'Keramikplatten beim Fixpunkt 0.00' },
|
|
];
|
|
|
|
/** Standort fuer den Sonnenstand: Abtwil SG. */
|
|
export const SITE_LOCATION = {
|
|
name: 'Egglihaldenstrasse 9a, 9030 Abtwil SG',
|
|
lat: 47.4206,
|
|
lon: 9.2903,
|
|
/** Peilung der Site-X-Achse gegenueber Nord, in Grad. */
|
|
northBearingOfSiteX: 61.1615,
|
|
groundMasl: 651.17,
|
|
};
|