Автор Тема: Сложные модели объектов  (Прочитано 7747 раз)

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Сложные модели объектов
« : Сентябрь 07, 2016, 02:49:17 pm »
Может у кого есть мысли, как управлять объектом, который имеет непростую иерархию, к примеру как замоделить рабочие часики со стрелками одной dff-моделью, тот же флаг с меняющимися фрэймами. Как потом обратиться к компоненту в иерархии. Для зацепки приходит на ум покопать например модель светофора или всякие ломающиеся лавочки. Делитесь мыслями, может у меня получиться что-то раскопать.


Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Сложные модели объектов
« Ответ #1 : Сентябрь 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).
« Последнее редактирование: Октябрь 21, 2016, 12:05:06 am от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Сложные модели объектов
« Ответ #2 : Сентябрь 07, 2016, 09:17:49 pm »
Мне еще интересно, где в exe задается анимация некоторых моделей в Вайсе, типа кранов в доках и винтов у потолочного вентилятора в отеле

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Сложные модели объектов
« Ответ #3 : Сентябрь 07, 2016, 10:03:10 pm »
Теперь, наверное, всплывает главный вопрос - как именно игра определяет, что есть статика, а что динамика?
Все обьекты изначально определяются в файлах ide, в разных секциях.



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

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
« Последнее редактирование: Сентябрь 07, 2016, 10:46:51 pm от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Сложные модели объектов
« Ответ #4 : Сентябрь 07, 2016, 11:20:54 pm »
Короче, насколько я понял, можно:
1)либо создавать dff с 3мя частями, имеющими в названии окончание "_L1", "_L2" и "_L3", прописывать в IDE в секции objs, спавнить и управлять частями модели через память(для небольших, не нагружающих игру вещей типа часов);
2)либо создавать модель с катсценовой иерархией(отчасти схожа с автомобильной, вроде вмещает до 64 элементов), прописывать в IDE в секции hier и подгружать мини-катсцену с анимацией объекта(для масштабных сцен).
Таблица из последнего сообщения DK раскрыла тайну, почему у меня не получалось расширить "арсенал" катсценовых объектов в IDE для использования в одной катсцене - вместимость секции всего 5...
Поправьте меня, если не так понял.
« Последнее редактирование: Сентябрь 07, 2016, 11:22:56 pm от Shagg_E »

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Сложные модели объектов
« Ответ #5 : Сентябрь 07, 2016, 11:57:40 pm »
Короче, насколько я понял, можно:
1)либо создавать dff с 3мя частями, имеющими в названии окончание "_L1", "_L2" и "_L3", прописывать в IDE в секции objs, спавнить и управлять частями модели через память(для небольших, не нагружающих игру вещей типа часов);
Не факт, что можно отрендерить все 3 атомика одновременно.
2)либо создавать модель с катсценовой иерархией(отчасти схожа с автомобильной, вроде вмещает до 64 элементов), прописывать в IDE в секции hier и подгружать мини-катсцену с анимацией объекта(для масштабных сцен).
Надо увеличить лимит секции hier.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Сложные модели объектов
« Ответ #6 : Сентябрь 08, 2016, 04:35:53 am »
DK, спасибо за разъяснения, попробую вникнуть.
Я изначально не стал упоминать про иерархию в машинах, поскольку предположил, что маловероятно применить что-то из этого для динамических объектов. Три уровня конечно маловато, если сделать например электронные часы, там 10 цифр, не выделять же под это 10 моделей, и из палочек не сделаешь каждую цифру. Хотя есть пример такого в бегущей строке на стадионе, типа MAIN EVENT TONIGHT: CAR RACING . . . там слова генерируются из точек (0x54E7E0: CScrollBar::Update)

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Сложные модели объектов
« Ответ #7 : Сентябрь 08, 2016, 06:08:29 pm »
Под электронные часы тебе надо будет не 10, а 40 "компонентов". Плюс разделитель ":".

Опять же, на plugin-sdk для Vice City у меня нету времени. Надеюсь, на этом сайте найдутся желающие развивать проект.
А я уже помогу чем смогу, научу и обьясню.
« Последнее редактирование: Сентябрь 08, 2016, 06:10:41 pm от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Сложные модели объектов
« Ответ #8 : Сентябрь 08, 2016, 09:24:24 pm »
Еще вопрос. Компонентами авто, ровно как и компонентами других dff, можно управлять через память.
А возможно тем же способом управлять костями персонажа?
Я спрашивал у maxorator-а, как он запилил зум костей тут, но он уже 4 месяца на форумсы не заходит и еще даже не прочел сообщение...
« Последнее редактирование: Сентябрь 08, 2016, 09:27:00 pm от Shagg_E »

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Сложные модели объектов
« Ответ #9 : Сентябрь 08, 2016, 09:53:43 pm »
Можно.
Могу показать на примере SA.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Сложные модели объектов
« Ответ #10 : Сентябрь 09, 2016, 12:24:49 am »
Мне для Вайса :'(
В СА многое по-другому, поэтому мне бесполезна какая-то инфа по нему: достаточно вспомнить мой недавний затупок...
« Последнее редактирование: Сентябрь 09, 2016, 12:26:57 am от Shagg_E »

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Сложные модели объектов
« Ответ #11 : Сентябрь 09, 2016, 10:08:52 am »
Опять же, на plugin-sdk для Vice City у меня нету времени. Надеюсь, на этом сайте найдутся желающие развивать проект.
А я уже помогу чем смогу, научу и обьясню.

У меня есть желание, но знаний пока маловато.  ;)

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Сложные модели объектов
« Ответ #12 : Сентябрь 09, 2016, 05:57:29 pm »
Возможно, я позже покажу, как именно переношу информацию из IDA (функции, классы, переменные) в файлы sdk.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Сложные модели объектов
« Ответ #13 : Сентябрь 10, 2016, 08:56:46 am »
Возможно, я позже покажу, как именно переношу информацию из IDA (функции, классы, переменные) в файлы sdk.
Это было бы хорошо. Можно даже отдельную тему для этого создать.

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Сложные модели объектов
« Ответ #14 : Сентябрь 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], который не имеет иерархии, но при этом у лавок как-то происходит смена моделей при поломке. С этим бы хотелось разобраться и вызывать "на лету".