Qualitaetssprung: ebene Belaege, echte Bauteile, Sichtschutz
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>
This commit is contained in:
2026-09-09 07:47:47 +02:00
co-authored by Claude Opus 5
parent f2b7b1b236
commit 8979775895
24 changed files with 1452 additions and 319 deletions
+5 -5
View File
@@ -6,7 +6,7 @@ import {
BufferAttribute, BufferGeometry, DoubleSide, Mesh, MeshStandardMaterial, Group,
} from 'three';
import type { Terrain } from '../site';
import { rasen, schotterwiese } from './textures';
import { rohboden } from './textures';
export function buildTerrain(terrain: Terrain): Group {
const group = new Group();
@@ -18,7 +18,7 @@ export function buildTerrain(terrain: Terrain): Group {
const geo = new BufferGeometry();
const verts = new Float32Array(nx * nz * 3);
const uvs = new Float32Array(nx * nz * 2);
const belag = rasen();
const belag = rohboden();
for (let j = 0; j < nz; j++) {
for (let i = 0; i < nx; i++) {
const k = j * nx + i;
@@ -53,7 +53,7 @@ export function buildTerrain(terrain: Terrain): Group {
// Das Grundstueck liegt an einem Hang ueber dem Tal. Das Umland wird als
// Kranz direkt an die Randpunkte des Rasters gehaengt - so entsteht keine
// sichtbare Kante - und faellt gegen aussen ab, vor allem nach Suedwesten.
const wiese = schotterwiese();
const wiese = rohboden();
const cx = x0 + ((nx - 1) * cell) / 2;
const cz = z0 + ((nz - 1) * cell) / 2;
@@ -91,7 +91,7 @@ export function buildTerrain(terrain: Terrain): Group {
// Nach Suedwesten faellt das Gelaende deutlich staerker ab (Blick ins Tal).
const sw = (1 - Math.cos(Math.atan2(dz, dx) - 2.4)) / 2;
ringPos.push(x, p.y - t * (6 + 26 * sw * sw), z);
ringUv.push(x / (wiese.tile * 5), -z / (wiese.tile * 5));
ringUv.push(x / wiese.tile, -z / wiese.tile);
}
}
for (let k = 0; k < RINGS; k++) {
@@ -107,7 +107,7 @@ export function buildTerrain(terrain: Terrain): Group {
far.setIndex(ringIdx);
far.computeVertexNormals();
const surroundings = new Mesh(far, new MeshStandardMaterial({
map: wiese.map, roughness: 1, metalness: 0, color: 0x86935f, side: DoubleSide,
map: wiese.map, roughness: 1, metalness: 0, color: 0xa9b096, side: DoubleSide,
}));
surroundings.name = 'Umland';
group.add(surroundings);