GTA Vice City > Программирование
Сложные модели объектов
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...
Поправьте меня, если не так понял.
Навигация
Перейти к полной версии