diff --git a/remotion/public/figuren/lulu/einfluss/hals.png b/remotion/public/figuren/lulu/einfluss/hals.png index 239de26..920f348 100644 Binary files a/remotion/public/figuren/lulu/einfluss/hals.png and b/remotion/public/figuren/lulu/einfluss/hals.png differ diff --git a/remotion/public/figuren/noa/einfluss/arm_links.png b/remotion/public/figuren/noa/einfluss/arm_links.png index 1bcf588..28e43bf 100644 Binary files a/remotion/public/figuren/noa/einfluss/arm_links.png and b/remotion/public/figuren/noa/einfluss/arm_links.png differ diff --git a/remotion/public/figuren/noa/einfluss/daumen_links.png b/remotion/public/figuren/noa/einfluss/daumen_links.png new file mode 100644 index 0000000..283f8d5 Binary files /dev/null and b/remotion/public/figuren/noa/einfluss/daumen_links.png differ diff --git a/remotion/public/figuren/noa/einfluss/daumen_rechts.png b/remotion/public/figuren/noa/einfluss/daumen_rechts.png new file mode 100644 index 0000000..69094bb Binary files /dev/null and b/remotion/public/figuren/noa/einfluss/daumen_rechts.png differ diff --git a/remotion/public/figuren/noa/einfluss/hand_links.png b/remotion/public/figuren/noa/einfluss/hand_links.png index 540991b..91acd5f 100644 Binary files a/remotion/public/figuren/noa/einfluss/hand_links.png and b/remotion/public/figuren/noa/einfluss/hand_links.png differ diff --git a/remotion/public/figuren/noa/teile/arm_links.png b/remotion/public/figuren/noa/teile/arm_links.png index d4abaa3..30a9f8e 100644 Binary files a/remotion/public/figuren/noa/teile/arm_links.png and b/remotion/public/figuren/noa/teile/arm_links.png differ diff --git a/remotion/public/figuren/noa/teile/daumen_links.png b/remotion/public/figuren/noa/teile/daumen_links.png new file mode 100644 index 0000000..764d675 Binary files /dev/null and b/remotion/public/figuren/noa/teile/daumen_links.png differ diff --git a/remotion/public/figuren/noa/teile/daumen_rechts.png b/remotion/public/figuren/noa/teile/daumen_rechts.png new file mode 100644 index 0000000..4631763 Binary files /dev/null and b/remotion/public/figuren/noa/teile/daumen_rechts.png differ diff --git a/remotion/public/figuren/noa/teile/hand_links.png b/remotion/public/figuren/noa/teile/hand_links.png index 62a13f1..fd4c23e 100644 Binary files a/remotion/public/figuren/noa/teile/hand_links.png and b/remotion/public/figuren/noa/teile/hand_links.png differ diff --git a/remotion/public/figuren/noa/teile/hand_rechts.png b/remotion/public/figuren/noa/teile/hand_rechts.png index 78175c4..0973496 100644 Binary files a/remotion/public/figuren/noa/teile/hand_rechts.png and b/remotion/public/figuren/noa/teile/hand_rechts.png differ diff --git a/remotion/public/figuren/noa/teile/rumpf.png b/remotion/public/figuren/noa/teile/rumpf.png index 1bb1c82..fbce73f 100644 Binary files a/remotion/public/figuren/noa/teile/rumpf.png and b/remotion/public/figuren/noa/teile/rumpf.png differ diff --git a/remotion/public/figuren/noa/uebersicht.png b/remotion/public/figuren/noa/uebersicht.png index daf6f84..855d769 100644 Binary files a/remotion/public/figuren/noa/uebersicht.png and b/remotion/public/figuren/noa/uebersicht.png differ diff --git a/remotion/public/figuren/pino/einfluss/arm_links.png b/remotion/public/figuren/pino/einfluss/arm_links.png index e31108d..4207ced 100644 Binary files a/remotion/public/figuren/pino/einfluss/arm_links.png and b/remotion/public/figuren/pino/einfluss/arm_links.png differ diff --git a/remotion/public/figuren/pino/einfluss/arm_rechts.png b/remotion/public/figuren/pino/einfluss/arm_rechts.png index 21d5353..0e1f37c 100644 Binary files a/remotion/public/figuren/pino/einfluss/arm_rechts.png and b/remotion/public/figuren/pino/einfluss/arm_rechts.png differ diff --git a/remotion/public/figuren/pino/einfluss/bauch.png b/remotion/public/figuren/pino/einfluss/bauch.png index dc2ac0b..0633c92 100644 Binary files a/remotion/public/figuren/pino/einfluss/bauch.png and b/remotion/public/figuren/pino/einfluss/bauch.png differ diff --git a/remotion/public/figuren/pino/einfluss/fuss_links.png b/remotion/public/figuren/pino/einfluss/fuss_links.png index dfde83c..ff4d32b 100644 Binary files a/remotion/public/figuren/pino/einfluss/fuss_links.png and b/remotion/public/figuren/pino/einfluss/fuss_links.png differ diff --git a/remotion/public/figuren/pino/einfluss/fuss_rechts.png b/remotion/public/figuren/pino/einfluss/fuss_rechts.png index c3179d4..79bb47e 100644 Binary files a/remotion/public/figuren/pino/einfluss/fuss_rechts.png and b/remotion/public/figuren/pino/einfluss/fuss_rechts.png differ diff --git a/remotion/public/figuren/pino/einfluss/kopf.png b/remotion/public/figuren/pino/einfluss/kopf.png index f55c933..e9ac0ee 100644 Binary files a/remotion/public/figuren/pino/einfluss/kopf.png and b/remotion/public/figuren/pino/einfluss/kopf.png differ diff --git a/remotion/public/figuren/pino/einfluss/krallen_fuss_links.png b/remotion/public/figuren/pino/einfluss/krallen_fuss_links.png new file mode 100644 index 0000000..ecb09ff Binary files /dev/null and b/remotion/public/figuren/pino/einfluss/krallen_fuss_links.png differ diff --git a/remotion/public/figuren/pino/einfluss/krallen_fuss_rechts.png b/remotion/public/figuren/pino/einfluss/krallen_fuss_rechts.png new file mode 100644 index 0000000..1a01c06 Binary files /dev/null and b/remotion/public/figuren/pino/einfluss/krallen_fuss_rechts.png differ diff --git a/remotion/public/figuren/pino/einfluss/krallen_hand_links.png b/remotion/public/figuren/pino/einfluss/krallen_hand_links.png new file mode 100644 index 0000000..7a5ef7a Binary files /dev/null and b/remotion/public/figuren/pino/einfluss/krallen_hand_links.png differ diff --git a/remotion/public/figuren/pino/einfluss/krallen_hand_rechts.png b/remotion/public/figuren/pino/einfluss/krallen_hand_rechts.png new file mode 100644 index 0000000..bfe660b Binary files /dev/null and b/remotion/public/figuren/pino/einfluss/krallen_hand_rechts.png differ diff --git a/remotion/public/figuren/pino/teile/arm_links.png b/remotion/public/figuren/pino/teile/arm_links.png index bde9cb2..eadb3d4 100644 Binary files a/remotion/public/figuren/pino/teile/arm_links.png and b/remotion/public/figuren/pino/teile/arm_links.png differ diff --git a/remotion/public/figuren/pino/teile/arm_rechts.png b/remotion/public/figuren/pino/teile/arm_rechts.png index 9653092..c511d13 100644 Binary files a/remotion/public/figuren/pino/teile/arm_rechts.png and b/remotion/public/figuren/pino/teile/arm_rechts.png differ diff --git a/remotion/public/figuren/pino/teile/bauch.png b/remotion/public/figuren/pino/teile/bauch.png index ae2c1e6..76f2a08 100644 Binary files a/remotion/public/figuren/pino/teile/bauch.png and b/remotion/public/figuren/pino/teile/bauch.png differ diff --git a/remotion/public/figuren/pino/teile/fuss_links.png b/remotion/public/figuren/pino/teile/fuss_links.png index a909bab..43e61cd 100644 Binary files a/remotion/public/figuren/pino/teile/fuss_links.png and b/remotion/public/figuren/pino/teile/fuss_links.png differ diff --git a/remotion/public/figuren/pino/teile/fuss_rechts.png b/remotion/public/figuren/pino/teile/fuss_rechts.png index 0fc0f61..17a0b39 100644 Binary files a/remotion/public/figuren/pino/teile/fuss_rechts.png and b/remotion/public/figuren/pino/teile/fuss_rechts.png differ diff --git a/remotion/public/figuren/pino/teile/koerper.png b/remotion/public/figuren/pino/teile/koerper.png index 1560ab9..c1af608 100644 Binary files a/remotion/public/figuren/pino/teile/koerper.png and b/remotion/public/figuren/pino/teile/koerper.png differ diff --git a/remotion/public/figuren/pino/teile/krallen_fuss_links.png b/remotion/public/figuren/pino/teile/krallen_fuss_links.png new file mode 100644 index 0000000..8c7543f Binary files /dev/null and b/remotion/public/figuren/pino/teile/krallen_fuss_links.png differ diff --git a/remotion/public/figuren/pino/teile/krallen_fuss_rechts.png b/remotion/public/figuren/pino/teile/krallen_fuss_rechts.png new file mode 100644 index 0000000..5dd4f82 Binary files /dev/null and b/remotion/public/figuren/pino/teile/krallen_fuss_rechts.png differ diff --git a/remotion/public/figuren/pino/teile/krallen_hand_links.png b/remotion/public/figuren/pino/teile/krallen_hand_links.png new file mode 100644 index 0000000..51ee398 Binary files /dev/null and b/remotion/public/figuren/pino/teile/krallen_hand_links.png differ diff --git a/remotion/public/figuren/pino/teile/krallen_hand_rechts.png b/remotion/public/figuren/pino/teile/krallen_hand_rechts.png new file mode 100644 index 0000000..a57a334 Binary files /dev/null and b/remotion/public/figuren/pino/teile/krallen_hand_rechts.png differ diff --git a/remotion/public/figuren/pino/uebersicht.png b/remotion/public/figuren/pino/uebersicht.png index 760a8e6..316822d 100644 Binary files a/remotion/public/figuren/pino/uebersicht.png and b/remotion/public/figuren/pino/uebersicht.png differ diff --git a/remotion/src/Root.tsx b/remotion/src/Root.tsx index e053309..dcf1802 100644 --- a/remotion/src/Root.tsx +++ b/remotion/src/Root.tsx @@ -9,7 +9,7 @@ const BILD = {fps: 30, width: 1920, height: 1080} as const; export const Root: React.FC = () => ( <> - + diff --git a/remotion/src/rigs.ts b/remotion/src/rigs.ts index 0ea83ee..fb54dcc 100644 --- a/remotion/src/rigs.ts +++ b/remotion/src/rigs.ts @@ -17,7 +17,7 @@ export const RIGS: Record> = { "eltern": "rumpf", "um": [ 124, - 244 + 252 ] }, "kopf": { @@ -123,8 +123,8 @@ export const RIGS: Record> = { "kopf": { "eltern": "koerper", "um": [ - 400, - 465 + 405, + 450 ] }, "ohr_links": { @@ -176,6 +176,34 @@ export const RIGS: Record> = { 600 ] }, + "krallen_hand_links": { + "eltern": "arm_links", + "um": [ + 366, + 524 + ] + }, + "krallen_hand_rechts": { + "eltern": "arm_rechts", + "um": [ + 452, + 526 + ] + }, + "krallen_fuss_links": { + "eltern": "fuss_links", + "um": [ + 332, + 590 + ] + }, + "krallen_fuss_rechts": { + "eltern": "fuss_rechts", + "um": [ + 526, + 580 + ] + }, "bommel": { "eltern": "muetze", "um": [ @@ -234,6 +262,20 @@ export const RIGS: Record> = { 172 ] }, + "daumen_links": { + "eltern": "hand_links", + "um": [ + 68, + 300 + ] + }, + "daumen_rechts": { + "eltern": "hand_rechts", + "um": [ + 186, + 296 + ] + }, "bein_links": { "eltern": "rumpf", "um": [ diff --git a/remotion/src/szenen/VerformTest.tsx b/remotion/src/szenen/VerformTest.tsx index 96e8caf..6be1d14 100644 --- a/remotion/src/szenen/VerformTest.tsx +++ b/remotion/src/szenen/VerformTest.tsx @@ -1,12 +1,13 @@ import React from 'react'; import {AbsoluteFill, Img, staticFile, useCurrentFrame} from 'remotion'; import {feder, kreis, kurve} from '../bewegung'; -import {LULU, PINO} from '../figuren'; +import {LULU, NOA, PINO} from '../figuren'; import {RIGS} from '../rigs'; import {VerformFigur, type Knochen} from '../teile/VerformFigur'; -// Test für weiche Animation (6 s, ohne Ton): Lulu beugt den Hals zu Pino -// hinunter, Pino freut sich und hüpft. Alles über Gitter-Verformung mit den +// Test für weiche Animation (8 s, ohne Ton) mit möglichst vielen Bewegungsarten: +// Lulu beugt den Hals, schüttelt den Kopf, stampft; Pino hüpft, winkt, tippt mit dem +// Fuß; Noa winkt, wippt, hüpft, die Zöpfe schwingen nach. Alles über Gitter-Verformung mit den // Körperteil-Masken aus werkzeuge/rig.py und Federn; Hintergrund und Papier // sind vorberechnete Bilder. @@ -37,8 +38,9 @@ const ohrZucken = (f: number, bei: number[]) => (bei.some((b) => f >= b && f < b const luluKnochen = (f: number): Knochen[] => { const hals = feder(halsKurve, f, {steifheit: 0.11, daempfung: 0.2}); const halsTraege = feder(halsKurve, f, {steifheit: 0.05, daempfung: 0.16}); - const kopf = feder((g) => -halsKurve(g) * 0.35 + neugierKurve(g), f, {steifheit: 0.07, daempfung: 0.18}); - const ohrL = feder((g) => -26 * ohrZucken(g, [20, 98]), f, {steifheit: 0.25, daempfung: 0.12}) + (hals - halsTraege) * 0.6; + const schuetteln = (g: number) => (g > 160 && g < 200 ? 8 * Math.sin((g - 160) * 0.45) * Math.sin(((g - 160) / 40) * Math.PI) : 0); + const kopf = feder((g) => -halsKurve(g) * 0.35 + neugierKurve(g) + schuetteln(g), f, {steifheit: 0.12, daempfung: 0.2}); + const ohrL = feder((g) => -26 * ohrZucken(g, [20, 98, 182]), f, {steifheit: 0.25, daempfung: 0.12}) + (hals - halsTraege) * 0.6; const ohrR = feder((g) => 22 * ohrZucken(g, [60, 104]), f, {steifheit: 0.25, daempfung: 0.12}) - (hals - halsTraege) * 0.5; const schwanz = -6 + 10 * Math.sin(f * 0.085) + feder((g) => halsKurve(g) * 0.5, f, {steifheit: 0.04, daempfung: 0.1}) - halsKurve(f) * 0.5; const schal = (halsTraege - hals) * 0.9 + 2.5 * Math.sin(f * 0.07); @@ -48,7 +50,8 @@ const luluKnochen = (f: number): Knochen[] => { gelenk('lulu', 'ohr_rechts', ohrR), gelenk('lulu', 'kopf', kopf), gelenk('lulu', 'hals', hals), - gelenk('lulu', 'schwanz', schwanz), + gelenk('lulu', 'schwanz', schwanz + (f > 200 ? 8 * Math.sin(f * 0.3) : 0)), + gelenk('lulu', 'bein_vorne_rechts', feder((g) => kurve(g, [[198, 0], [206, 14], [214, 0], [218, 6], [224, 0]]), f, {steifheit: 0.3, daempfung: 0.3})), gelenk('lulu', 'schal_ende', schal), {name: 'atmen', art: 'stauchen', um: [175, 330], sx: 1 - atmen * 0.006, sy: 1 + atmen * 0.012, gewicht: kreis(180, 300, 50, 110)}, ]; @@ -79,21 +82,54 @@ const pinoWerte = (f: number) => { const ohr = feder((g) => (g > SPRUNG.auf && g < SPRUNG.auf + 3 ? -14 : 0), f, {steifheit: 0.25, daempfung: 0.12}); const atmen = Math.sin(f * 0.11); const knochen: Knochen[] = [ + gelenk('pino', 'krallen_fuss_rechts', f > 190 && f < 226 ? -8 * Math.sin((f - 190) * 0.7) : 0), + gelenk('pino', 'krallen_hand_links', freude(f) * 10), + gelenk('pino', 'krallen_hand_rechts', -freude(f) * 10), gelenk('pino', 'bommel', bommel + 3 * Math.sin(f * 0.06)), gelenk('pino', 'ohr_links', ohr), gelenk('pino', 'ohr_rechts', -ohr * 0.7), gelenk('pino', 'arm_links', freude(f) * 12), gelenk('pino', 'arm_rechts', -freude(f) * 10), - gelenk('pino', 'kopf', feder(pinoKopfKurve, f, {steifheit: 0.08, daempfung: 0.2})), + gelenk('pino', 'kopf', feder((g) => pinoKopfKurve(g) + (g > 150 && g < 176 ? 4 * Math.sin((g - 150) * 0.5) : 0), f, {steifheit: 0.1, daempfung: 0.2})), + gelenk('pino', 'fuss_rechts', f > 190 && f < 226 ? -10 * Math.abs(Math.sin((f - 190) * 0.35)) : 0), {name: 'atmen', art: 'stauchen', um: [420, 600], sx: 1 + atmen * 0.01, sy: 1 + atmen * 0.014, gewicht: kreis(420, 540, 70, 170)}, ]; return {stauch, hoch, knochen}; }; +// ---------- Noa ---------- +const noaKopfKurve = (f: number) => kurve(f, [[0, 0], [20, 0], [40, 8], [120, 8], [135, 0], [215, 0], [225, -5], [232, 4], [240, 0]]); +const noaHuepfer = (f: number) => (f > 140 && f < 176 ? Math.abs(Math.sin(((f - 140) / 36) * Math.PI * 2)) : 0); +const noaNeigen = (f: number) => kurve(f, [[0, 0], [180, 0], [192, 3], [204, -3], [216, 0]]); + +const noaWerte = (f: number) => { + const kopf = feder(noaKopfKurve, f, {steifheit: 0.1, daempfung: 0.2}); + const arm = feder((g) => kurve(g, [[0, 0], [58, 0], [74, -75], [118, -75], [134, 0]]), f, {steifheit: 0.15, daempfung: 0.25}); + const winken = f > 76 && f < 118 ? 18 * Math.sin((f - 76) * 0.45) : 0; + const hoch = noaHuepfer(f) * 22; + // Zöpfe hängen nach: reagieren auf Kopf, Neigen und Hüpfen + const schwung = (g: number) => -noaKopfKurve(g) * 1.2 - noaNeigen(g) * 3 + noaHuepfer(g) * 10; + const zopf = feder(schwung, f, {steifheit: 0.06, daempfung: 0.08}) + 2 * Math.sin(f * 0.07); + const atmen = Math.sin(f * 0.1); + const knochen: Knochen[] = [ + gelenk('noa', 'zopf_links', -zopf), + gelenk('noa', 'zopf_rechts', zopf), + gelenk('noa', 'daumen_rechts', winken * 0.8), + gelenk('noa', 'hand_rechts', winken), + gelenk('noa', 'arm_rechts', arm + winken * 0.3), + gelenk('noa', 'arm_links', 3 * Math.sin(f * 0.06) + noaHuepfer(f) * 8), + gelenk('noa', 'kopf', kopf), + {name: 'atmen', art: 'stauchen', um: [115, 300], sx: 1 + atmen * 0.006, sy: 1 + atmen * 0.01, gewicht: kreis(115, 240, 40, 120)}, + ]; + const stauch = feder((g) => (noaHuepfer(g) > 0 && noaHuepfer(g) < 0.15 ? 0.95 : 1), f, {steifheit: 0.3, daempfung: 0.3}); + return {knochen, hoch, stauch, neigen: feder(noaNeigen, f, {steifheit: 0.1, daempfung: 0.2})}; +}; + export const VerformTest: React.FC = () => { const f = useCurrentFrame(); const zoom = 1.04 - f * 0.0002; const pino = pinoWerte(f); + const noa = noaWerte(f); const luluNeigen = kurve(f, [[30, 0], [74, -2.5], [118, -2.5], [150, 0]]) + Math.sin(f * 0.05) * 0.5; const abend = 'brightness(0.86) saturate(0.95)'; @@ -101,6 +137,17 @@ export const VerformTest: React.FC = () => { +