GTA Builder Форум

GTA Vice City => Программирование => Тема начата: xanser от Сентябрь 07, 2016, 02:49:17 pm

Название: Сложные модели объектов
Отправлено: xanser от Сентябрь 07, 2016, 02:49:17 pm
Может у кого есть мысли, как управлять объектом, который имеет непростую иерархию, к примеру как замоделить рабочие часики со стрелками одной dff-моделью, тот же флаг с меняющимися фрэймами. Как потом обратиться к компоненту в иерархии. Для зацепки приходит на ум покопать например модель светофора или всякие ломающиеся лавочки. Делитесь мыслями, может у меня получиться что-то раскопать.

(https://s6.postimg.org/f4dtwj6bl/scr_20160907114239748.jpg) (https://s6.postimg.org/x8guh6401/scr_20160907114243078.jpg)
Название: Re: Сложные модели объектов
Отправлено: DK от Сентябрь 07, 2016, 08:25:36 pm
Не нужно ничего копать, всё уже расписно в официальных доках по RenderWare  :)

И вообще, зачем смотреть лавочки и светофоры, если тот же транспорт - это иделальный пример модели с иерархией.

Искать "компонент" можно по индексу в иерархии или по его названию.

Но тут ещё нужно учесть то, что игра изначально разделяет понятия статической (без иерархии) и динамической (с иерархией) модели.
Если ты попытаешься загрузить транспорт как статический обьект (допустим, пропишешь его в секции objs), то никакой иерархии у тебя не будет.

Интересная вешь: статика в VC (и, может быть, вообще в GTA 3-ей эры) может хранить как максимум 3 атомика. Как я понял, они играют роль лодов.
Порядок атомиков определяется окончанием в названии фрейма
_L%А если засунуть в dff несколько атомиков, и прицепить их к фреймам без этого окончания - по идее, случится утечка памяти (все атомики будут сохраняться в одно место (перезаписываться, без удаления).

Код: C++
  1. bool CFileLoader::LoadAtomicFile(int stream, int modelIndex) {
  2.   if ( RwStreamFindChunk(stream, 16, 0, 0)) {    // ВО ВСЕХ ДФФ ИЗНАЧАЛЬНО ЕСТЬ КЛАМП (А ЗНАЧИТ И ИЕРАРХИЯ)
  3.     RpClump *clump = RpClumpStreamRead(stream);
  4.     if ( !clump  )
  5.       return false;
  6.     // НО ЗАЧЕМ НАМ ИЕРЕРХИЯ, ЕСЛИ ЭТО СТАТИЧЕСКАЯ МОДЕЛЬ?
  7.     pSaveModelInfo = CModelInfo::ms_modelInfoPtrs[modelIndex];
  8.     // МЫ НАХОДИМ И СОХРАНЯЕМ АТОМИКИ
  9.     // ЕСЛИ У НАЗВАНИЯ ФРЕЙМА ЕСТЬ ОКОНЧАНИЕ _LX -
  10.     // СОХРАНЯЕМ АТОМИК В СЛОТ X
  11.     // ЕСЛИ НЕТУ - В СЛОТ 0
  12.     // ВСЕГО 3 СЛОТА
  13.     RpClumpForAllAtomics(clump, CFileLoader::SetRelatedModelInfoCB, clump);
  14.     // А ВСЁ ОСТАЛЬНОЕ УДАЛЯЕМ, В Т.Ч. И САМ КЛАМП
  15.     RpClumpDestroy(clump);
  16.     // ТЕПЕРЬ У НАС НЕТУ ИЕРЕРАРХИИ, ЕСТЬ ТОЛЬКО 3 АТОМИКА, КОТОРЫЕ ПРИЦЕПЛЕНЫ К ФРЕЙМАМ В НУЛЕВЫХ КООРДИНАТАХ
  17.   }
  18.   return true;
  19. }
Этот коллбэк выполняется для всех атомиков, которые есть в клампе
Код: C++
  1. RpAtomic *CFileLoader::SetRelatedModelInfoCB(RpAtomic *atomic, RpClump *clump) {
  2.   char *frameName = GetFrameNodeName(atomic->object.parent);// получаем имя фрейма, к которому прицеплен атомик
  3.   char resultName[24]; int number;
  4.   GetNameAndLOD(frameName , resultName, &number);         // получаем индекс атомика по его имени (_LX)
  5.   CVisibilityPlugins::SetAtomicRenderCallback(atomic, 0);
  6.   pSaveModelInfo->SetAtomic(number, atomic);// сохраняем атомик в слот X
  7.   RpClumpRemoveAtomic(clump, atomic);           // удаляем атомик из основной иерархии
  8.   RwFrame *newFrame = RwFrameCreate();                       // создаём новый фрейм
  9.   RpAtomicSetFrame(atomic, frame);                 // и цепляем к нему атомик
  10.   CVisibilityPlugins::SetAtomicModelInfo(atomic, pSaveModelInfo);
  11.   return atomic;
  12. }
Заметьте, что новосозданный фрейм никак не связан с тем, к которому изначально был прикреплен атомик.
Т.е. получается, если ваш атомик был в иерархии смещён на какую-то дистанцию относительно центра, напр.
Код: C++
  1. parentFrame---------atomic1 (0.0;0.0;0.0)
  2.         |
  3. childFrame_L1-------atomic2 (0.0;0.0;1.0)
То после загрузки оба атомика буду расположены по координатам (0.0;0.0;0.0).
Название: Re: Сложные модели объектов
Отправлено: Shagg_E от Сентябрь 07, 2016, 09:17:49 pm
Мне еще интересно, где в exe задается анимация некоторых моделей в Вайсе, типа кранов в доках и винтов у потолочного вентилятора в отеле
Название: Re: Сложные модели объектов
Отправлено: DK от Сентябрь 07, 2016, 10:03:10 pm
Теперь, наверное, всплывает главный вопрос - как именно игра определяет, что есть статика, а что динамика?
Все обьекты изначально определяются в файлах ide, в разных секциях.

(http://i.imgur.com/YTZ43gQ.png)

* Размер хранилища в оригинальной игре

PS В SA, всё же, это всё немного отличается.

Вращение вентилятора - это программная анимация (её нету в файлах-ресурсах), и работает она на конкретных моделях (определяется по названию файла модели).
Код: C++
  1. Od_Lightbeam
  2. Ap_Radar1_01
  3. Mall_Fans
  4. Htl_Fan_Rotate_Nt
  5. Htl_Fan_Rotate_Dy
  6. HotRoomFan
  7. Blimp_Night
  8. Blimp_Day
Название: Re: Сложные модели объектов
Отправлено: Shagg_E от Сентябрь 07, 2016, 11:20:54 pm
Короче, насколько я понял, можно:
1)либо создавать dff с 3мя частями, имеющими в названии окончание "_L1", "_L2" и "_L3", прописывать в IDE в секции objs, спавнить и управлять частями модели через память(для небольших, не нагружающих игру вещей типа часов);
2)либо создавать модель с катсценовой иерархией(отчасти схожа с автомобильной, вроде вмещает до 64 элементов), прописывать в IDE в секции hier и подгружать мини-катсцену с анимацией объекта(для масштабных сцен).
Таблица из последнего сообщения DK раскрыла тайну, почему у меня не получалось расширить "арсенал" катсценовых объектов в IDE для использования в одной катсцене - вместимость секции всего 5...
Поправьте меня, если не так понял.
Название: Re: Сложные модели объектов
Отправлено: DK от Сентябрь 07, 2016, 11:57:40 pm
Короче, насколько я понял, можно:
1)либо создавать dff с 3мя частями, имеющими в названии окончание "_L1", "_L2" и "_L3", прописывать в IDE в секции objs, спавнить и управлять частями модели через память(для небольших, не нагружающих игру вещей типа часов);
Не факт, что можно отрендерить все 3 атомика одновременно.
2)либо создавать модель с катсценовой иерархией(отчасти схожа с автомобильной, вроде вмещает до 64 элементов), прописывать в IDE в секции hier и подгружать мини-катсцену с анимацией объекта(для масштабных сцен).
Надо увеличить лимит секции hier.
Название: Re: Сложные модели объектов
Отправлено: xanser от Сентябрь 08, 2016, 04:35:53 am
DK, спасибо за разъяснения, попробую вникнуть.
Я изначально не стал упоминать про иерархию в машинах, поскольку предположил, что маловероятно применить что-то из этого для динамических объектов. Три уровня конечно маловато, если сделать например электронные часы, там 10 цифр, не выделять же под это 10 моделей, и из палочек не сделаешь каждую цифру. Хотя есть пример такого в бегущей строке на стадионе, типа MAIN EVENT TONIGHT: CAR RACING . . . там слова генерируются из точек (0x54E7E0: CScrollBar::Update)
Название: Re: Сложные модели объектов
Отправлено: DK от Сентябрь 08, 2016, 06:08:29 pm
Под электронные часы тебе надо будет не 10, а 40 "компонентов". Плюс разделитель ":".

Опять же, на plugin-sdk для Vice City у меня нету времени. Надеюсь, на этом сайте найдутся желающие развивать проект.
А я уже помогу чем смогу, научу и обьясню.
Название: Re: Сложные модели объектов
Отправлено: Shagg_E от Сентябрь 08, 2016, 09:24:24 pm
Еще вопрос. Компонентами авто, ровно как и компонентами других dff, можно управлять через память.
А возможно тем же способом управлять костями персонажа?
Я спрашивал у maxorator-а, как он запилил зум костей тут (https://www.youtube.com/watch?v=QZuki72q7Xg), но он уже 4 месяца на форумсы не заходит и еще даже не прочел сообщение...
Название: Re: Сложные модели объектов
Отправлено: DK от Сентябрь 08, 2016, 09:53:43 pm
Можно.
Могу показать на примере SA.
Название: Re: Сложные модели объектов
Отправлено: Shagg_E от Сентябрь 09, 2016, 12:24:49 am
Мне для Вайса :'(
В СА многое по-другому, поэтому мне бесполезна какая-то инфа по нему: достаточно вспомнить мой недавний затупок (https://sannybuilder.com/forums/viewtopic.php?pid=27022#p27022)...
Название: Re: Сложные модели объектов
Отправлено: kenking от Сентябрь 09, 2016, 10:08:52 am
Опять же, на plugin-sdk для Vice City у меня нету времени. Надеюсь, на этом сайте найдутся желающие развивать проект.
А я уже помогу чем смогу, научу и обьясню.

У меня есть желание, но знаний пока маловато.  ;)
Название: Re: Сложные модели объектов
Отправлено: DK от Сентябрь 09, 2016, 05:57:29 pm
Возможно, я позже покажу, как именно переношу информацию из IDA (функции, классы, переменные) в файлы sdk.
Название: Re: Сложные модели объектов
Отправлено: kenking от Сентябрь 10, 2016, 08:56:46 am
Возможно, я позже покажу, как именно переношу информацию из IDA (функции, классы, переменные) в файлы sdk.
Это было бы хорошо. Можно даже отдельную тему для этого создать.
Название: Re: Сложные модели объектов
Отправлено: xanser от Сентябрь 16, 2019, 01:46:19 pm
Решил продолжить тему. Сделал одной моделью часы со стрелками на здании полицейского участка, показывают игровое время. Как было предложено выше, использовал секцию [hier] в ide для иерархии и окончания компонентов в модели _L0, _L1, _L2, прописал модель в object.dat, только так все это заработало. Поиск компонентов модели использован аналогично транспорту, предложен DK в одной из тем, не помню где, через функцию RwFrameForAllChildren(parent, 0x5411E0, data).

Мод во вложении, собран "на коленке" только для тестов и не является дополнением к оригинальной игре!!!
Из минусов:
1. В секции [hier] нет возможности настраивать дальность и флаги прозрачности.
2. В секции [hier] лимит на 5 записей, все они нужны для кат-сцен.
3. Из-за расположения в [hier] объект исчезает и больше никогда не появляется, как только камера/игрок отдаляется за радиус примерно в 130 метров от объекта. Это главный минус, поэтому предложенный вариант кажется не имеет развития. Придется вернуться к варианту с лавочками и секции [objs], который не имеет иерархии, но при этом у лавок как-то происходит смена моделей при поломке. С этим бы хотелось разобраться и вызывать "на лету".

(https://i.postimg.cc/76n4HPFM/screen.jpg)
Название: Re: Сложные модели объектов
Отправлено: Shagg_E от Сентябрь 16, 2019, 04:06:07 pm
xanser>
Если можешь получить доступ через память к управлению компонентами катсценовой модели - то можно просто запускать катсцену в этом месте, когда игрок в радиусе 100 метров(а до этого(в радиусе 300м) скриптом пусть спавнится статическая модель).
И уже в этой катсцене спавни катсценовый объект и бери его под управление(старт как тут (http://forum.gtabuilder.ru/index.php?topic=200.msg2201#msg2201)(там уже обновлен пример - камера теперь свободная), только объекты загружаются опкодами 02F3 и 0248).
Т.е., для этого всего, как и в том (http://forum.gtabuilder.ru/index.php?topic=200.msg2201#msg2201) примере, модели прописывать нигде не нужно(нужно лишь кинуть модель+текстуру в gta3.img, а ifp(с 2 кадрами анимации) и dat(можно прям из того примера взять, т.к. камера не нужна будет) - в cuts.img).

Колхозен ли этот вариант?
О, даа!....

Возможные проблемы?
Только если кто-то попытается запустить другую катсцену в этом радиусе 100м, либо вообще в этом радиусе будет происходить какая-то заставка с перемещением игрока в/за пределы этого радиуса(в том запуске катсцены происходит сбивание камеры). Т.е., например, в обычном Вайсе никаких негативных последствий быть не должно(катсцен там нет, а существующие заставки не предполагают преодоление игроком этой границы 100м).


Есть еще один вариант. Закостить персонажа, как часы и закрепить его в нужное место, как тут в примере с развевающимися на ветру тряпками (http://gtabuilder.ru/gta_vc/programms/utils/467-iii-vc-sa-iv-v-gta-chars-and-anim-helper-v09-open-beta.html). Если нужно программное управление костями - это расписано тут (http://forum.gtabuilder.ru/index.php?topic=401.msg2860#msg2860). Способ рабочий - у меня получилось написать опкод (http://forum.gtabuilder.ru/index.php?topic=406.msg3805#msg3805) для управления поворотом костей.
Название: Re: Сложные модели объектов
Отправлено: xanser от Сентябрь 17, 2019, 04:35:17 am
А персонажа-часы можно застрелить, он убежит от выстрелов? :P Так-то можно и машину закрепить в виде тряпки, ох как все костыльно выходит. Для часов есть еще вариант рендерить стрелки примитивами по аналогии как рендерится мусор. Я так сделал рендер мультика при появлении экрана, а вот тряпки таким способом получатся только плоскими. Есть у меня еще игрушки-вертолетики с вращающимися винтами, собранные из разных кусков-моделей. Что бы такое универсальное для всего этого придумать...

(https://i.postimg.cc/C1T2xcNw/scr_20181020125520650.jpg) (https://i.postimg.cc/W34ZPHDn/scr_20181129094036454.jpg)
Название: Re: Сложные модели объектов
Отправлено: Shagg_E от Сентябрь 17, 2019, 01:35:31 pm
Цитировать
А персонажа-часы можно застрелить, он убежит от выстрелов?
Если убрать коллизию, прописать иммунитеты и соответствующее поведение - всё будет ок ;)

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

Конечно, если таких "мелочевок" у тебя планируется гора и еще кучка - тогда, наверное и стоит подумать о каком-то универсальном методе, но... лучше всё же 10 раз подумать, стоит ли тратить на это время...