SCRIPTMAN

Добавление 3D номера для транспорта

В теме 4 сообщения

Здравствуйте, уважаемые пользователи форуму PAWNO-RUS.

В этой теме расскажу Вам, как добавить 3D номер на автомобиль, чтобы в дальнейшем для него работала функция "SetVehicleNumberPlate". 

 

Нам понадобится:

TXD Workshop любой версии(5.0 у меня)

Zmodeler(226 build 981 у меня)

 

1. Берём любую модель, я буду работать с BMW X6. 

1.1. Создадим для нёё папку, в моём случае "Модель и текстуры", туда переместим dff и txd модели.

1.2. Открываем TXD Workshop > Open txd > указываем наш txd, перед нами откроются текстуры этой модели

Спойлер

2dcjv9J.png

1.2. Нажимаете кнопку Export > Export all textures to bitmaps > указываете папку, которую создавали ранее, у меня это "Модель и текстуры". Если у вас не появился список с выбором типа текстур, нажмите еще раз на "Export".

Спойлер

BsmcLsT.png

 

 

2. Переходим по пути: папка с игрой/models/generic

2.1. Открываем через TXD Workshop файл "vehicle.txd", в списке ищем "carplate", нажимаем Export, в этот раз, нужно, чтобы открылось сразу окошко с выбором пути или просто, в том окошке выберите "TGA", сохраняем в удобное для вас место, я сохраню на РС, но название должно остаться "carplate", теперь можем закрыть TXD Workshop.

Спойлер

b4RUA8B.png

 

3. Открываем ZModeler, дальше нажимаем: Опции > Настройки > Сервисы (жмём на плюсик) > Пути к текстурам. Добавляете путь, по которому сохраняли все текстуры модельки, у меня это папка "Модель и текстуры" , ставите галочку "Использовать", применить и ок.

Спойлер

jMXbsKC.png

3.1. Добавляем модель авто, для этого: либо Файл > Импортировать, либо листок с синей стрелочкой

Спойлер

yAW6Tir.png

3.1. В окне импорта выбираем нашу модель, в "Параметры GTA SA" "Текстуры" поставьте на "BMP" и нажимайте "Импорт" (если у вас не доступна кнопка импорт, значит модель заблокирована, в интернете есть уроки, как разблокировать)

Спойлер

jBhpzSD.png

3.2. Мы импортировали нашу модель, теперь настроим вид в 1 окне просмотра модели поставим вид "Изометрия", во втором оставим "3D", у меня номера уже в текстуре, я просто наверх наложу карплату, у вас их может вообще не быть, поэтому сначала нужно будет добавить табличку с регионом, а номер можно будет не писать.

Спойлер

rYlRiGK.png

3.3. Добавим нашу текстуру, для этого нажимаем на красный шар вверху

Спойлер

Fb48Zwh.png

3.4. В открывшемся окне нажимаем на листок с синим шариком, называем текстуру "carplate" (как и сохраняли из workshop), в цветах ставим везде 255. В "Слои текстур" нажимаем на "...", в открывшемся окне нажимаем "Загрузить", выбираем нашу текстуру и нажимаем "Ок" и еще раз "Ок"

Спойлер

nVwmgL0.png

4. Меняем вид на "Спереди", жмём Создать > Поверхность > Сетка и создаём примерный размер номера (потом отредактируем)

Спойлер

F4dTDXR.png

3.1. Ничего не трогая, нажимаем снова на тот красный шарик, выбираем наш материал и жмём "Применить к выделенному" и нажимаем "Ок"

Спойлер

GBwk0eX.png

3.2. Включаем "Режим выделенного" (фон текста станет рыжим) и нажимаем Создать > Копию и нажимаем на наш номер, который мы создали, это для номера сзади, временно выключим копию, чтобы она нам не мешала

Спойлер

EQWMRJC.png

3.3. Выключаем режим выделенного, нажимаем Выделение > Кликом и ПКМ кликаем по нашему номеру (Всё делается в окошке с видом "Спереди", 3D не трогаем!!), он загорится рыжим и мы включаем снова режим выделенного, теперь нажимаем Модификации > Переместить, вверху у нас есть оси по которым перемещаем, включаете их и перемещаете как нужно, так же, рекомендую включить вид "Справа", и смотреть в 3D, как будет спереди выглядеть и справа, чтобы прикрепить ровно

Спойлер

YDdU4BJ.png

Я уже сделал, на скриншоте можете видеть, что у меня получилось, но, выглядит это не красиво и в игре будет не реалистично, потому что размер не тот, что нужно. Сейчас его изменим.

3.4. Нажимаете Модификации > Масштабировать, для удобства можете включить вид "Спереди" и изменяете точно также, по осям

Спойлер

HpI9cBC.png

В итоге, всё это подровняв, у меня что-то получилось, теперь, давайте закинем наш номер в передний бампер, для этого, нажимаем на плюсик в нашей модели, и пробуем включать и выключать разные детали, пока не доберемся до бампера, у меня он называется "bump_front_dummy", в основном, примерно так он называется во всех моделях. Теперь перетаскиваем наш номер туда, но перед этим, лучше измените название с "Surface", на, например, "carplate" и "carplate2", потому что насколько я знаю, может возникнуть баг, если оставить с таким названием. Переместили, всё, в принципе, у нас передний бампер и номер готов, нам только нужно их объединить

Спойлер

5D1KSjJ.png

 

P. S. На скриншоте "Surface", но я уже изменил, просто забыл.

 

Теперь нам нужно поработать с номером на заднем бампере, работа идентичная, только нужно развернуть. Но это я напишу чуть позже, вероятнее всего завтра, во второй половине дня (потому что только я могу учиться на каникулах).

 

Автор темы: SCRIPTMAN

 

Перед тем, чтобы написать тему, я проверил в игре и это работает.

 

При копировании на другие порталы указывайте автора

 

Отредактировано пользователем SCRIPTMAN

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вторая часть урока.

4. Включаем нашу плату, которая будет на заднем номере, нажимаем Модификации > Вращать и вращаем по нужной оси на 180 градусов, то есть, чтобы было на задних номерах, вращаем до того момента, чтобы видно было только ребро, как у меня. Но не забываем, что работает во включённом режиме выделенного

Спойлер

ysxBFDH.png

4.1. Исходя из первого урока, перемещаем ее на нужное место, чтобы переместить: Модификации > Переместить (подробнее в первом уроке). У меня это получилось как-то так, но не забывайте, что на заднем номере часто нужно вращать плату, чтобы она прилегала к номеру

Спойлер

f2UWOuM.png

4.2. Соединяем нашу плату с задним бампером или багажником, зависит от расположения номера, у меня это багажник и называется он "boot_dummy"

Спойлер

2ethef8.png

5. После того, как всё сделали, объединяем. Нажимаем Модификации > Объединить, нажимаем на любое пустое место, не отпуская курсор ведем вниз, выключаем режим выделенного и наводим наш курсор на багажник/бампер (при наведении загорится название детали) и нажимаем ЛКМ  еще раз

Спойлер

Kjxhb0D.png

6. Нажимаем "Export", кликаем по нашей модельки, которую мы открывали и проверяем, чтобы всё было как у меня (кроме названия модели) и нажимаем "Экспорт"

Спойлер

Wi4jIfD.png

Но номера у нас работать не будут, потому что мы не добавили текстуру к этой модели.

7. Открываем TXD Worskshop, нажимает "Open TXD" и открываем TXD нашей модели, далее нажимаем Image > New > 32BPP, листаем вниз, там будет наша созданная картинка, нажимаем на нёё, дальше Import и выбираем нашу carplate.tga. Дальше нажимаем: properties, Name: carplate (так, как называли текстуру в Zmodeler!!!), ставим галку на "Compressed" и нажимаем "Ок"

Спойлер

weKN1cZ.png

И нажимаем "Save TXD" после проделанной работы. Закрываем, добавляем нашу модель в игру и радуемся. (Проверено лично мной)

 

Спасибо за внимание!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот так это выглядит в игре:

Спойлер

BIFzZzi.jpg

Спойлер

jCud5xK.png

Как видите, всё работает. Конечно, можно сделать лучше, но это уже ваше дело.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А для удобности, чтобы по 100 раз не создавать сетку, можно сделать z3d файл с номерами и платами, просто импортируешь его и все

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Mister Odin
      От Mister Odin
       
      new
       g_teleport_list[39][E_TELEPORT_LIST] = {  {"Спавн пгт.Батырево", 1802.3612, 2508.4824, 15.8887},  {"Спавн г.Арзамас", -113.5887, 977.7222, 12.0346},     {"Спавн г.Южный", 2744.2770, -2446.7246, 21.8988},     {"Центральный банк", 1852.020385,2040.791381,15.892713},  {"Рублёвка", -837.7783, 888.6161, 12.7232},  {"Казино", 1332.4252, 2358.7014, 17.6641},  {"Битва за контейнеры", 614.5167, 1722.3566, 12.0709},  {"Автосалон низкого класса", 2493.9616, -722.9544, 12.3315},  {"Автосалон среднего класса", 1407.7449, 455.4801, 13.1630},  {"Автосалон высокого класса", -14.0637, 2614.5664, 10.9892},   {"Мотосалон Harley Davidson", 785.720153, 750.465087, 12.000024},  {"Автошкола", 1909.174438,2227.679687,15.708162},  {"Военкомат", 1916.778564,2302.411376,15.574637},  {"Правительство области", -139.140975,593.789611,12.145712},  {"Отдел полиции №1 (ГИБДД)", 1906.805786,-2234.382812,11.257631},  {"Отдел полиции №2 (УМВД)", 2581.309326,-2416.139892,21.960090},  {"Отдел ФСБ", 1823.904663,2095.636718,15.848405},  {"Городская больница г.Арзамас", -285.797210,581.851562,12.120290},   {"СМИ", -317.708038,821.221679,13.051450},  {"Воинская часть", 1703.197265,1678.025878,15.279437},  {"Арзамасская ОПГ", 438.705322,1046.505126,12.002637},  {"Батыревская ОПГ", 1941.203857,2161.006591,15.705187},  {"Лыткаринская ОПГ", -2346.002441,75.257041,21.002962},  {"Шахта", 2381.5727, 1726.4451, -2.1506},  {"Завод", -1062.6697, 2204.1894, 38.0964},  {"Инкосация", 1864.1374, 2011.7136, 15.8546},  {"Транспортная Компания", 2362.1115, 1972.5627, 15.5530},  {"База механиков", 1840.918090,-118.025146,15.695312},  {"Курьерская служба доставки", 2764.509765,-2396.882568,21.890625},  {"Аренда автобуса(Южный)", 2771.041992,-2454.780761,21.845964},  {"Аренда автобуса(Арзамас)", -127.487670,943.652648,12.142824},   {"Аренда автобуса(Батырево)", 1798.986328,2529.591552,15.664262},  {"Гоночная трасса", -1568.7784, 1611.8305, 36.3971},  {"Дом на горе", -789.5397, -456.7479, 741.1422},  {"СТО и тюнинг-ателье", 1856.1375, -122.3266, 15.6888},  {"Аренда транспорта пгт.Батырево", 1763.641723,2255.673339,15.865348},  {"Аренда транспорта г.Арзамас", -36.923530,1360.673583,12.002090},  {"Аренда транспорта г.Южный", 1966.599975,-2603.943603,10.820312},  {"Тайный интерьер в Лыткарино", -2424.5818, 2846.3291, 40.7908} };
    • Garnik
      От Garnik
      ERRORS:
      : error 017: undefined symbol "HouseInfo"
      : error 017: undefined symbol "OWNABLEHOUSES"
      : error 029: invalid expression, assumed zero
      : fatal error 107: too many error messages on one line
      ===============================================================================================================
       
       
      ================================================================================================================
      CMD:addhouse(playerid,params[])
      {
              if(PI[playerid][pAdmin] < 10)return false;
              new string[650];
              new house_class, house_price;
              new Float:X, Float:Y, Float:Z, Float:A;
              if(sscanf(params, "ii", house_class,house_price))
              {
                      SendClientMessage(playerid, -1, "???????????: /addhouse [????? ??????] [???? ???????]");
                      SendClientMessage(playerid, -1, "??????: [1 - ??????-?????] [2 - ???????-?????] [3 - ???????-?????] [4 - ???????-?????]");
                      return 1;
              }
              if(house_class > 4 || house_class < 1)
              {
                      SendClientMessage(playerid, -1, "ID ????????? ?? 1 ?? 4");
                      return 1;
              }
              //
              GetPlayerPos(playerid,X,Y,Z);
              GetPlayerFacingAngle(playerid,A);
              HouseInfo[OWNABLEHOUSES][hEnter_X]=X;
              HouseInfo[OWNABLEHOUSES][hEnter_Y]=Y;
              HouseInfo[OWNABLEHOUSES][hEnter_Z]=Z;
              HouseInfo[OWNABLEHOUSES][hEnter_A]=A;
              HouseInfo[OWNABLEHOUSES][hKlass]=house_class;
              HouseInfo[OWNABLEHOUSES][hCost]=house_price;
              string="";
              strmid(HouseInfo[OWNABLEHOUSES][hOwner],"The State",0,strlen("The State"),28);
              format(string, 144, "?? ??????? ??????? ??? ????? {e7e7e7}%d {ffffff}????????? ???????: {e7e7e7}%d",OWNABLEHOUSES+1,HouseInfo[OWNABLEHOUSES][hCost]);
              SendClientMessage(playerid,-1,string);
              //
              string="";
              format(string,1500,"INSERT INTO `houses`(`ID`,`Enter_X`, `Enter_Y`, `Enter_Z`, `Enter_A`,`Exit_X`, `Exit_Y`, `Exit_Z`, `Owner`, `Cost` , `Klass`, `Interior`, `Level`) VALUES ('%d','%.2f','%.2f','%.2f','%.2f','267.1','305','999.148','The State','%d','%d','2','1')",
              OWNABLEHOUSES+1,HouseInfo[OWNABLEHOUSES][hEnter_X],HouseInfo[
              OWNABLEHOUSES][hEnter_Y],HouseInfo[OWNABLEHOUSES][hEnter_Z]
              ,HouseInfo[OWNABLEHOUSES][hEnter_A],HouseInfo[OWNABLEHOUSES]
              [hCost],HouseInfo[OWNABLEHOUSES][hKlass]);
              mysql_tquery(mysql, string);
              OWNABLEHOUSES++;
              return 1;
      }
    • Garnik
      От Garnik
      ERRORS:
      : error 017: undefined symbol "HouseInfo"
      : error 017: undefined symbol "OWNABLEHOUSES"
      : error 029: invalid expression, assumed zero
      : fatal error 107: too many error messages on one line
      ===============================================================================================================
       
       
      ================================================================================================================
      CMD:addhouse(playerid,params[])
      {
              if(PI[playerid][pAdmin] < 10)return false;
              new string[650];
              new house_class, house_price;
              new Float:X, Float:Y, Float:Z, Float:A;
              if(sscanf(params, "ii", house_class,house_price))
              {
                      SendClientMessage(playerid, -1, "???????????: /addhouse [????? ??????] [???? ???????]");
                      SendClientMessage(playerid, -1, "??????: [1 - ??????-?????] [2 - ???????-?????] [3 - ???????-?????] [4 - ???????-?????]");
                      return 1;
              }
              if(house_class > 4 || house_class < 1)
              {
                      SendClientMessage(playerid, -1, "ID ????????? ?? 1 ?? 4");
                      return 1;
              }
              //
              GetPlayerPos(playerid,X,Y,Z);
              GetPlayerFacingAngle(playerid,A);
              HouseInfo[OWNABLEHOUSES][hEnter_X]=X;
              HouseInfo[OWNABLEHOUSES][hEnter_Y]=Y;
              HouseInfo[OWNABLEHOUSES][hEnter_Z]=Z;
              HouseInfo[OWNABLEHOUSES][hEnter_A]=A;
              HouseInfo[OWNABLEHOUSES][hKlass]=house_class;
              HouseInfo[OWNABLEHOUSES][hCost]=house_price;
              string="";
              strmid(HouseInfo[OWNABLEHOUSES][hOwner],"The State",0,strlen("The State"),28);
              format(string, 144, "?? ??????? ??????? ??? ????? {e7e7e7}%d {ffffff}????????? ???????: {e7e7e7}%d",OWNABLEHOUSES+1,HouseInfo[OWNABLEHOUSES][hCost]);
              SendClientMessage(playerid,-1,string);
              //
              string="";
              format(string,1500,"INSERT INTO `houses`(`ID`,`Enter_X`, `Enter_Y`, `Enter_Z`, `Enter_A`,`Exit_X`, `Exit_Y`, `Exit_Z`, `Owner`, `Cost` , `Klass`, `Interior`, `Level`) VALUES ('%d','%.2f','%.2f','%.2f','%.2f','267.1','305','999.148','The State','%d','%d','2','1')",
              OWNABLEHOUSES+1,HouseInfo[OWNABLEHOUSES][hEnter_X],HouseInfo[
              OWNABLEHOUSES][hEnter_Y],HouseInfo[OWNABLEHOUSES][hEnter_Z]
              ,HouseInfo[OWNABLEHOUSES][hEnter_A],HouseInfo[OWNABLEHOUSES]
              [hCost],HouseInfo[OWNABLEHOUSES][hKlass]);
              mysql_tquery(mysql, string);
              OWNABLEHOUSES++;
              return 1;
      }