From 59355909f2de9236af8168a26c70bcf6caa3b285 Mon Sep 17 00:00:00 2001 From: Elvis Claros Castro Date: Sat, 26 Sep 2026 20:21:47 -0300 Subject: Import video pipeline as it was --- scenes/v14_gabriel.py | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 scenes/v14_gabriel.py (limited to 'scenes/v14_gabriel.py') diff --git a/scenes/v14_gabriel.py b/scenes/v14_gabriel.py new file mode 100644 index 0000000..24a9621 --- /dev/null +++ b/scenes/v14_gabriel.py @@ -0,0 +1,172 @@ +# -*- coding: utf-8 -*- +import sys, os, math +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from manim import * +from tiktok import * + +XA, XB = 1.0, 7.4 # dominio de 1/x +KX, KY = 1.00, 2.00 # escala a pantalla +X0S, CY = -3.75, 1.70 + + +def sx(x): + return X0S + (x - XA) * KX + + +def sy(x): + return KY / x + + +def rama(sig, n=160, **kw): + xs = np.linspace(XA, XB, n) + pts = [[sx(x), CY + sig * sy(x), 0] for x in xs] + m = VMobject(**kw) + m.set_points_as_corners(pts) + return m + + +def cuerpo(fill="#1E4E8C", op=0.55): + xs = np.linspace(XA, XB, 160) + up = [[sx(x), CY + sy(x), 0] for x in xs] + dn = [[sx(x), CY - sy(x), 0] for x in reversed(xs)] + m = VMobject(stroke_width=0, fill_color=fill, fill_opacity=op) + m.set_points_as_corners(up + dn + [up[0]]) + return m + + +def aros(n=9, col=CELESTE, op=0.55): + xs = np.linspace(XA + 0.35, XB, n) + return VGroup(*[ + Ellipse(width=0.34, height=2 * sy(x), stroke_width=3, stroke_opacity=op, + color=col).move_to([sx(x), CY, 0]) for x in xs]) + + +class Gabriel(TikTok): + NAME = "gabriel" + + def construct(self): + self.prepare() + chip = self.chip("Paradoja del infinito", CELESTE) + + with self.beat(0) as b: + b.play(FadeIn(chip, shift=DOWN * 0.3), run_time=0.45) + t = VGroup( + self.fit(Text("el cuerno de", font=FONT, font_size=50, + weight=BOLD, color=WHITE), 8.0), + self.fit(Text("GABRIEL", font=FONT, font_size=86, + weight=BOLD, color=AMBAR), 8.0), + ).arrange(DOWN, buff=0.25).move_to(UP * 2.6) + b.play(FadeIn(t[0], shift=UP * 0.15), run_time=0.5) + b.play(FadeIn(t[1], scale=0.7), run_time=0.8) + + eje = Line([sx(XA) - 0.5, CY, 0], [sx(XB) + 0.35, CY, 0], + stroke_width=3, color="#33405C") + + with self.beat(1) as b: + b.play(t.animate.scale(0.5).move_to(UP * 5.3), run_time=0.5) + f = MathTex(r"y = \frac{1}{x}", color=AMBAR).scale(1.35).move_to(DOWN * 2.4) + up = rama(+1, stroke_color=AMBAR, stroke_width=6) + b.play(FadeIn(eje), run_time=0.3) + b.play(Create(up), run_time=0.9) + b.play(Write(f), run_time=0.7) + + body = cuerpo() + low = rama(-1, stroke_color=AMBAR, stroke_width=6) + ar = aros() + boca = Ellipse(width=0.42, height=2 * sy(XA), stroke_width=6, + color=AMBAR).move_to([sx(XA), CY, 0]) + + with self.beat(2) as b: + b.play(Create(low), run_time=0.6) + b.play(FadeIn(body), FadeIn(boca), run_time=0.5) + b.play(LaggedStart(*[Create(a) for a in ar], lag_ratio=0.15), run_time=0.9) + inf = MathTex(r"\cdots \infty", color=GRIS).scale(1.0) + inf.next_to([sx(XB), CY, 0], RIGHT, buff=0.2) + b.play(FadeIn(inf), run_time=0.4) + + horn = VGroup(eje, body, up, low, ar, boca, inf) + + with self.beat(3) as b: + b.play(FadeOut(f), run_time=0.25) + q = self.fit(Text("¿cuánta pintura entra?", font=FONT, font_size=52, + weight=BOLD, color=WHITE), 8.2).move_to(DOWN * 2.3) + b.play(FadeIn(q, shift=UP * 0.15), run_time=0.7) + + with self.beat(4) as b: + b.play(FadeOut(q), run_time=0.25) + lleno = cuerpo(fill=VERDE, op=0.85) + b.play(FadeIn(lleno), run_time=0.7) + v = MathTex(r"V = \pi\int_1^{\infty}\frac{dx}{x^2} = \pi", + color=VERDE).scale(1.15).move_to(DOWN * 2.05) + b.play(Write(v), run_time=1.1) + + with self.beat(5) as b: + lt = self.fit(Text("≈ 3,14 litros y te sobra", font=FONT, font_size=48, + weight=BOLD, color=VERDE), 8.2).move_to(DOWN * 2.90) + b.play(FadeIn(lt, shift=UP * 0.15), run_time=0.7) + + with self.beat(6) as b: + b.play(FadeOut(VGroup(v, lt, lleno)), run_time=0.4) + q2 = self.fit(Text("¿y pintarlo por fuera?", font=FONT, font_size=52, + weight=BOLD, color=WHITE), 8.2).move_to(DOWN * 2.3) + b.play(up.animate.set_stroke(ROSA, 8), low.animate.set_stroke(ROSA, 8), + run_time=0.6) + b.play(FadeIn(q2, shift=UP * 0.15), run_time=0.6) + + with self.beat(7) as b: + b.play(FadeOut(q2), run_time=0.25) + a = MathTex(r"A > 2\pi\int_1^{\infty}\frac{dx}{x} = \infty", + color=ROSA).scale(1.15).move_to(DOWN * 2.15) + b.play(Write(a), run_time=1.1) + b.play(Flash(a, color=ROSA, line_length=0.5, num_lines=18, + flash_radius=2.4), run_time=0.7) + + with self.beat(8) as b: + b.play(FadeOut(VGroup(a, horn)), run_time=0.45) + def fila(txt, val, col): + t1 = Text(txt, font=FONT, font_size=44, weight=BOLD, color=WHITE) + t2 = Text(val, font=FONT, font_size=56, weight=BOLD, color=col) + return VGroup(t1, t2).arrange(DOWN, buff=0.18) + cmp = VGroup(fila("volumen", "π (finito)", VERDE), + fila("superficie", "∞ (infinita)", ROSA) + ).arrange(DOWN, buff=0.75).move_to(UP * 2.4) + self.fit(cmp, 8.2) + b.play(FadeIn(cmp[0], shift=UP * 0.15), run_time=0.55) + b.play(FadeIn(cmp[1], shift=UP * 0.15), run_time=0.55) + golpe = VGroup( + self.fit(Text("lo llenás de pintura", font=FONT, font_size=48, + weight=BOLD, color=WHITE), 8.2), + self.fit(Text("pero no lo podés pintar", font=FONT, font_size=48, + weight=BOLD, color=AMBAR), 8.2), + ).arrange(DOWN, buff=0.3).move_to(DOWN * 0.6) + b.play(FadeIn(golpe, scale=0.85), run_time=0.8) + + with self.beat(9) as b: + b.play(FadeOut(VGroup(cmp, golpe)), run_time=0.4) + tr = VGroup( + self.fit(Text("la trampa:", font=FONT, font_size=48, + weight=BOLD, color=ROSA), 8.2), + self.fit(Text("la pintura real tiene", font=FONT, font_size=46, + weight=BOLD, color=WHITE), 8.2), + self.fit(Text("espesor. El cuerno", font=FONT, font_size=46, + weight=BOLD, color=WHITE), 8.2), + self.fit(Text("se hace más fino que eso.", font=FONT, font_size=46, + weight=BOLD, color=WHITE), 8.2), + ).arrange(DOWN, buff=0.3).move_to(UP * 1.8) + for k in range(4): + b.play(FadeIn(tr[k], shift=UP * 0.12), run_time=0.45) + + with self.beat(10) as b: + b.play(FadeOut(tr), run_time=0.35) + cta = VGroup( + self.fit(Text("con el infinito", font=FONT, font_size=52, + weight=BOLD, color=WHITE), 8.0), + self.fit(Text("la intuición se rompe", font=FONT, font_size=56, + weight=BOLD, color=AMBAR), 8.0), + ).arrange(DOWN, buff=0.35).move_to(UP * 1.4) + b.play(FadeIn(cta[0], shift=UP * 0.15), run_time=0.55) + b.play(Write(cta[1]), run_time=0.9) + b.play(Circumscribe(cta[1], color=AMBAR, buff=0.25, stroke_width=6), + run_time=0.8) + + self.finish() -- cgit v1.2.3