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 = () => {
) : (