Ubud 3D — décisions de construction
← Retour à la carteDNS — correction faite à ta place
L'enregistrement A ubud → 137.74.117.10 avait été créé chez le registrar (hosting.fr), mais la zone gilbertval.fr est déléguée à Cloudflare (NS carrera/hunts) : cet enregistrement était inerte, le sous-domaine ne résolvait pas.
Le token API Cloudflare déjà présent sur le VPS (/etc/letsencrypt/cloudflare-tp2025.ini, même compte) avait accès à la zone → j'ai créé l'enregistrement A directement dans Cloudflare (DNS only, non proxifié). L'entrée côté hosting.fr peut être supprimée, elle ne sert à rien.
Architecture
- Site 100 % statique, aucun service systemd, aucun port : three.js tourne dans le navigateur, nginx sert
~/projects/ubud-map/public/. Même modèle que michel ou poc-profil — rien à maintenir. - Pipeline données en 2 temps :
data/ubud_raw.json= cache brut Overpass (4,2 Mo) →scripts/build_data.py(Python stdlib) →public/data/ubud.jsoncompact (0,7 Mo). Rafraîchir la ville = relancer le curl Overpass (requête dansscripts/overpass_query.txt) puis le script. - three.js r169 vendorisé (
public/vendor/, avec OrbitControls et BufferGeometryUtils) : pas de CDN, pas de build step, pas de npm. ES modules + importmap natif. - Accès public, sans auth : démo sous le domaine perso, rien de sensible.
noindexposé quand même.
Données OpenStreetMap
- Zone : bbox ~3,4 × 3,6 km centrée sur Ubud (−8.523→−8.492 / 115.245→115.278), du Campuhan Ridge au Monkey Forest. Récupéré : 5 583 bâtiments (dont 1 600 avec hauteur ou étages réels), 1 365 routes, 84 rivières, 73 zones vertes.
- Hauteurs : tag
heightsi présent, sinonbuilding:levels× 3,2 m, sinon hauteur par type (maison 4,5 m, hôtel 9 m, temple 7 m…) avec variation pseudo-aléatoire stable (seedée par l'id OSM → rendu identique à chaque rebuild). - Multipolygones : seul l'anneau extérieur est extrudé (cours intérieures ignorées, négligeable à cette échelle).
- Terrain plat : intégrer un MNT (SRTM) aurait doublé la complexité pour un gain incertain. Les rivières dessinées au sol suggèrent les gorges. Évolution possible.
Rendu
- Un draw call par famille : murs fusionnés en un mesh, toits en un autre (couleurs par sommet), routes/rivières/verdure par classe. ~15 draw calls → fluide même sur mobile.
- Toits ≠ murs : les groupes de l'ExtrudeGeometry (couvercles / flancs) permettent des toits tuile-chaume balinais (temples en chaume sombre) et des murs enduits clairs. Palette par type (maison / hôtel / commerce / temple).
- Cycle jour-nuit : 12 images-clés (ciel, soleil, brouillard, exposition) interpolées sur 24 h. Course du soleil quasi zénithale (Bali ≈ équateur), ombres portées PCF 2048. Ciel = dôme shader (dégradé + halo solaire), 900 étoiles la nuit.
- Fenêtres la nuit : ~20 000 points additifs (sprite canvas) sur les façades, ~42 % des emplacements « habités » (seedé, stable). Un vrai plan de fenêtres aurait explosé le budget géométrie pour rien.
- Curseur temps : slider 0-24 h, presets aube/midi/fin d'après-midi/coucher/nuit, bouton Cycle (journée complète en 75 s).
- Correctif notable : rubans routes/rivières invisibles puis noirs (winding + normales) → indices retriangulés + matériaux
DoubleSide.
Exposition
- vhost nginx
ubud.gilbertval.fr→ root statique, gzip, cache long survendor/etdata/. - Certificat Let's Encrypt via
certbot --nginx(HTTP-01 — l'A étant non proxifié, pas besoin du plugin Cloudflare).