GTA Vice City > Программирование

Сложные модели объектов

(1/4) > >>

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

DK:
Не нужно ничего копать, всё уже расписно в официальных доках по RenderWare  :)

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

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

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

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

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


--- Код: C++ ---bool CFileLoader::LoadAtomicFile(int stream, int modelIndex) {  if ( RwStreamFindChunk(stream, 16, 0, 0)) {    // ВО ВСЕХ ДФФ ИЗНАЧАЛЬНО ЕСТЬ КЛАМП (А ЗНАЧИТ И ИЕРАРХИЯ)    RpClump *clump = RpClumpStreamRead(stream);    if ( !clump  )      return false;    // НО ЗАЧЕМ НАМ ИЕРЕРХИЯ, ЕСЛИ ЭТО СТАТИЧЕСКАЯ МОДЕЛЬ?    pSaveModelInfo = CModelInfo::ms_modelInfoPtrs[modelIndex];    // МЫ НАХОДИМ И СОХРАНЯЕМ АТОМИКИ    // ЕСЛИ У НАЗВАНИЯ ФРЕЙМА ЕСТЬ ОКОНЧАНИЕ _LX -     // СОХРАНЯЕМ АТОМИК В СЛОТ X    // ЕСЛИ НЕТУ - В СЛОТ 0    // ВСЕГО 3 СЛОТА    RpClumpForAllAtomics(clump, CFileLoader::SetRelatedModelInfoCB, clump);    // А ВСЁ ОСТАЛЬНОЕ УДАЛЯЕМ, В Т.Ч. И САМ КЛАМП    RpClumpDestroy(clump);    // ТЕПЕРЬ У НАС НЕТУ ИЕРЕРАРХИИ, ЕСТЬ ТОЛЬКО 3 АТОМИКА, КОТОРЫЕ ПРИЦЕПЛЕНЫ К ФРЕЙМАМ В НУЛЕВЫХ КООРДИНАТАХ  }  return true;}Этот коллбэк выполняется для всех атомиков, которые есть в клампе

--- Код: C++ ---RpAtomic *CFileLoader::SetRelatedModelInfoCB(RpAtomic *atomic, RpClump *clump) {  char *frameName = GetFrameNodeName(atomic->object.parent);// получаем имя фрейма, к которому прицеплен атомик  char resultName[24]; int number;  GetNameAndLOD(frameName , resultName, &number);         // получаем индекс атомика по его имени (_LX)  CVisibilityPlugins::SetAtomicRenderCallback(atomic, 0);  pSaveModelInfo->SetAtomic(number, atomic);// сохраняем атомик в слот X  RpClumpRemoveAtomic(clump, atomic);           // удаляем атомик из основной иерархии  RwFrame *newFrame = RwFrameCreate();                       // создаём новый фрейм  RpAtomicSetFrame(atomic, frame);                 // и цепляем к нему атомик  CVisibilityPlugins::SetAtomicModelInfo(atomic, pSaveModelInfo);  return atomic;}Заметьте, что новосозданный фрейм никак не связан с тем, к которому изначально был прикреплен атомик.
Т.е. получается, если ваш атомик был в иерархии смещён на какую-то дистанцию относительно центра, напр.

--- Код: C++ ---parentFrame---------atomic1 (0.0;0.0;0.0)        |childFrame_L1-------atomic2 (0.0;0.0;1.0)То после загрузки оба атомика буду расположены по координатам (0.0;0.0;0.0).

Shagg_E:
Мне еще интересно, где в exe задается анимация некоторых моделей в Вайсе, типа кранов в доках и винтов у потолочного вентилятора в отеле

DK:
Теперь, наверное, всплывает главный вопрос - как именно игра определяет, что есть статика, а что динамика?
Все обьекты изначально определяются в файлах ide, в разных секциях.



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

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

Вращение вентилятора - это программная анимация (её нету в файлах-ресурсах), и работает она на конкретных моделях (определяется по названию файла модели).

--- Код: C++ ---Od_LightbeamAp_Radar1_01Mall_FansHtl_Fan_Rotate_NtHtl_Fan_Rotate_DyHotRoomFanBlimp_NightBlimp_Day

Shagg_E:
Короче, насколько я понял, можно:
1)либо создавать dff с 3мя частями, имеющими в названии окончание "_L1", "_L2" и "_L3", прописывать в IDE в секции objs, спавнить и управлять частями модели через память(для небольших, не нагружающих игру вещей типа часов);
2)либо создавать модель с катсценовой иерархией(отчасти схожа с автомобильной, вроде вмещает до 64 элементов), прописывать в IDE в секции hier и подгружать мини-катсцену с анимацией объекта(для масштабных сцен).
Таблица из последнего сообщения DK раскрыла тайну, почему у меня не получалось расширить "арсенал" катсценовых объектов в IDE для использования в одной катсцене - вместимость секции всего 5...
Поправьте меня, если не так понял.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии