🔮 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: