Fahrzeug-3D-Modelle beschaffen & scharf schalten (OP-R6-2 V-1b)
Kernaussage. Um die sichtbare 3D-Fahrzeugsicht (V-2) freizuschalten, brauchst du 7 generische CC0-Karosserie-Modelle als
.glb— eins je Katalog-Key ausKAROSSERIE_TYPEN— im privaten R2-Buckettaktano-modelsunterkarosserie/<key>.glb. Das Aufbereiten erledigt ein Skript (build-fahrzeug-modelle.mjs), das Hochladen + Scharfschalten ist ein Operator-/Deploy-Schritt (Binär-Assets gehören nach R2, nicht ins Git). Die Worker-Route/models/*, das Privat-CI-Gate und die (dormante) Binding-Konfiguration existieren bereits — der Buckettaktano-modelsselbst muss ggf. erst angelegt/verifiziert werden (§4/§7b.1). Gemeinsamer Ablauf inBildbewertung.md §7b; hier nur die Fahrzeug-GLB-Spezifika. · Status: V-1 gebaut (0.160.x) · V-1b-Tooling gebaut 2026-08-02 (Skript + Runbook) · V-1b-Deploy offen (Operator: Bucket anlegen/verifizieren + Upload) · V-2 offen · Bezug: OP-R6-2 (Owning) · Bildbewertung §7b (geteilter Bucket) · OP-QS-2 · Zielgruppe: DevOps/IT-Ops (Deploy) · Produkt (Auswahl/Lizenz) · True North: Frage 2 (wo stehen die Fahrzeuge / was ist am Fahrzeug) — Schäden/Mängel künftig räumlich am 3D-Modell verorten.Voraussetzung:
wranglerinstalliert + eingeloggt am Deploy-/Prod-Konto, Node ≥ 22 (Setup s. §0a). Golden Rule Zero-Trust:taktano-modelsbleibt privat (kein r2.dev / keine Public-Custom-Domain).
0. Was schon da ist (nicht neu bauen)
| Baustein | Ort | Status |
|---|---|---|
Bucket-Binding MODELLE_BUCKET / taktano-models (EU) | server/wrangler.toml (auskommentiert) | dormant → §4 einschalten |
Auslieferung GET /models/* (privat, Access-geschützt, serveModellAsset) | server/party/leitstand.ts | gebaut · 404 ohne Binding |
| Privat-CI-Gate (blockt Deploy, falls Bucket öffentlich) | scripts/check-r2-private.mjs | verdrahtet |
Datenmodell (karosserieTyp + markierungen[]) | OP-R6-2 V-1 (0.160.x) | gebaut |
Nicht vorausgesetzt: der R2-Bucket
taktano-modelsselbst — er existiert nur, wenn ihn ein Operator (für die Bildbewertung o. hier) bereits angelegt hat. Vor dem Upload verifizieren/anlegen (§4/§7b.1), sonst schlägtwrangler r2 object putfehl.
Der Bucket ist geteilt mit den Bildbewertungs-ML-Modellen (mediapipe/*, nsfwjs/*, §7b). Die
Fahrzeug-GLBs sind schlicht neue Pfade (karosserie/*) im selben Bucket — serveModellAsset liefert
jeden /models/*-Key generisch aus.
0a. wrangler einrichten (einmalig)
wrangler ist kein globales Programm, sondern kommt aus npm. Ist es nicht installiert (zsh: command not found: wrangler), es entweder repo-lokal (schon Dev-Dependency in server/) oder global nutzen:
# repo-lokal (empfohlen — keine globale Installation):
cd server && npx wrangler --version
# ODER global:
npm install -g wrangler
Am Deploy-/Prod-Konto einloggen (nötig, sonst schlagen alle r2-Befehle fehl):
npx wrangler login # Browser-Login
# ODER (CI/headless): export CLOUDFLARE_API_TOKEN=… (Token mit R2-Edit-Recht; für den Privacy-Check auch R2-Leserecht)
Die
wrangler-Befehle unten mitnpx wrangler …aufrufen, falls nicht global installiert. Die--file build/fahrzeug-modelle/…-Pfade sind relativ zum Repo-Root — aus dem Root ausführen oder absolute Pfade nehmen (das Skript druckt die Befehle für den Ort, an dem du es ausgeführt hast).
1. Modelle beschaffen (CC0)
Empfohlen: Kenney „Car Kit" — eine CC0-Quelle, konsistenter Low-Poly-Stil/Maßstab (wichtig, damit die Markierungs-Koordinaten je Modell gleich sitzen), viele Typen in einem Pack.
| Weg | Quelle | Format |
|---|---|---|
| A (empfohlen) | kenney.nl/assets/car-kit → kenney_car-kit.zip (CC0, glTF+OBJ+FBX) | glTF → Skript konvertiert nach .glb |
| B (schon GLB) | Eclair „Car Kit GLB Pack" (CC0-Repack, .glb) | .glb (Lizenz im Zip prüfen) |
| Fallback je Typ | Poly Pizza / Quaternius (alle CC0, einzeln) | glTF |
Bei Kenney „Continue without donating", bei itch „No thanks, just take me to the downloads" → kostenlos.
Zip entpacken → merke dir das Verzeichnis mit den .glb/.gltf-Dateien.
2. Aufbereiten (Skript)
node scripts/build-fahrzeug-modelle.mjs --in <entpacktes-pack-verzeichnis> [--optimize]
Das Skript (scripts/build-fahrzeug-modelle.mjs) löst je Katalog-Key
das nächstpassende Quell-Modell auf, konvertiert glTF→.glb (via @gltf-transform/cli, --optimize =
Meshopt-Kompression), benennt in karosserie/<key>.glb um und schreibt eine LICENSE.md (Provenienz, §2).
Ausgabe standardmäßig nach build/fahrzeug-modelle/ (gitignored — Binärformate nie ins Git).
- Mapping passt nicht? Nach dem Entpacken die echten Dateinamen ansehen und entweder
MAPPINGim Skriptkopf anpassen oder einemapping.json{ "<key>": "<basename>" }ins Eingabeverzeichnis legen. - Vorschau ohne Dateien:
node scripts/build-fahrzeug-modelle.mjs --dry-run. - Die 7 Keys (fix, =
KAROSSERIE_TYPEN):limousine · kombi · suv · van · coupe · kleinwagen · pickup.
Lizenz-Nachweis (verbindlich, §2 + Compliance): die erzeugte LICENSE.md (Quelle/Autor/Lizenz/Datum je
Datei) füllen und in docs/betrieb/Compliance.md/SBOM nachziehen — analog dem §7b-Punkt „Modell-Lizenzen".
CC0 = keine Namensnennungspflicht; CC-BY = Autor Pflicht + In-App-Credits → besser durch CC0 ersetzen.
3. Hochladen (privat, EU) — Operator-Schritt
Das Skript druckt die exakten Befehle. Je Modell:
wrangler r2 object put taktano-models/karosserie/suv.glb \
--file build/fahrzeug-modelle/karosserie/suv.glb \
--content-type model/gltf-binary --jurisdiction eu --remote
--content-type model/gltf-binaryist wichtig —serveModellAssetgibt den beim Upload gesetzten Content-Type 1:1 weiter; ohne ihn kämeapplication/octet-stream(funktioniert im<model-viewer>, ist aber nicht spec-korrekt).--jurisdiction eu= DSGVO-Residenz. Bucket privat lassen (kein r2.dev).
4. Binding & Basis-URL scharf schalten — = Bildbewertung.md §7b
Bucket anlegen, Binding einschalten und das Privat-Gate greifen lassen (MODELLE_BASIS_URL nur für aktive ML-Bildbewertung, für Fahrzeug-only leer lassen — s. u.) sind der
gemeinsame Ablauf für taktano-models — Schritte 1, 3, 4, 5 in Bildbewertung.md §7b.
Kurzform (Details dort):
Bucket prüfen (existiert er + ist er privat?), erst dann ggf. anlegen — create allein prüft nichts:
wrangler r2 bucket list --jurisdiction eu # taktano-models MUSS in der EU-Liste erscheinen
node scripts/check-r2-private.mjs # Privacy-Check (R2-Leserecht nötig) MUSS grün sein
wrangler r2 bucket create taktano-models --jurisdiction eu # NUR falls oben nicht gelistet (§7b.1)
Vorbedingung für den Upload (§3): taktano-models ist in der EU-Bucket-Liste und der Privacy-Check ist erfolgreich.
Binding einschalten:
# server/wrangler.toml — auskommentierten Block einschalten (§7b.3):
[[r2_buckets]]
binding = "MODELLE_BUCKET"
bucket_name = "taktano-models"
jurisdiction = "eu"
MODELLE_BASIS_URL für eine reine Fahrzeug-Auslieferung NICHT setzen (leer lassen): ein nicht-leerer Wert
aktiviert die ML-Adapter der Bildbewertung (autoErkennungAktiv()). Die V-2-Komponente lädt fest über den
same-origin-Pfad /models/karosserie/<karosserieTyp>.glb — sie braucht nur MODELLE_BUCKET, nicht MODELLE_BASIS_URL.
5. Verifizieren (Vier-Augen)
/models/* liegt hinter Cloudflare Access — ein anonymer Request landet auf der Access-Login-Umleitung,
nicht am Asset. Daher Access-authentifiziert prüfen (Service-Token oder authentifizierte Session):
# Service-Token-Header (CF-Access-Client-Id/-Secret); 200 + Content-Type model/gltf-binary erwartet:
curl -sI https://app.taktano.com/models/karosserie/suv.glb \
-H "CF-Access-Client-Id: $CF_ACCESS_CLIENT_ID" \
-H "CF-Access-Client-Secret: $CF_ACCESS_CLIENT_SECRET"
Erwartet: 200 + Content-Type: model/gltf-binary. Ohne Binding/Objekt → 404 (dormant, kein Fehler);
ohne gültige Access-Credentials → Login-Redirect (nicht das Asset). Danach kann V-2 (Lazy-<model-viewer>)
die Modelle je karosserieTyp anzeigen.
Vier-Augen-Prüfung (G-4, hart): Die Freigabe („Assets korrekt, privat,
200/richtiger Content-Type") muss durch eine andere Person als den/die Hochladende erfolgen — der/die Ausführende verifiziert das eigene Ergebnis nicht selbst. Verifizierer, Zeitpunkt und Resultat festhalten. Abweichung nur durch den Chef, je Prüfschritt begründet + auditiert (OP-QS-6). Der Umfang bleibt ein leichtes Review (ein Augenpaar auf die vier Prüfpunkte), keine schwere QS-Zeremonie — aber das zweite Augenpaar ist nicht optional.
Zusammenspiel (Überblick)
Danach offen: V-2 (sichtbarer Viewer) · V-3 (Markieren-per-Klick) · V-4 (Mangel/AR) — s.
Fahrzeug-3D.md §7.
↩ Zurück zur Doku-Landkarte · Lesepfade · Register (alle OPs)