Хочу поделиться некоторыми полезными функциями и скриптами для 3dsmax.
Заранее скажу: использовать АККУРАТНО НА СВОЙ СТРАХ И РИСК. Я не несу ответственности за испорченные модели, текстуры, папки и файлы на ваших компьютерах.
Код преобразования материалов коллизии GTA IV в формат Vice City (может использоваться и для GTA 3).
Примечание: код работоспособен только для мешей, которые были импортированы пакетом скриптов OFIO! В GIMS используется другой материал коллизии.
ofio_col_id= #(
#(0),
#(1, 2, 121),
#(3, 4, 5, 6, 7, 8, 30, 33),
#(9, 10, 11, 12),
#(13, 14),
#(15),
#(16),
#(17, 18, 134, 144),
#(19, 20, 21, 22, 23, 24, 25, 26, 122, 133, 143, 155),
#(27, 28),
#(29, 31),
#(32),
#(34),
#(35, 39),
#(36),
#(37, 38, 152, 153),
#(40),
#(41),
#(42, 43),
#(44),
#(45),
#(46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 139, 140, 141, 142, 145, 146, 147, 148),
#(73, 74, 75, 76, 77, 78, 149, 151),
#(79),
#(80),
#(81, 126, 127, 128, 129, 135, 136, 137, 138),
#(82, 83, 84, 85, 123, 125, 150),
#(86),
#(87, 88, 89, 90, 132, 154),
#(91),
#(92),
#(93, 124),
#(94),
#(95),
#(96, 97, 98),
#(99, 100, 107, 108, 109, 110, 113, 117),
#(101, 102, 104, 105, 114, 115, 116, 118, 119, 120),
#(103, 106),
#(111, 112),
#(130),
#(131)
)
for i in geometry do (
local surfaceID = 0
local objmat = undefined
if classof i.material == multimaterial then objmat = i.material
if classof i.material == OF_IV_Collision then objmat = #(i.material)
tempmat = copy objmat
for j=1 to objmat.count do (
tempmat[j] = GTA_COLSurface()
for k=1 to ofio_col_id.count do (
mtlgroup = finditem ofio_col_id[k] objmat[j].mtlID
if mtlgroup>0 then
surfaceID = case k of (
1: 0
2: 0
3: 5
4: 26
5: 5
6: 5
7: 1
8: 5
9: 22
10: 10
11: 3
12: 18
13: 4
14: 25
15: 4
16: 2
17: 25
18: 25
19: 22
20: 22
21: 22
22: 11
23: 7
24: 6
25: 21
26: 7
27: 21
28: 10
29: 10
30: 0
31: 0
32: 0
33: 0
34: 0
35: 19
36: 0
37: 0
38: 0
39: 0
40: 7
41: 7
)
)
tempmat[j].surface = surfaceID
)
i.material = tempmat
update i
)
Следующий код объединяет в иерархии все меши в один, а также удаляет лишние даммисы. Примечание: данный код использовался мной при конвертации моделей из GTA IV в Vice City.
function selectHierarchy = -- эта рекурсивная функция была позаимствована на просторах интернета.
(for p in selection do
(if p.children != undefined do (selectmore p.children)))
RootArray = #()
for i in objects do (if i.parent==undefined then append RootArray i)
for i in RootArray do (
print i.name
select i
selectHierarchy()
deselect i
--$.parent = i
selobjs = $
dummys = #()
Sgeometry = #()
for j in selobjs do (
if superclassof j == helper then (append dummys j)
if superclassof j == geometryclass then (append Sgeometry j)
)
deselect $
select dummys
if $!=undefined then delete $
if Sgeometry.count<2 then continue
select Sgeometry
$.pivot = i.pivot
objs= $
macros.run "Modifier Stack" "Convert_to_Poly"
for j=1 to objs.count do (if objs[2]!=undefined then polyop.attach objs[2] objs[1])
)
Эта функция "обрезает" имена текстур на диске до 30 символов (ограничение в GTA3\Vice City, если в имени текстуры 31 символ и более, то в игре текстура отображаться не будет - будет просто белая текстура), находящихся в папках. Это использовалось мной при конвертации текстур из GTA IV в Vice City (при последующей сборке с помощью MagicTXD).
imgsrc = getdirectories "C:/RAGE_RESOURCE/*" --это путь к папке, где лежат распакованные .wtd файлы
for j in imgsrc do (
j=j+"/*"
files=getfiles j
for k in files do (
ext=""
ext = getFilenameType k
fname = getFilenameFile k
if fname.count>30 then (fname = substring fname 1 30; format "% %\n" (getfilenamefile k) fname; renamefile k ((getFilenamePath k)+fname+ext))
-- например текстура C:/RAGE_RESOURCE/my_txd/city_winterrroom_decals_snow_normal.png переименовывается в C:/RAGE_RESOURCE/my_txd/city_winterrroom_decals_snow_.png. В корневой директории папки RAGE_RESOURCE должны лежать папки с текстурами в любом формате .png .dds и тд.
)
)
Следующий код исправляет и обрезает имена корневых дамми (ВНИМАНИЕ: для моделей, ИМПОРТИРОВАННЫХ пакетом скриптов OFIO!). Это использовалось мной при конвертации моделей из GTA IV в Vice City.
--эта строка удаляет первые 4 символа, идентифицирующие тип модели (odr_; oft_) из имени файла.
for i in helpers do (if i.parent==undefined then (s=i.name; s = substring s 4 s.count; i.name=s) )
--эта строка сокращает имя объекта до 19 символов. Как правило имена объектов в GTA IV не превышают 20 символов. Можно конечно переписать строку иначе.
for i in helpers do (if i.parent==undefined and i.name.count > 19 then (i.name = replace i.name 19 1 ""; print i.name) )
--следующий блок кода заменяет частицу _l0 _l1 и тд на _k0 _k1 и тд, поскольку использование частиц _l0 _l1 в имени объектов вызывает вылет при приближении к объекту. Немного индусский код, но тем не менее.
for i in objects do (
if findstring i.name "_l0"!=undefined then s1=replace i.name (findstring i.name "_l0") 3 "_k0"
if findstring i.name "_l1"!=undefined then s1=replace i.name (findstring i.name "_l1") 3 "_k1"
if findstring i.name "_l2"!=undefined then s1=replace i.name (findstring i.name "_l2") 3 "_k2"
if findstring i.name "_l3"!=undefined then s1=replace i.name (findstring i.name "_l3") 3 "_k3"
if findstring i.name "_l4"!=undefined then s1=replace i.name (findstring i.name "_l4") 3 "_k4"
if findstring i.name "_l5"!=undefined then s1=replace i.name (findstring i.name "_l5") 3 "_k5"
if findstring i.name "_l6"!=undefined then s1=replace i.name (findstring i.name "_l6") 3 "_k6"
if findstring i.name "_l7"!=undefined then s1=replace i.name (findstring i.name "_l7") 3 "_k7"
if findstring i.name "_l8"!=undefined then s1=replace i.name (findstring i.name "_l8") 3 "_k8"
if findstring i.name "_l9"!=undefined then s1=replace i.name (findstring i.name "_l9") 3 "_k9"
if s1!=undefined then i.name=s1
)
Следующий код удаляет меши коллизии (которые есть внутри .oft файлов, то бишь являются частью .oft (.wft) моделей).
arr=#()
for i in geometry do (
mtl = i.material
if classof mtl == iv_col_material then append arr i
if classof mtl == Multimaterial then (if classof mtl[1] == iv_col_material then append arr i)
)
select arr
delete $
Функция конвертации OFIO материала мешей в GTA_MTL ("Камовский" GTA материал). Конвертирует материалы и обрезает имена текстур до 30 символов.
Примечание: функция использовалась совместно с пакетом OFIO от 04/03/2021 года. С другими версиями OFIO функция может не заработать.
fn ConvertMTL_Drawable_to_GTAMTL obj = (
local mtl = obj.material
if mtl != undefined then (
if classof mtl == Multimaterial then (
mtl.name = obj.name
for i = 1 to mtl.count do (
g_mtl = mtl[i].getInfo();
g_texnam = getfilenamefile g_mtl[2];
s_mtl = GTA_Mtl();
s_mtl.color = mtl[i].delegate.diffusecolor --если цвета материалов в конечном итоге некорректны, то эту строку стоит закомментировать!
s_mtl.colormap = bitmapTexture();
g_texnam = substring g_texnam 1 30;
s_mtl.colormap.filename = g_texnam + ".dds";
s_mtl.name = g_texnam;
mtl[i] = s_mtl;
)-- for
-- if multi
) else if classof mtl == iv_drawable_material then (
g_mtl = mtl.getInfo();
g_texnam = getfilenamefile g_mtl[2];
s_mtl = GTA_Mtl();
s_mtl.color = mtl.delegate.diffusecolor --если цвета материалов в конечном итоге некорректны, то эту строку стоит закомментировать!
s_mtl.colormap = bitmapTexture();
g_texnam = substring g_texnam 1 30;
s_mtl.colormap.filename = g_texnam + ".dds";
s_mtl.name = g_texnam;
obj.material = s_mtl;
) --if mtl multimaterial
) -- if mtl undefined
update obj;
)-- func
--функцию можно вызвать следующим образом:
for i in geometry do ConvertMTL_Drawable_to_GTAMTL i