Техникийн Дэлгэрэнгүй
Энэ сайтыг ажиллуулж буй системийн талаарх боловсролын болон түүхэн баримт бичиг
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 зураглалын үзэл баримтлал
Шооны тал эсвэл UV зураг дээр хулганаа аваачиж, 3D гадаргуу хэрхэн 2D текстурын координат руу буудаг болохыг үзээрэй
3D Model
UV Map (Unfolded)
Алхам алхмаар: 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
Эдгээр утгыг дараах логикоор давхарга бүрд бие даан хэрэглэнэ:
Хувиргалтын дараалал: Масштаб → Шилжилт → Эргэлт(Хэв маяг, элэгдэл, бохирдолд давтагдана)Жишээ: 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
Элэгдэл, бохирдлын давхаргууд өөрсдийн утгуудыг авдаг, мөн үрээс гаралтай боловч өөр үржүүлэгч, өнцөгтэй.
Үлдсэн нууц: Эргэлтийн төв
Удаан хугацааны турш нэг асуулт үлджээ: эргэлтийн цэг яг хаана байдаг вэ? <180° өнцгүүд UV-ийн зүүн дээд буланг тойрон эргэх мэт харагдаж байсан ч илүү өндөр өнцгүүд тоглоомоос гадуур үр дүнг дуурайх үед тогтворгүй ажилладаг байв.
Reddit-ээс pattern.wiki хүртэл
Энэ системийг урвуу инженерчлэх анхны оролдлого нь 2016 онд Step7750-ийн алдартай Reddit постоос эхэлсэн. Тэр пост үр дээр суурилсан хувиргалт хэрхэн ажилладаг үндсэн санааг дэлгэсэн бөгөөд олон жилийн турш нийгэмлэгт де факто лавлагаа байсан.
Эцэст нь Broskins, csfloat.com зэрэг сайтууд ажиллагаатай урьдчилан харах систем бүтээсэн боловч Valve-ийн ашигладаг бодит логик олон нийтэд баримтжуулагдаагүй хэвээр байв.
Энэ нь 2024 оны эхээр өөрчлөгдсөн, pattern.wiki хувиргалтын процессын бүрэн задаргааг нийтэлсэн — тодорхой утгууд, математик, харааны жишээнүүдийг багтаасан. Энэ нь том үсрэлт байлаа.
Бид юуг тодруулсан бэ
pattern.wiki-ийн хэрэгжилт практикт тодорхой ажилладаг ч тэдний хувиргалтын дараалал, эргэлтийн цэгийн тайлбар Source-ийн дотоод ажиллагаатай бүрэн таарахгүй байв. Туршилт, дебаг хийх замаар бид хэдэн нарийн (гэхдээ чухал) цэгүүдийг тодруулсан:
- Бүх хувиргалт эх цэг (0, 0) дээр хийгддэг — шилжилтийн дараа биш
- Үр дүнтэй матрицын дараалал: T₂ × R × S × T₁
Загвар хувиргалт хэрэглэх (Эцсийн загвар)
Paint seed ашиглан текстурын зөв хэсгийг дээж авахын тулд бид аффин хувиргалтуудын дарааллыг хэрэглэдэг — тус бүр нь үндсэн текстурыг дээж авахаас өмнө UV координатуудыг өөрчилдөг.
Алхам алхмаар хувиргалтын гинж
1. Төвлөрсөн шилжилт
Paint seed-ийн офсетүүд ашиглан хэв маягийг шилжүүлэх, гэхдээ хувиргалтыг UV эх цэг дээр төвлөрүүлэх:
translate(offsetX - 0.5, offsetY - 0.5)2. Масштаб (эх цэг дээр)
Үндсэн масштаб ашиглан хэв маягийг жигд масштаблах — эх цэг (0, 0) дээр:
scale(scaleX, scaleY)3. Эргэлт (эх цэг дээр)
Хэв маягийг эх цэгээс цагийн зүүний эсрэг эргүүлэх:
rotate(rotation)4. Нэмэлт офсет (эцсийн тохируулга)
Эргэлт, масштабын дараа булан дээр суурилсан эргэлтийг нөхөх эцсийн офсет хэрэглэх:
invScale = 0.5 / scaleangle = -rotationDeg * (π / 180)extraX = invScale * cos(angle) - invScale * sin(angle)extraY = (extraX * sin(angle)) + (invScale * cos(angle))translate(extraX, extraY)Эцсийн матриц дараалал
Аффин нэр томьёогоор энэ нь бүрэн хувиргалтын матриц үүсгэдэг:
A = T₂ × R × S × T₁Эсвэл энгийн хэлээр:
- UV офсетыг төвлөрүүлэх
- Масштаб хэрэглэх
- Эх цэг дээр эргүүлэх
- Нэмэлт офсетээр засах
Эцсийн хувиргасан UV-үүд модуло ашиглан ороогддог:
uv_final = (A × uv_coords) % 1.0Float утгаар тодорхойлогддог элэгдэл хэрхэн үүсдэг вэ
Float утга өндөр байх тусам скин илүү элэгдсэн харагддаг. Бид үүнийг Counter-Strike-ийн адил аргаар дахин бүтээдэг — Case Hardened хээний дээр гурван текстурыг линейн гэрэлд нийлүүлж, зүйлийн float утгаар жолооддог. Float 0 (Factory New) үед чи цэвэр хээг харна; float 1 (Battle-Scarred) үед металл бүдгэрч, харанхуйлж, ширхэгтэй болдог.
Үндсэн хээ
Дээр тайлбарласан ижил үрийн хувиргалтаар байрлуулсан, өнгөний шаталгаатай Case Hardened хээ (цэнхэр / алт / нил ягаан).
Элэгдлийн зураглал
Иртэй ямар хэсэг эхэлж элэгдэхийг шийддэг саарал өнгийн зураглал — хамгаалагдсан хэсгүүдээс өмнө өндөр ирмэг болон ил гарсан хэсгүүд элэгддэг.
Бохирдлын зураглал
Float өсөх тусам гадаргуунд бодитой эвдрэл, бохир нэмдэг нарийн шороо, цэгэн толбоны зураглал.
Float утга нь бүх эффектийг ганц параметрээр жолооддог. Үүнийг 0-ээс 1 рүү чирэхэд хээ харагдсаар байх зуур аажмаар өнгөгүйжиж, харанхуйлж, бохирддог — Case Hardened нь өнгөө шилжүүлж, бохир нэмэгдсэнээр хөгширдөг бөгөөд нүцгэн металл хүртэл зурагдаж элэгддэггүй.
worn = compose(base, wear, grunge, AO, float) // float 0 = Factory New … 1 = Battle-Scarred
Float-аар удирдагддаг яг тэр элэгдлийн хөдөлгүүр, шууд — энэ Karambit #387-г Үйлдвэрээс шинэ-ээс Тулааны сорвитой хүртэл.
Ширхэглэл ('Maserung') нь зэвсгийн геометрээс үүсдэг
Зэвсэг бүр шарагдсан хөндий / ambient-occlusion зураглалтай байдаг. Элэгдэл, бохир нь ан цав болон ирмэгийн дагуу төвлөрдөг бөгөөд энэ нь battle-scarred ир дээр харагддаг өвөрмөц толбот ширхэглэлийг бий болгодог. Хутга бүр өөрийн AO зураглалыг ашигладаг тул элэгдлийн хээ тухайн зэвсгийн хэлбэрт өвөрмөц байдаг.
- Хээ тус бүрийн үрийн хувиргалт ашиглан Case Hardened хээ, элэгдлийн зураглал болон бохирдлын зураглалыг байрлуул.
- Float утга ашиглан пиксел бүр хэр хүчтэй элэгдэхийг, зэвсгийн хөндий / AO зураглалаар жигнэн шийд.
- Элэгдсэн хэсгүүдийг бохир өнгө рүү өнгөгүйжүүлж харанхуйлаад, бохирдлын зураглалаас нарийн шороо нэм.
- Бүгдийг линейн гэрэлд нийлүүлж, гулсуурыг чирэх үед 3D загвар дээр шууд харуул.
Энэ нь Counter-Strike-ийн өөрийнх нь финиш шейдерээс сэргээж дахин бүтээсэн яг тэр математик юм — иймээс таны урьдчилан үзэж буй элэгдсэн харагдац зүйлийн тоглоом доторх бодит харагдацтай таарна.
Энэ арга барилыг илүү сайн ойлгохын тулд та манай текстур хувиргалтын студид тоглож болно, энэ нь яг эдгээр хувиргалтуудыг таны хөтөч дээр шууд хэрэглэдэг.