IsItABlueGem LogoIsItABlueGem
Giriş yap

Teknik Detaylar

Bu siteyi çalıştıran sistemin nasıl çalıştığına dair eğitici ve tarihsel dokümantasyon

Counter-Strike 2 ve Counter Strike Global Offensive, rastgele dönüşümler sistemi aracılığıyla yüzlerce benzersiz görünümlü skin varyantı oluşturmak için tek bir temel doku (Case Hardened gibi) kullanır. Bu, deterministik, tohum tabanlı bir mekanizma ile gerçekleştirilir — oyun dışında Blue Gem desenlerini anlamak ve yeniden üretmek için bir anahtar.

Neden Paint "Seed" deniyor?

Doku çeşitliliğini tutarlı ancak rastgele bir şekilde üretmek için Valve, Source Engine'e yerleşik olan sözde rastgele tek biçimli bir üreteç kullanır. Bilgisayarlar deterministik makineler olduğundan, rastgelelik üretmek için bir başlangıç değerine — tohuma — ihtiyaç duyarlar. CS2'de her skine 1 ile 999 arasında bir paint seed atanır. Bu tohum, rastgele sayı üretecini başlatır ve dokuya dönüşümler uygulamak için kullanılan belirli bir değerler kümesi üretir.

Bu algoritma deterministik ve tüm platformlarda tek biçimli olduğundan, belirli bir paint seed her zaman aynı dönüşümü verecektir — skinin her sistemde aynı görünmesini garanti eder.

TL;DR: Paint seed, Valve'ın sözde rastgele üretecini başlatarak temel dokunun desen, aşınma ve kir katmanları için nasıl konumlandırılacağını, döndürüleceğini ve ölçekleneceğini tanımlar.

Doku dönüşümleri nasıl hesaplanır?

CS2'nin skin görünümlerini nasıl rastgele hale getirdiğini anlamak için UV haritalamayı anlamak yardımcı olur: her silah modelinin, 2D dokunun 3D mesh etrafına nasıl sarılacağını tanımlayan bir UV düzeni vardır. Valve dokuyu bu UV haritasına uygular ve ardından çeviri, döndürme ve ölçeğini rastgele hale getirmek için paint seed kullanır.

Bu sadece ana deseni (Case Hardened renk lekeleri gibi) değil, aynı zamanda aşınma ve kir kaplamalarını da etkiler — çizikler, yaşlanma ve kir ekleyen dokular.

Bir skinin stili rastgele yer değiştirme kullanmıyorsa (örneğin, muhtemelen Asiimov gibi düz renkli skinler), bu sistemden etkilenmeyecektir.

UV Eşleme Kavramı

3B yüzeylerin 2B doku koordinatlarına nasıl eşlendiğini görmek için küp yüzlerinin veya UV haritasının üzerine gelin

3D Model

1
2
3
4
5
6

UV Map (Unfolded)

5
4
1
3
6
2

Adım Adım: Paint Seed → Dönüşüm

1. Temel ölçeği belirle

Her silah ve boya stili, genellikle Valve'ın items_game.txt dosyasında tanımlanan belirli bir ölçeğe sahiptir. Temel ölçek, boya stiline bağlı olarak silah uzunluğundan ve UV ölçeğinden hesaplanır:

if (paint_style == 3 || paint_style == 6) {
    scale = weapon_length * 0.027777778;
} else {
    scale = uv_scale;
}

Örneğin, Karambit'in:

  • WeaponLength = 9.813000
  • UVScale = 0.438000
  • → 0.438 temel ölçekle sonuçlanır

2. Rastgele değerler oluştur

Temel ölçek bilindiğinde, paint seed her doku katmanının nasıl uygulanacağını tanımlayan 11 sözde rastgele float değeri oluşturmak için kullanılır:

Doku KatmanıParametreler
Desenölçek, çeviriX, çeviriY, döndürme
Aşınmaölçek × çarpan, çeviriX, çeviriY, döndürme
Kirölçek × çarpan, çeviriX, çeviriY, döndürme

Bu float değerleri sabit sıra ve aralıklarda oluşturulur:

Desen
  • translateX → 0.0 – 1.0
  • translateY → 0.0 – 1.0
  • rotate → 0.0 – 360.0
Aşınma
  • scaleMult → 1.6 – 1.8
  • translateX → 0.0 – 1.0
  • translateY → 0.0 – 1.0
  • rotate → 0.0 – 360.0
Kir
  • scaleMult → 1.6 – 1.8
  • translateX → 0.0 – 1.0
  • translateY → 0.0 – 1.0
  • rotate → 0.0 – 360.0

Bu değerler her katmana aşağıdaki mantıkla bağımsız olarak uygulanır:

Dönüşüm Sırası: Ölçek → Çeviri → Döndürme
(Desen, aşınma ve kir için tekrarlanır)

Örnek: Karambit | Case Hardened — Paint Seed 633

Yukarıdaki mantığı kullanarak, bir Karambit'te paint seed 633 şunları verir:

  • Base Scale: 0.438
  • Translate X: 0.471 → shifts the pattern ~47% left
  • Translate Y: 0.624 → shifts the pattern ~62% up
  • Rotation: 96.7° counterclockwise

Aşınma ve kir katmanları kendi değerlerini alır, bunlar da tohumdan türetilir ancak farklı çarpanlar ve açılarla.

Kalan Gizem: Döndürme Merkezi

Uzun süre bir soru kaldı: döndürme pivotu tam olarak nerede? <180° açılar UV'nin sol üst köşesi etrafında dönüyor gibi görünürken, daha yüksek açılar oyun dışında sonucu simüle etmeye çalışırken tutarsız davrandı.

Reddit'ten pattern.wiki'ye

Bu sistemi tersine mühendislik yapmanın en erken girişimi, 2016'da Step7750'nin ünlü Reddit gönderisinden geldi. O gönderi, tohum tabanlı dönüşümlerin nasıl çalıştığına dair temel fikri ortaya koydu — ve yıllarca topluluk için fiili referans olarak hizmet etti.

Sonunda, Broskins ve csfloat.com gibi siteler çalışan önizleme sistemleri oluşturdu — ancak Valve tarafından kullanılan gerçek mantık halk için belgelenmemiş kaldı.

Bu, 2024'ün başlarında pattern.wiki'nin dönüşüm sürecinin tam bir dökümünü yayınlamasıyla değişti — belirli değerler, matematik ve görsel örnekler dahil. Bu büyük bir ileri adımdı.

Ne Açıklığa Kavuşturduk

pattern.wiki'nin uygulaması pratikte açıkça çalışırken, dönüşüm sırası ve döndürme pivotunun açıklaması Source'un başlık altında nasıl davrandığıyla tam olarak uyuşmuyordu. Test ve hata ayıklama yoluyla, birkaç ince (ama önemli) noktayı açıklığa kavuşturduk:

  • Tüm dönüşümler orijin (0, 0) etrafında uygulanır — çeviriden sonra değil
  • Etkili matris sırası: T₂ × R × S × T₁

Şablon Dönüşümü Uygulaması (Sonlandırılmış Model)

Bir paint seed kullanarak dokunun doğru alanını örneklemek için, bir dizi afin dönüşümü uygularız — her biri temel dokuyu örneklemeden önce UV koordinatlarını değiştirir.

Adım Adım Dönüşüm Zinciri

1. Merkezlenmiş çeviri

Paint seed ofsetlerini kullanarak deseni kaydırın, ancak dönüşümü UV orijini etrafında merkezleyin:

translate(offsetX - 0.5, offsetY - 0.5)
2. Ölçek (orijin etrafında)

Temel ölçeği kullanarak deseni eşit şekilde ölçekleyin — orijin (0, 0) etrafında:

scale(scaleX, scaleY)
3. Döndürme (orijin etrafında)

Deseni orijinden saat yönünün tersine döndürün:

rotate(rotation)
4. Ekstra ofset (son ayarlama)

Döndürme ve ölçekten sonra, köşe tabanlı döndürmeyi telafi eden son bir ofset uygulayın:

invScale = 0.5 / scale
angle = -rotationDeg * (π / 180)
extraX = invScale * cos(angle) - invScale * sin(angle)
extraY = (extraX * sin(angle)) + (invScale * cos(angle))
translate(extraX, extraY)

Son Matris Dizisi

Afin terimlerde, bu tam bir dönüşüm matrisi oluşturur:

A = T₂ × R × S × T₁

Veya sade Türkçe ile:

  1. UV ofsetini merkezle
  2. Ölçeği uygula
  3. Orijin etrafında döndür
  4. Ekstra ofset ile düzelt

Son dönüştürülmüş UV'ler daha sonra modulo kullanılarak sarılır:

uv_final = (A × uv_coords) % 1.0

Float değerine bağlı aşınma nasıl oluşturulur

Daha yüksek float değerleri bir skinin daha aşınmış görünmesini sağlar. Bunu Counter-Strike'ın yaptığıyla aynı şekilde yeniden oluşturuyoruz — Case Hardened deseninin üzerine üç dokuyu doğrusal ışıkta birleştirerek ve bunu eşyanın float değerine göre yöneterek. Float 0'da (Fabrikadan Yeni Çıkmış) temiz deseni görürsün; float 1'de (Savaş Görmüş) metal soluklaşır, kararır ve taneli bir hal alır.

Temel desen

Renk geçişli Case Hardened deseni (mavi / altın / mor), yukarıda anlatılan aynı tohum dönüşümüyle yerleştirilir.

Aşınma haritası

Bıçağın hangi kısımlarının önce aşınacağına karar veren gri tonlamalı bir harita — korunan alanlardan önce yüksek kenarlar ve açıkta kalan bölgeler.

Kir haritası

Float yükseldikçe gerçekçi yüzey bozulması ve kir ekleyen ince bir kir ve benek haritası.

Float değeri tüm efekti tek bir parametre üzerinden yönetir. Onu 0'dan 1'e sürüklemek deseni görünür tutarak kademeli olarak doygunluğunu azaltır, karartır ve kirletir — Case Hardened, renk değiştirip kir biriktirerek yaşlanır, çıplak metale kadar çizilip aşınmaz.

worn = compose(base, wear, grunge, AO, float) // float 0 = Factory New … 1 = Battle-Scarred
Karambit Case Hardened desen 387, Tier 1 blue gem
Fabrikadan Yeni Çıkmış · float 0.000

Aynı float güdümlü aşınma motoru, canlı — bu Karambit #387’yi Fabrikadan Yeni Çıkmış’tan Savaş Görmüş’e tarıyor.

Tane ('Maserung') silahın geometrisinden gelir

Her silahın pişirilmiş bir oyuk / ambient-occlusion (AO) haritası vardır. Aşınma ve kir, çatlaklarda ve kenarlar boyunca yoğunlaşır; savaş görmüş bir bıçakta gördüğün o karakteristik benekli taneyi oluşturan da budur. Her bıçak kendi AO haritasını kullanır, dolayısıyla aşınma deseni o silahın şekline özgüdür.

  1. Case Hardened desenini, aşınma haritasını ve kir haritasını her desene özgü tohum dönüşümleriyle yerleştir.
  2. Her pikselin ne kadar güçlü aşınacağına float değeriyle karar ver; silahın oyuk / AO haritasıyla ağırlıklandır.
  3. Aşınmış alanların doygunluğunu azaltıp bir kir tonuna doğru karart ve kir haritasından ince kir ekle.
  4. Her şeyi doğrusal ışıkta birleştir ve kaydırıcıyı sürüklerken 3D modelde canlı olarak göster.

Bu, Counter-Strike'ın kendi kaplama shader'ından geri elde edilip yeniden üretilen tam matematiğin ta kendisidir — böylece önizlediğin aşınmış görünüm, eşyanın oyun içinde gerçekte göründüğü haliyle eşleşir.

Bu yaklaşımı daha iyi anlamak için, kendi tarayıcınızda canlı olarak tam olarak bu dönüşümleri uygulayan doku dönüşüm stüdyomuzla oynayabilirsiniz.