3D-Einstellungen
Three.js (Live-Ebene)
- Verwende
threeLayer(el, { update(t), background, fov })aus/engines/three.js. Füge eine Import-Map fürthreehinzu (sieheexamples/engines-demo/index.html). update(t)setzt jede Transformation basierend auft. Kamerafahrten: Keyframes mit einem GSAP-Tween auf einem einfachen Objekt (tl.to(cam, { x: 4, z: 8, duration: 2 }, 3)) und kopiere sie incamera.positioninnerhalb vonupdate.- Modelle:
GLTFLoaderausthree/addons/loaders/GLTFLoader.js(füge"three/addons/": "/core/node_modules/three/examples/jsm/"zur Import-Map hinzu). Wickle den Ladevorgang inStudio.wait(...)ein. Lege Modelldateien im Ordnerassets/models/der Marke oder imcomposition/-Ordner der Produktion ab. - Der Look (
looks/README.md) bestimmt den Rendering-Stil; dasselbe Modell kann auf jede dieser Arten gestaltet werden:- Cartoon (
looks/toon-3d):toon(color, { steps })+outline(mesh, { thickness }). Hartes Licht: einDirectionalLight+ schwachesAmbientLight. - Realistisch (
looks/photoreal):await realistic(renderer, scene)(wickle inStudio.waitein: ACES Tone Mapping, eine Studio-Umgebung für Reflexionen, weiche Schatten) +pbr(color, { metalness, roughness, clearcoat }). Ein Schlüssellicht mitcastShadow, ein kühles Randlicht von hinten, einShadowMaterial-Boden über einem CSS-Verlauf. Halte die Kamera oberhalb flacher Einfallswinkel (glänzende Flächen werden sonst weiß), bewege sie langsam, rendere das Finale mitStudio.setup({ motionBlur: true }). - Neon (
looks/neon-noir):emissive(color, intensity)+threeLayer(el, { post: bloom({ strength, threshold }) }),scene.fog. Haltethreshold≥ 0,2 und emissiv ≤ 2, da sonst alles weiß aufblüht.
- Cartoon (
- Animierte GLB-Clips: Erstelle einen
AnimationMixer, rufe dann inupdatemixer.setTime(t - start)auf. Verwende niemalsmixer.update(delta). - HTML-Tags, die 3D-Punkten folgen: Rufe in
update(t)zuerstcamera.updateMatrixWorld()undupdateMatrixWorld()des Elternobjekts auf, bevor duvector.applyMatrix4(obj.matrixWorld).project(camera)ausführst. Three.js aktualisiert diese nur innerhalb vonrender(), daher folgt ein Tag ohne diesen Aufruf dem vorherigen Frame. Beispiel:productions/bike-logger/REEL-002-engines. - CAD-Meshes als JSON (Vertices + Indizes):
toNonIndexed()+computeVertexNormals()erzeugen scharfe, flache Facetten. Rendere mitthreeLayer(..., { pixelRatio: 2 })für überabgetastete Kanten. - Physik: Vorberechnung (simuliere mit einer festen Schrittweite von 1/120 s in ein Array vor dem ersten Frame) und suche nach
t. - Sprechender Charakter: Lade
/engines/lipsync.jsund die.visemes.jsder Zeile (vonscripts/lipsync.sh) mit klassischen<script>-Tags, dann inupdate(t):LipSync.paramsAt(cues, t, "mouth", { offset })→{ open, wide, round }(0…1) auf Morph-Targets (mesh.morphTargetInfluences) oder die Skalierung eines Mund-Meshes. Sieheengines/README.md, Lip sync.
Blender (Platte)
- Ein Szenen-Skript definiert
build(ctx); kopiereengines/blender/example_scene.py.ctxbietettoon(rgb),key(obj, "location", t, value),size,fps,duration,frames,scene. - Rendern:
engines/blender/render.sh scene.py composition/plates/<name>.mp4 --size 1080x1920 --duration 4 [--engine EEVEE|CYCLES|WORKBENCH]. Entwurf mit--size 540x960, Finale in voller Größe. - Hintergrundfarbe: Zeige sie nur der Kamera an (Light Path "Is Camera Ray"-Mix, wie im Beispiel), oder sie beleuchtet die Szene und glättet Toon-Bänder.
- Die Farbverwaltung ist auf Standard gesetzt, damit Marken-Hex-Farben exakt so ausgegeben werden. Für eine fotorealistische Platte wechsle zu
ctx["scene"].view_settings.view_transform = "AgX"inbuild, rendere mit--engine CYCLESund verwende Flächenleuchten sowie Kamera-Tiefenschärfe. - Physik und Simulationen: Berechne sie im Szenen-Skript vor dem Rendern vor.
- Sprechender Charakter:
import lipsync as Lim Szenen-Skript (run.pyfügtengines/blender/und das eigene Skriptverzeichnis zum Pfad hinzu),cues = L.load("productions/…/audio/vo.visemes.json"), dannL.key_shape_keys(head, cues, ctx, offset=VO_START)keyt die Shape-Keysopen,wide,roundauf jedem Frame (names={"open": "Jaw"}für andere Namen). Alles andere:L.params_at(cues, t, offset=…)pro Frame mitctx["key"]. - In der Komposition:
<video src="plates/<name>.mp4">+Studio.video(el, { start }). Platten haben kein Alpha; setze Text und Charaktere mit HTML-Ebenen darüber.
Überprüfung
Rendere die wichtigsten Beats als Standbilder und betrachte sie. Für Three.js rendere einen Frame zweimal und vergleiche die MD5-Prüfsummen. Notiere die Renderzeiten im Produktions-Log.