Dijital Nostalji: Python ile Lav Lambası (Metaballs) Yapımı

🔮 Dijital Nostalji: Python ile Lav Lambası (Metaballs) Yapımı

90’ların ve 2000’lerin vazgeçilmez dekoru Lav Lambaları, içindeki sıvının hipnotik dansıyla bizi büyülerdi. Peki, bu fiziksel hareketi kodlarla taklit edebilir miyiz?

Cevap: Evet! Bugün “Metaballs” (Meta Toplar) algoritmasını kullanarak kendi dijital plazma lambamızı yapıyoruz.

Sırrı: Enerji Alanları

Ekranda gördüğünüz şekiller katı birer top değil, birer Enerji Alanıdır. İki mum yaklaştığında ışıklarının nasıl birleştiğini düşünün; Metaballs da aynen böyle çalışır.

  • İki top uzakken ayrı ayrı görünürler.
  • Yaklaştıkça enerji alanları toplanır ve aralarında bir “köprü” oluşur.
  • Yeterince yaklaştıklarında ise tek bir büyük damla haline gelirler.

💻 Kodun Kalbi

Bu “yapışkan sıvı” etkisini yaratan formül şudur:

# Yarıçapın karesi / Uzaklığın karesi
energy += (radius**2) / (distance**2 + 1)
    
import cv2
import numpy as np

# --- AYARLAR (1080p Dikey Video) ---
# Çıktı boyutu
out_w, out_h = 1080, 1920
# Hesaplama boyutu (Daha düşük = Daha hızlı ve yumuşak görüntü)
sim_w, sim_h = 270, 480 

fps = 60
duration_sec = 15
total_frames = fps * duration_sec
filename = "digital_lava_lamp.mp4"

# Video Yazıcı
try:
    fourcc = cv2.VideoWriter_fourcc(*'avc1')
except:
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(filename, fourcc, fps, (out_w, out_h))

# --- TOPLARIN AYARLARI ---
num_balls = 12
balls = []

# Rastgele başlat
for _ in range(num_balls):
    balls.append({
        'x': np.random.randint(0, sim_w),
        'y': np.random.randint(0, sim_h),
        'vx': np.random.uniform(-1.5, 1.5),  # Hız X
        'vy': np.random.uniform(-1.5, 1.5),  # Hız Y
        'r': np.random.randint(30, 60)       # Yarıçap (Etki alanı)
    })

# Koordinat Izgarası (Vektörel hızlandırma için)
x = np.arange(sim_w)
y = np.arange(sim_h)
xx, yy = np.meshgrid(x, y)

print(f"🔮 Lav Lambası Simülasyonu Başlıyor: {filename}")
print("Enerji alanları hesaplanıyor...")

for i in range(total_frames):
    if i % 50 == 0:
        print(f"İşleniyor: %{int(i/total_frames*100)}")

    # Enerji haritasını sıfırla
    energy_map = np.zeros((sim_h, sim_w), dtype=np.float32)

    # Her top için enerji alanını hesapla ve topla
    for ball in balls:
        # 1. HAREKET
        ball['x'] += ball['vx']
        ball['y'] += ball['vy']

        # Duvarlardan Sekme (Bounce)
        if ball['x'] <= 0 or ball['x'] >= sim_w:
            ball['vx'] *= -1
        if ball['y'] <= 0 or ball['y'] >= sim_h:
            ball['vy'] *= -1

        # 2. ENERJİ HESAPLAMA (Metaball Formülü)
        # Formül: Yarıçap / Mesafe
        # (Sıfıra bölmeyi önlemek için +1 ekliyoruz)
        dist_sq = (xx - ball['x'])**2 + (yy - ball['y'])**2
        energy_map += (ball['r']**2) / (dist_sq + 1)

    # 3. GÖRSELLEŞTİRME
    # Enerji haritasını renklendirilebilir formata (0-255) çevir
    # Eşikleme (Threshold) yaparak keskin kenarlar yerine,
    # doğrudan yoğunluğu kullanıp "Glow" (Parıltı) efekti veriyoruz.
    
    # Değerleri biraz kısalım ki çok patlamasın
    img_float = np.clip(energy_map * 200, 0, 255)
    img_uint8 = img_float.astype(np.uint8)

    # 1080p'ye Yükselt (Yumuşak geçiş için Cubic Interpolation)
    frame_hd = cv2.resize(img_uint8, (out_w, out_h), interpolation=cv2.INTER_CUBIC)

    # Renklendirme:
    # JET: Klasik Isı Haritası (Mavi -> Kırmızı)
    # TURBO: Daha modern ve canlı renkler
    colored_frame = cv2.applyColorMap(frame_hd, cv2.COLORMAP_TURBO)

    out.write(colored_frame)

out.release()
print("🔮 Plazma Efekti Hazır! Dosyayı kontrol et.")

🎥 Sonuç: Retro Plazma

Python’un hesaplama gücü ve renk haritaları (Colormap) birleşince ortaya bu hipnotik görüntü çıkıyor:

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir