Zum Hauptinhalt springen

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 aus KAROSSERIE_TYPEN — im privaten R2-Bucket taktano-models unter karosserie/<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 Bucket taktano-models selbst muss ggf. erst angelegt/verifiziert werden (§4/§7b.1). Gemeinsamer Ablauf in Bildbewertung.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: wrangler installiert + eingeloggt am Deploy-/Prod-Konto, Node ≥ 22 (Setup s. §0a). Golden Rule Zero-Trust: taktano-models bleibt privat (kein r2.dev / keine Public-Custom-Domain).

0. Was schon da ist (nicht neu bauen)​

BausteinOrtStatus
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.tsgebaut · 404 ohne Binding
Privat-CI-Gate (blockt Deploy, falls Bucket öffentlich)scripts/check-r2-private.mjsverdrahtet
Datenmodell (karosserieTyp + markierungen[])OP-R6-2 V-1 (0.160.x)gebaut

Nicht vorausgesetzt: der R2-Bucket taktano-models selbst — 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ägt wrangler r2 object put fehl.

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 mit npx 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.

WegQuelleFormat
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 TypPoly 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 MAPPING im Skriptkopf anpassen oder eine mapping.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-binary ist wichtig — serveModellAsset gibt den beim Upload gesetzten Content-Type 1:1 weiter; ohne ihn käme application/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)