Çim, taş, ahşap dokularının kenarları neden görünmez?
Merhaba!
Bir oyun dünyasındaki zemin dokusu, aynı küçük görüntünün binlerce kez tekrarlanmasıyla oluşuyor ama dikiş çizgisi görünmüyor. Bu konuda tileable doku oluşturma teknikini derinlemesine ele aldım.
Bir dokunun sol kenarı ile sağ kenarı, üst kenarı ile alt kenarı yan yana konulduğunda kusursuz şekilde birleşmeli.
Markdown (GitHub flavored):
1. Dokunuzu açın (örn: 512x512 piksel çim dokusu)
2. Filtre > Offset uygulayın (yatay/dikey genişlik/2)
"Wrap around" aktif olmalı
3. Eski kenarlar artık merkezde görünür hale gelir
4. Ortada bir dikiş çizgisi göreceksiniz
5. Clone Stamp ile bu dikiş çizgisini kapatın
6. Tekrar offset uygulayıp merkeze geri getirin
Python:
from PIL import Image
import numpy as np
def tileable_kontrolu(goruntu_yolu: str, esik_deger: float = 15.0):
img = Image.open(goruntu_yolu).convert('RGB')
dizi = np.array(img, dtype=np.float64)
sol_kenar = dizi[:, 0, :]
sag_kenar = dizi[:, -1, :]
yatay_fark = np.mean(np.abs(sol_kenar - sag_kenar))
ust_kenar = dizi[0, :, :]
alt_kenar = dizi[-1, :, :]
dikey_fark = np.mean(np.abs(ust_kenar - alt_kenar))
print(f"Yatay kenar farki: {yatay_fark:.2f}")
print(f"Dikey kenar farki: {dikey_fark:.2f}")
if yatay_fark < esik_deger and dikey_fark < esik_deger:
print("Doku iyi tileable gorunuyor!")
else:
print("Kenarlar arasinda gorunur fark var")
return yatay_fark, dikey_fark
def basit_kaydirma_uygula(goruntu_yolu: str, cikti_yolu: str):
img = Image.open(goruntu_yolu)
genislik, yukseklik = img.size
dizi = np.array(img)
kaydirilmis = np.roll(dizi, shift=(yukseklik // 2, genislik // 2), axis=(0, 1))
sonuc_img = Image.fromarray(kaydirilmis)
sonuc_img.save(cikti_yolu)
print(f"Kaydirilmis goruntu kaydedildi: {cikti_yolu}")
def onizleme_mozaigi_olustur(goruntu_yolu: str, cikti_yolu: str, tekrar: int = 3):
img = Image.open(goruntu_yolu)
genislik, yukseklik = img.size
mozaik = Image.new('RGB', (genislik * tekrar, yukseklik * tekrar))
for x in range(tekrar):
for y in range(tekrar):
mozaik.paste(img, (x * genislik, y * yukseklik))
mozaik.save(cikti_yolu)
print(f"{tekrar}x{tekrar} mozaik onizlemesi kaydedildi: {cikti_yolu}")
Stable Diffusion gibi araçlar "seamless tiling" modu ile doğrudan tileable dokular üretebiliyor — manuel süreci büyük ölçüde otomatikleştiriyor.
Hangi araçları kullandınız?