clawdbot-workspace/oskv_sacred_geometry.py
2026-02-05 23:01:36 -05:00

266 lines
8.5 KiB
Python

from manim import *
import numpy as np
class OSKVSacredGeometry(Scene):
def construct(self):
self.camera.background_color = "#050510"
# === PART 1: Seed of Life Formation ===
# Start with a single circle
center_circle = Circle(radius=1, color=BLUE_C, stroke_width=2)
center_circle.set_stroke(opacity=0.8)
self.play(Create(center_circle), run_time=1)
# Add 6 circles around it (Seed of Life pattern)
seed_circles = VGroup()
for i in range(6):
angle = i * PI / 3
circle = Circle(radius=1, color=BLUE_C, stroke_width=2)
circle.set_stroke(opacity=0.8)
circle.move_to([np.cos(angle), np.sin(angle), 0])
seed_circles.add(circle)
self.play(
LaggedStart(*[Create(c) for c in seed_circles], lag_ratio=0.15),
run_time=1.5
)
seed_of_life = VGroup(center_circle, seed_circles)
# === PART 2: Flower of Life Expansion ===
# Add outer ring of circles
outer_circles = VGroup()
outer_positions = [
(2, 0), (-2, 0),
(1, np.sqrt(3)), (-1, np.sqrt(3)),
(1, -np.sqrt(3)), (-1, -np.sqrt(3)),
(1.5, np.sqrt(3)/2), (-1.5, np.sqrt(3)/2),
(1.5, -np.sqrt(3)/2), (-1.5, -np.sqrt(3)/2),
(0, np.sqrt(3)), (0, -np.sqrt(3)),
]
for pos in outer_positions:
circle = Circle(radius=1, color=PURPLE_B, stroke_width=1.5)
circle.set_stroke(opacity=0.6)
circle.move_to([pos[0], pos[1], 0])
outer_circles.add(circle)
self.play(
LaggedStart(*[Create(c) for c in outer_circles], lag_ratio=0.08),
run_time=1.5
)
flower_of_life = VGroup(seed_of_life, outer_circles)
# Pulse the whole flower
self.play(
flower_of_life.animate.scale(1.1).set_stroke(opacity=1),
rate_func=there_and_back,
run_time=0.8
)
# === PART 3: Metatron's Cube Emerge ===
# Fade flower slightly
self.play(flower_of_life.animate.set_stroke(opacity=0.3), run_time=0.5)
# Create the 13 circles of Metatron's Cube
metatron_circles = VGroup()
# Center
mc_center = Circle(radius=0.15, color=TEAL, fill_opacity=0.8)
metatron_circles.add(mc_center)
# Inner hexagon (6 points)
for i in range(6):
angle = i * PI / 3
circle = Circle(radius=0.15, color=TEAL, fill_opacity=0.8)
circle.move_to([1.2 * np.cos(angle), 1.2 * np.sin(angle), 0])
metatron_circles.add(circle)
# Outer hexagon (6 points)
for i in range(6):
angle = i * PI / 3 + PI / 6
circle = Circle(radius=0.15, color=TEAL, fill_opacity=0.8)
circle.move_to([2.1 * np.cos(angle), 2.1 * np.sin(angle), 0])
metatron_circles.add(circle)
self.play(
LaggedStart(*[GrowFromCenter(c) for c in metatron_circles], lag_ratio=0.05),
run_time=1
)
# Connect all points (Metatron's Cube lines)
metatron_lines = VGroup()
points = [c.get_center() for c in metatron_circles]
for i, p1 in enumerate(points):
for j, p2 in enumerate(points):
if i < j:
line = Line(p1, p2, stroke_width=1, color=WHITE)
line.set_stroke(opacity=0.4)
metatron_lines.add(line)
self.play(
LaggedStart(*[Create(l) for l in metatron_lines], lag_ratio=0.01),
run_time=1.5
)
metatron = VGroup(metatron_circles, metatron_lines)
# Rotate Metatron's Cube
self.play(
Rotate(metatron, PI / 6, about_point=ORIGIN),
run_time=1.5
)
# === PART 4: Golden Spiral ===
# Fade previous elements
self.play(
FadeOut(flower_of_life),
metatron.animate.set_opacity(0.2),
run_time=0.8
)
# Create golden spiral
golden_ratio = (1 + np.sqrt(5)) / 2
# Fibonacci squares
fib_squares = VGroup()
sizes = [0.1, 0.1, 0.2, 0.3, 0.5, 0.8, 1.3]
colors = [BLUE, PURPLE, TEAL, BLUE_B, PURPLE_B, TEAL_B, BLUE_C]
positions = [
(0, 0), (0.1, 0), (0, 0.1), (-0.2, 0), (0, -0.3), (0.5, 0), (0, 0.8)
]
# Simplified: just draw expanding squares
current_pos = ORIGIN
for i, (size, color) in enumerate(zip(sizes, colors)):
sq = Square(side_length=size * 2, color=color, stroke_width=2)
sq.move_to(current_pos)
fib_squares.add(sq)
# Actually let's do a proper golden spiral
spiral_points = []
t_values = np.linspace(0, 4 * PI, 200)
a = 0.1
b = 0.15
for t in t_values:
r = a * np.exp(b * t)
x = r * np.cos(t)
y = r * np.sin(t)
spiral_points.append([x, y, 0])
golden_spiral = VMobject()
golden_spiral.set_points_smoothly(spiral_points)
golden_spiral.set_stroke(color=[GOLD, YELLOW, ORANGE], width=3)
self.play(Create(golden_spiral), run_time=2)
# === PART 5: Sri Yantra Inspired Pattern ===
self.play(
FadeOut(golden_spiral),
FadeOut(metatron),
run_time=0.5
)
# Concentric triangles (simplified Sri Yantra)
triangles = VGroup()
for i in range(5):
# Upward triangle
tri_up = RegularPolygon(n=3, radius=2.5 - i * 0.4, color=PURPLE)
tri_up.set_stroke(width=2, opacity=0.8 - i * 0.1)
triangles.add(tri_up)
# Downward triangle
tri_down = RegularPolygon(n=3, radius=2.3 - i * 0.4, color=BLUE)
tri_down.rotate(PI)
tri_down.set_stroke(width=2, opacity=0.8 - i * 0.1)
triangles.add(tri_down)
# Outer circle
outer_ring = Circle(radius=2.8, color=WHITE, stroke_width=2)
self.play(
Create(outer_ring),
run_time=0.5
)
self.play(
LaggedStart(*[Create(t) for t in triangles], lag_ratio=0.1),
run_time=2
)
# Central bindu (dot)
bindu = Dot(point=ORIGIN, radius=0.1, color=GOLD)
bindu.set_glow_factor(1.5)
self.play(GrowFromCenter(bindu), run_time=0.5)
yantra = VGroup(outer_ring, triangles, bindu)
# Rotate and pulse
self.play(
Rotate(yantra, PI / 12),
yantra.animate.scale(1.05),
rate_func=there_and_back,
run_time=1
)
# === PART 6: OSKV Reveal ===
self.play(
yantra.animate.scale(0.4).shift(UP * 2),
run_time=1
)
# OSKV text with sacred geometry styling
oskv = Text("OSKV", font_size=140, weight=BOLD)
oskv.set_color_by_gradient(GOLD, PURPLE, TEAL)
oskv.shift(DOWN * 0.5)
# Decorative circles around text
deco_circles = VGroup()
for i in range(12):
angle = i * PI / 6
small_c = Circle(radius=0.08, color=GOLD, fill_opacity=0.6)
small_c.move_to(oskv.get_center() + 2.5 * np.array([np.cos(angle), np.sin(angle), 0]))
deco_circles.add(small_c)
self.play(
Write(oskv),
run_time=1.5
)
self.play(
LaggedStart(*[GrowFromCenter(c) for c in deco_circles], lag_ratio=0.05),
run_time=0.8
)
# Subtitle
subtitle = Text("Sacred Geometry", font_size=32, slant=ITALIC)
subtitle.set_color(WHITE)
subtitle.set_opacity(0.7)
subtitle.next_to(oskv, DOWN, buff=0.4)
self.play(FadeIn(subtitle, shift=UP * 0.2), run_time=0.6)
# Final glow pulse
everything = VGroup(yantra, oskv, deco_circles, subtitle)
self.play(
everything.animate.scale(1.05),
rate_func=there_and_back,
run_time=1
)
self.wait(1.5)
# Fade out with particle dispersion
self.play(
FadeOut(everything),
run_time=1
)