diff --git a/remotion/public/orte/garten_herbst.webp b/remotion/public/orte/garten_herbst.webp index 4931a68..5995892 100644 Binary files a/remotion/public/orte/garten_herbst.webp and b/remotion/public/orte/garten_herbst.webp differ diff --git a/remotion/public/orte/garten_herbst_abend.webp b/remotion/public/orte/garten_herbst_abend.webp index 2a000f6..fbe5616 100644 Binary files a/remotion/public/orte/garten_herbst_abend.webp and b/remotion/public/orte/garten_herbst_abend.webp differ diff --git a/remotion/src/baukasten/orte.tsx b/remotion/src/baukasten/orte.tsx index 39a85f1..663e15b 100644 --- a/remotion/src/baukasten/orte.tsx +++ b/remotion/src/baukasten/orte.tsx @@ -221,6 +221,50 @@ export const GartenSVG: React.FC<{nacht?: boolean}> = ({nacht = false}) => ( ); +// Folge 1: alter Apfelbaum wie in den Higgsfield-Bildern – knorriger Stamm mit +// Wurzelansatz und Rinde, weit ausladende kahle Äste, nur noch wenige Blätter. +// Ein Zweig führt zum Apfel (Apfel selbst ist ein eigenes Teil, siehe APFEL in folge01/szene2). +const AlterBaum: React.FC<{x: number; y: number; s?: number; abend?: boolean; apfel?: [number, number]}> = ({x, y, s = 1, abend, apfel}) => { + const stamm = abend ? '#5e4a3c' : '#7a6452'; + const ast = abend ? '#56443a' : '#6b5646'; + const rinde = abend ? '#3e3028' : '#4f3e32'; + return ( + + + + + + + + + {apfel && ( + + + + + )} + {/* Stamm mit Wurzelansatz, gabelt sich in zwei dicke Äste */} + + {/* Rinde */} + {[-24, -8, 8, 22].map((dx, i) => ( + + ))} + + + {/* die letzten Blätter */} + {new Array(14).fill(0).map((_, i) => { + const bx = -300 + random('ab' + i) * 600; + const by = -720 + random('aby' + i) * 330; + return ; + })} + + ); +}; + // Folge 1: Noas Garten im goldenen Herbst (Morgen) bzw. im Abendlicht. // Ohne Holzstapel (der kommt erst in Folge 2); Apfel, Blume und Laubhaufen sind eigene Teile. export const GartenHerbstSVG: React.FC<{abend?: boolean}> = ({abend = false}) => ( @@ -271,7 +315,7 @@ export const GartenHerbstSVG: React.FC<{abend?: boolean}> = ({abend = false}) => ); })} - + ); diff --git a/remotion/src/folge01/szene2.tsx b/remotion/src/folge01/szene2.tsx index d9c1280..85987c5 100644 --- a/remotion/src/folge01/szene2.tsx +++ b/remotion/src/folge01/szene2.tsx @@ -1,7 +1,7 @@ import React from 'react'; import {useCurrentFrame} from 'remotion'; import {kurve} from '../bewegung'; -import {ClipFigur, Figur, Geher, Kamera, NOA_HOCKE_FRAMES, NoaHocke} from '../baukasten/figur'; +import {ClipFigur, Figur, Geher, Kamera} from '../baukasten/figur'; import {Blende, Vignette, atmen, hopfStauch, huepfer, kamFahrt, ruck} from '../baukasten/helfer'; import {Apfel, Blaetterregen, Blaetterwind, Blume, Laubhaufen} from '../baukasten/natur'; import {BODEN, Ort} from '../baukasten/orte'; @@ -44,7 +44,7 @@ export const Szene2: React.FC = () => { const {z, dauer} = S2; // Noa kommt von links, springt bei „Hui!“ mitten in den Haufen und hüpft wieder heraus - const noaAn = z.e3.ende - 10; + const noaAn = z.bild0.start + 10 + 165; // zügig, ca. 5,5 s const sprung = z.n1.start + 4; const SPRUNG_DAUER = 22; const landung = sprung + SPRUNG_DAUER; @@ -71,18 +71,20 @@ export const Szene2: React.FC = () => { [schreck, 'noa_B2_erschrocken'], [z.n2.start + 6, 'noa_A4_staunen'], [z.e6.start, 'noa_A6_blick-rechts'], + [hocke, 'noa_B_hocken'], [aufstehen, 'noa_A3_lachen'], [z.p2.start + 10, 'noa_A6_blick-rechts'], ]; - // Hocke: Clip „hinsetzen“ bis zur Hocke, zum Aufstehen rückwärts - const inHocke = f >= hocke && f < aufstehen + NOA_HOCKE_FRAMES; - const hockeStart = f < aufstehen ? hocke : aufstehen; + // Hocke: Standbilder weich überblenden, dabei kurz absinken bzw. sich strecken + const HOCKE_BLENDE = 14; + const wechsel = (t: number) => (f >= t && f < t + HOCKE_BLENDE ? Math.sin(((f - t) / HOCKE_BLENDE) * Math.PI) : 0); + const hockeStauch = 1 - 0.05 * wechsel(hocke) + 0.03 * wechsel(aufstehen); const noaY = BODEN + sprungY + huepfer(f, raus, 60, 16) + ruck(f, schreck, 3) + - huepfer(f, aufstehen + NOA_HOCKE_FRAMES + 4, 14, 10); + huepfer(f, aufstehen + HOCKE_BLENDE + 4, 14, 10); // Laubhaufen: wird bei der Landung gestaucht, später raschelt er const flach = kurve(f, [ @@ -151,11 +153,9 @@ export const Szene2: React.FC = () => { {imHaufen && } {imHaufen ? null : noaGeht ? ( - - ) : inHocke ? ( - = aufstehen} x={noaX} y={BODEN} /> + ) : ( - + = hocke ? HOCKE_BLENDE : 5} /> )}