From 4f83fbc587648307981f2823d12f9492d66e4888 Mon Sep 17 00:00:00 2001 From: Lara Date: Mon, 2 Nov 2026 16:06:32 +0100 Subject: [PATCH] =?UTF-8?q?Folge=202=20=C3=BCberarbeitet=20nach=20den=20Le?= =?UTF-8?q?hren=20aus=20Folge=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Noas Hocke (Szenen 3 und 4) als weiche Überblendung der Standbilder statt Hinsetz-Clip (anders gezeichnet); Beugen/Schieben am Nest bleiben - Noas Schritttempo passend zur Geschwindigkeit (Szene 2: 1.6, Szene 4 zügiger) - Pino schaut beim Zählen zu Noa (gespiegelt) - leeres Nest: kein Schatten ohne Blätter (doppelter Schatten entfernt) - Lied (Folge 1 und 2): Kamera etwas tiefer, Figuren höher im Bild Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_018MyLusGH2U5AudjoARey3N --- remotion/src/baukasten/natur.tsx | 5 +--- remotion/src/folge01/lied.tsx | 2 +- remotion/src/folge02/lied.tsx | 2 +- remotion/src/folge02/szene2.tsx | 2 +- remotion/src/folge02/szene3.tsx | 8 ++++-- remotion/src/folge02/szene4.tsx | 48 +++++++++++++++++++------------- 6 files changed, 39 insertions(+), 28 deletions(-) diff --git a/remotion/src/baukasten/natur.tsx b/remotion/src/baukasten/natur.tsx index ef6c7c1..1ecceed 100644 --- a/remotion/src/baukasten/natur.tsx +++ b/remotion/src/baukasten/natur.tsx @@ -174,7 +174,7 @@ export const NEST_BILD = {b: 440, h: 260, x: 220, y: 180}; // Bildgröße und La export const NestBlaetter: React.FC<{voll?: number; seite: 'hinten' | 'vorne'}> = ({voll = 1, seite}) => ( <> {seite === 'hinten' && ( -
+
)} {NEST[seite].map((b, i) => b.reihe < voll ? : null, @@ -190,9 +190,6 @@ export const Nest: React.FC<{x: number; y: number; voll?: number; seite: 'hinten /> ) : (
- {seite === 'hinten' && ( -
- )}
); diff --git a/remotion/src/folge01/lied.tsx b/remotion/src/folge01/lied.tsx index f1c1763..9e10900 100644 --- a/remotion/src/folge01/lied.tsx +++ b/remotion/src/folge01/lied.tsx @@ -65,7 +65,7 @@ export const Lied: React.FC = () => { ]; return ( <> - + diff --git a/remotion/src/folge02/lied.tsx b/remotion/src/folge02/lied.tsx index 841c08c..43f9125 100644 --- a/remotion/src/folge02/lied.tsx +++ b/remotion/src/folge02/lied.tsx @@ -36,7 +36,7 @@ export const Lied: React.FC = () => { const schwank = (phase: number, g: number) => Math.sin((f * Math.PI) / (2 * TAKT) + phase) * g; return ( <> - + { <> - {noaGeht ? : } + {noaGeht ? : } {!pinoDa ? null : pinoGeht ? : } diff --git a/remotion/src/folge02/szene3.tsx b/remotion/src/folge02/szene3.tsx index 4f00c97..415eca9 100644 --- a/remotion/src/folge02/szene3.tsx +++ b/remotion/src/folge02/szene3.tsx @@ -1,7 +1,7 @@ import React from 'react'; import {useCurrentFrame} from 'remotion'; import {kurve} from '../bewegung'; -import {ClipFigur, Figur, Geher, Kamera, NoaHocke} from '../baukasten/figur'; +import {ClipFigur, Figur, Geher, Kamera} from '../baukasten/figur'; import {Blende, Vignette, atmen, hopfStauch, huepfer, kamFahrt} from '../baukasten/helfer'; import {Blaetterwind, Blatt, Voegel} from '../baukasten/natur'; import {BODEN, Ort} from '../baukasten/orte'; @@ -125,7 +125,11 @@ export const Szene3: React.FC = () => { [z.l1.start + 15, 'noa_A3_lachen'], [z.e1.start, 'noa_A6_blick-rechts'], [z.bild2.start + 30, 'noa_B1_traurig'], + [knien, 'noa_B_hocken'], ]; + // in die Hocke: Standbilder weich überblenden, dabei kurz absinken + const HOCKE_BLENDE = 14; + const hockeStauch = f >= knien && f < knien + HOCKE_BLENDE ? 1 - 0.05 * Math.sin(((f - knien) / HOCKE_BLENDE) * Math.PI) : 1; const noaGeht = f >= knien - 36 && f < knien; const kam = kamFahrt(f, [ @@ -154,7 +158,7 @@ export const Szene3: React.FC = () => { ) : ( - {noaGeht ? : f >= knien ? : } + {noaGeht ? : = knien ? HOCKE_BLENDE : 5} />} {f > blattFaellt && } {lulu} diff --git a/remotion/src/folge02/szene4.tsx b/remotion/src/folge02/szene4.tsx index 972f832..de9a139 100644 --- a/remotion/src/folge02/szene4.tsx +++ b/remotion/src/folge02/szene4.tsx @@ -1,7 +1,7 @@ import React from 'react'; import {useCurrentFrame} from 'remotion'; import {kurve} from '../bewegung'; -import {Figur, Geher, Kamera, NOA_HOCKE_FRAMES, NoaHocke} from '../baukasten/figur'; +import {Figur, Geher, Kamera} from '../baukasten/figur'; import {Blende, LULU_MAUL_A1, LULU_MAUL_LINKS, Vignette, atmen, hopfStauch, huepfer, kamFahrt, punkt, ruck} from '../baukasten/helfer'; import {Blaetterregen, Blatt, LAUB, Nest, Ruf} from '../baukasten/natur'; import {BODEN, NEST_X, Ort} from '../baukasten/orte'; @@ -54,13 +54,13 @@ export const Szene4: React.FC = () => { // Noa const noaGehtVon = zumStapel + 20; - const noaGehtBis = noaGehtVon + 90; + const noaGehtBis = noaGehtVon + 60; const noaX = kurve(f, [ [noaGehtVon, NOA_X + 140], [noaGehtBis, NOA_ZAEHL_X], ]); const noaGeht = f > noaGehtVon && f < noaGehtBis; - const noaPose: [number, string][] = [ + const noaStehPose: [number, string][] = [ [0, 'noa_A3_lachen'], [noaGehtBis, 'noa_A6_blick-rechts'], [z.c5.ende, 'noa_A3_lachen'], @@ -68,17 +68,19 @@ export const Szene4: React.FC = () => { [z.l2.ende, 'noa_A3_lachen'], [z.e4.start, 'noa_A3_lachen'], ]; - // Hocke: Clip vorwärts (runter) oder rückwärts (aufstehen); sonst Standbilder - const hocke = (() => { - const w = (start: number, auf: boolean) => ({start, auf}); - if (f < z.n1.start + 30) return w(-1000, false); - if (f < z.n1.start + 30 + NOA_HOCKE_FRAMES) return w(z.n1.start + 30, true); - if (f >= z.n2.start - 15 && f < z.c5.ende) return w(z.n2.start - 15, false); - if (f >= z.c5.ende && f < z.c5.ende + NOA_HOCKE_FRAMES) return w(z.c5.ende, true); - if (f >= zurueck && f < z.e4.start) return w(-1000, false); - if (f >= z.e4.start && f < z.e4.start + NOA_HOCKE_FRAMES) return w(z.e4.start, true); - return null; - })(); + // Hocke: Abschnitte, in denen Noa hockt; Wechsel als weiche Überblendung der Standbilder + // (der Hinsetz-Clip ist anders gezeichnet), dabei kurz absinken bzw. sich strecken + const HOCKE_BLENDE = 14; + const hockZeiten: [number, number][] = [ + [-1000, z.n1.start + 30], + [z.n2.start - 15, z.c5.ende], + [zurueck, z.e4.start], + ]; + const inHocke = hockZeiten.some(([a, b]) => f >= a && f < b); + const stehPose = (t: number) => noaStehPose.filter(([s]) => s <= t).pop()![1]; + const noaPose: [number, string][] = [...noaStehPose, ...hockZeiten.flatMap(([a, b]): [number, string][] => [[a, 'noa_B_hocken'], [b, stehPose(b)]])].sort((p, q) => p[0] - q[0]); + const bump = (t: number) => (f >= t && f < t + HOCKE_BLENDE ? Math.sin(((f - t) / HOCKE_BLENDE) * Math.PI) : 0); + const hockeStauch = hockZeiten.reduce((s, [a, b]) => s * (1 - 0.05 * bump(a)) * (1 + 0.03 * bump(b)), 1); // beim Hinlegen jedes Blatts kurz nach vorn beugen const beugen = zaehlen.reduce((s, c) => s + Math.max(0, Math.sin(Math.min(1, Math.max(0, (f - c + 8) / 16)) * Math.PI)), 0); // beim Nestbau schieben (vor und zurück) @@ -104,10 +106,12 @@ export const Szene4: React.FC = () => { const pinoGeht = (f > pinoGehtVon && f < pinoGehtBis) || (f > zurueck + 10 && f < zurueck + 60); const pinoSpiegel = f > pinoGehtVon && f < pinoGehtBis; // nach rechts const imNest = f >= z.bild5.start; + // Pino sitzt beim Zählen rechts von Noa: seine Bilder schauen nach rechts, darum gespiegelt (schaut zu ihr) + const pinoZuNoa = f >= pinoGehtBis && f <= zurueck + 10; const pinoPose: [number, string][] = [ [0, 'pino_A1_augen-zu'], [z.n1.start + 20, 'pino_A2_augen-halb'], - [pinoGehtBis, 'pino_A5_blick-links'], + [pinoGehtBis, 'pino_A6_blick-rechts'], ...zaehlen.map((c) => [c, 'pino_A4_staunen'] as [number, string]), [z.c5.ende, 'pino_A3_lachen'], [niesen + 4, 'pino_B2_erschrocken'], @@ -217,11 +221,16 @@ export const Szene4: React.FC = () => { )} {noaGeht ? ( - - ) : hocke ? ( - + ) : ( - + )} {/* das große Blatt aus Szene 3 bleibt liegen */} {f < zurueck + 40 && zurueck ? 1 - (f - zurueck) / 40 : 1} />} @@ -234,6 +243,7 @@ export const Szene4: React.FC = () => { ) : (