IsItABlueGem LogoIsItABlueGem
Нэвтрэх

Техникийн Дэлгэрэнгүй

Энэ сайтыг ажиллуулж буй системийн талаарх боловсролын болон түүхэн баримт бичиг

Хэв маягийн Хувиргалт

Counter-Strike 2 болон Counter Strike Global Offensive нь нэг үндсэн текстур (Case Hardened гэх мэт) ашиглан санамсаргүй хувиргалтын системээр дамжуулан олон зуун өвөрмөц харагдацтай скин хувилбаруудыг үүсгэдэг. Энэ нь детерминистик, үр дээр суурилсан механизмаар хэрэгждэг — тоглоомоос гадуур Blue Gem хэв маягийг ойлгох, дахин бүтээх түлхүүр юм.

Яагаад Paint "Seed" гэж нэрлэсэн бэ?

Текстурын олон янз байдлыг тогтвортой боловч санамсаргүй байдлаар бий болгохын тулд Valve нь Source Engine-д суурилагдсан псевдо-санамсаргүй жигд генератор ашигладаг. Компьютерууд детерминистик машин учраас санамсаргүй байдал үүсгэхийн тулд анхны утга буюу үр шаарддаг. CS2-д скин бүрд 1-ээс 999 хүртэлх paint seed оноогддог. Энэ үр нь санамсаргүй тоо үүсгэгчийг эхлүүлж, дараа нь текстурт хувиргалт хийхэд ашиглагдах тодорхой утгуудын багцыг үүсгэдэг.

Энэ алгоритм нь детерминистик бөгөөд бүх платформ дээр жигд учраас өгөгдсөн paint seed үргэлж ижил хувиргалтыг өгдөг — скин бүх систем дээр адилхан харагдахыг баталгаажуулдаг.

TL;DR: Paint seed нь Valve-ийн псевдо-санамсаргүй генераторыг эхлүүлж, үндсэн текстур хэрхэн байрлуулах, эргүүлэх, масштаблахыг хэв маяг, элэгдэл, бохирдлын давхаргуудад тодорхойлдог.

Текстурын хувиргалт хэрхэн тооцоологддог вэ?

CS2 скинүүдийн харагдацыг хэрхэн санамсаргүй болгодгийг ойлгохын тулд UV зураглал ойлгох нь тустай: зэвсгийн загвар бүр 2D текстур 3D тор дээр хэрхэн ороогддогийг тодорхойлдог UV байршилтай байдаг. Valve энэ UV газрын зураг дээр текстур түрхээд paint seed ашиглан түүний орчуулга, эргэлт, масштабыг санамсаргүй болгодог.

Энэ нь зөвхөн үндсэн хэв маягт (Case Hardened өнгөний толбо гэх мэт) төдийгүй элэгдэл, бохирдлын давхаргад ч нөлөөлдөг — зураас, хөгшрөлт, бохир нэмдэг текстурууд.

Хэрэв скиний хэв маяг санамсаргүй шилжилт ашигладаггүй бол (жишээ нь Asiimov шиг нэг өнгөтэй скинүүд) энэ системд өртөхгүй.

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

Алхам алхмаар: Paint Seed → Хувиргалт

1. Үндсэн масштаб тодорхойлох

Зэвсэг болон будгийн хэв маяг бүр тодорхой масштабтай, ихэвчлэн Valve-ийн items_game.txt файлд тодорхойлогдсон. Үндсэн масштаб нь зэвсгийн урт болон UV масштабаас, будгийн хэв маягаас хамааран тооцоологддог:

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

Жишээлбэл, Karambit нь:

  • WeaponLength = 9.813000
  • UVScale = 0.438000
  • → 0.438 үндсэн масштабтай болно

2. Санамсаргүй утгууд үүсгэх

Үндсэн масштаб мэдэгдсэний дараа paint seed ашиглан 11 псевдо-санамсаргүй float утга үүсгэдэг, эдгээр нь текстурын давхарга бүр хэрхэн хэрэглэгдэхийг тодорхойлдог:

Текстурын давхаргаПараметрүүд
Хэв маягмасштаб, шилжилтX, шилжилтY, эргэлт
Элэгдэлмасштаб × үржүүлэгч, шилжилтX, шилжилтY, эргэлт
Бохирдолмасштаб × үржүүлэгч, шилжилтX, шилжилтY, эргэлт

Эдгээр float утгууд тогтмол дараалал, хүрээнд үүсгэгддэг:

Хэв маяг
  • translateX → 0.0 – 1.0
  • translateY → 0.0 – 1.0
  • rotate → 0.0 – 360.0
Элэгдэл
  • scaleMult → 1.6 – 1.8
  • translateX → 0.0 – 1.0
  • translateY → 0.0 – 1.0
  • rotate → 0.0 – 360.0
Бохирдол
  • 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)

Жишээ: Karambit | Case Hardened — Paint Seed 633

Дээрх логик ашиглан Karambit дээрх paint seed 633 нь:

  • 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

Элэгдэл, бохирдлын давхаргууд өөрсдийн утгуудыг авдаг, мөн үрээс гаралтай боловч өөр үржүүлэгч, өнцөгтэй.

Remaining Mystery: Rotation Center

Удаан хугацааны турш нэг асуулт үлджээ: эргэлтийн цэг яг хаана байдаг вэ? <180° өнцгүүд UV-ийн зүүн дээд буланг тойрон эргэх мэт харагдаж байсан ч илүү өндөр өнцгүүд тоглоомоос гадуур үр дүнг дуурайх үед тогтворгүй ажилладаг байв.

From Reddit to pattern.wiki

Энэ системийг урвуу инженерчлэх анхны оролдлого нь 2016 онд Step7750-ийн алдартай Reddit постоос эхэлсэн. Тэр пост үр дээр суурилсан хувиргалт хэрхэн ажилладаг үндсэн санааг дэлгэсэн бөгөөд олон жилийн турш нийгэмлэгт де факто лавлагаа байсан.

Эцэст нь Broskins, csfloat.com зэрэг сайтууд ажиллагаатай урьдчилан харах систем бүтээсэн боловч Valve-ийн ашигладаг бодит логик олон нийтэд баримтжуулагдаагүй хэвээр байв.

Энэ нь 2024 оны эхээр өөрчлөгдсөн, pattern.wiki хувиргалтын процессын бүрэн задаргааг нийтэлсэн — тодорхой утгууд, математик, харааны жишээнүүдийг багтаасан. Энэ нь том үсрэлт байлаа.

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. Төвлөрсөн шилжилт

Paint seed-ийн офсетүүд ашиглан хэв маягийг шилжүүлэх, гэхдээ хувиргалтыг UV эх цэг дээр төвлөрүүлэх:

translate(offsetX - 0.5, offsetY - 0.5)
2. Масштаб (эх цэг дээр)

Үндсэн масштаб ашиглан хэв маягийг жигд масштаблах — эх цэг (0, 0) дээр:

scale(scaleX, scaleY)
3. Эргэлт (эх цэг дээр)

Хэв маягийг эх цэгээс цагийн зүүний эсрэг эргүүлэх:

rotate(rotation)
4. Нэмэлт офсет (эцсийн тохируулга)

Эргэлт, масштабын дараа булан дээр суурилсан эргэлтийг нөхөх эцсийн офсет хэрэглэх:

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

Эцсийн матриц дараалал

Аффин нэр томьёогоор энэ нь бүрэн хувиргалтын матриц үүсгэдэг:

A = T₂ × R × S × T₁

Эсвэл энгийн хэлээр:

  1. UV офсетыг төвлөрүүлэх
  2. Масштаб хэрэглэх
  3. Эх цэг дээр эргүүлэх
  4. Нэмэлт офсетээр засах

Эцсийн хувиргасан UV-үүд модуло ашиглан ороогддог:

uv_final = (A × uv_coords) % 1.0

Энэ арга барилыг илүү сайн ойлгохын тулд та манай текстур хувиргалтын студид тоглож болно, энэ нь яг эдгээр хувиргалтуудыг таны хөтөч дээр шууд хэрэглэдэг.

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

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