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