IsItABlueGem LogoIsItABlueGem
Giriş yap

Teknik Detaylar

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

Desen Dönüşümleri

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 Mapping Concept

Hover over the cube faces or UV map to see how 3D surfaces map to 2D texture coordinates

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

These values are applied independently to each layer using the following logic:

Transform Order: Scale → Translate → Rotate
(Repeated for pattern, wear, and grunge)

Ö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.

Remaining Mystery: Rotation Center

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ı.

From Reddit to pattern.wiki

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ı.

What We Clarified

While pattern.wiki's implementation clearly works in practice, their description of the transform order and rotation pivot didn't fully align with how Source behaves under the hood. Through testing and debugging, we clarified a few subtle (but important) points:

  • All transforms are applied around the origin (0, 0) — not after translation
  • The effective matrix order is: T₂ × R × S × T₁

Template Transform Application (Finalized Model)

To sample the correct area of the texture using a paint seed, we apply a sequence of affine transformations — each one modifying the UV coordinates before sampling the base texture.

Step-by-Step Transform Chain

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

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.

© 2025 isitabluegem. Non-commercial CS2 pattern analysis tool.

Not affiliated with Valve Corporation. CS2 skins and related content are property of Valve Corporation.