Структура статті
Якщо це щоденник, а не повноцінна стаття, то структура дещо дивна вийшла. Якщо цікавий сам процес дослідження, можна читати по порядку, інакше можна відразу перейти до секції Створення моделі .
Вступ
Ну що, я поки що теж не знаю як це зробити, але на те це і щоденник, щоб записувати сюди перебіг досліджень. Розбиратися буду на якомусь прикладі. Візьму для розбирання дерев'яну скриньку.
Поїхали
Насамперед вирішив подивитися, що являє собою модель дерев'яного ящика, знайшов дві моделі:
- gamedata\meshes\objects\dynamics\box\box_wood_01.ogf
- gamedata\meshes\physics\box\box_wood_01.ogf
Переглянувши моделі в цих директоріях, зупинився на gamedata \ meshes \ physics \ box \ box_wood_01.ogf. Хоча у обох випадках є папка \prt\, з назви ясно, що це частини об'єктів(part), тобто. їх також необхідно окремо моделювати, шкода, що xray+ode не вважають це в динаміці. Хоча для скла немає частин, через досліди зрозуміло, що скло ламається по полігонах. Ну та гаразд розмова не про це.
Є ціла модель, є частини, значить... Отже треба якось вказати ці частини, правильно конфігувати об'єкт. Іду шукати. Знаходжу:
- gamedata\config\models\objects\box_wood_01.ltx
Мене зацікавила секція:
[ destroyed ]
physics\box\prt\box_wood_01_prt1
physics\box\prt\box_wood_01_prt2
physics\box\prt\box_wood_01_prt3
physics\
box\prt\box_wood_01_prt4
physics\box \box_wood_01_prt6
physics\box\prt \box_wood_01_prt7
[ autoremove_parts ]
time = 15
Значить зі структурою об'єктів, що ламаються, розібралися.
Створення моделі
Тепер перенести б це на процес створення, насамперед спробуємо підібрати необхідні шейдери. Пішов дивитися Опис шейдерів XRayMtl . Додам, що:
- Engine - відображення текстури в движку гри.
- Compiler – використовується при компіляції рівня.
- Material - ігровий матеріал (wallmark, sound та ін.).
Вибрав:
- Engine - models/model (Основний шейдер для динамічних об'єктів)
- Compiler - def_vertex (Основний vertex shader, якщо фізичний об'єкт, вершинний шейдер означає по будь-якому потрібен)
- Material - objects/large_furnitura(Матеріал дерев'яних виробів)
Update Оскільки об'єкт не компілюється стандартними засобами, то шейдери Compiler і Material можна не вказувати |
Спробую повторити той самий ящик, запускаю макс, швиденько моделлю подібність ящика і частин, на які він розпадатиметься. Для всього ящика ставлю налаштування шейдерів, які написані вище, а для частин просто як для дерев'яних дощок.
Експортую ящик і кожну частину окремо. Далі після експорту в ogf з занесенням в custom data моделі майже копії файлу gamedata\config\models\objects\box_wood_01.ltx і спавна в редакторі як destroyable_objects, натикаюся на купу помилок у редакторі, чи щось неправильно, чи...
Update: При завантаженні рівня отримую наступний лог:
stack trace: 001B:0049B5FF XR_3DA.exe, CCF_Skeleton::CCF_Skeleton() 001B:01CC39FF xrGame.dll 001B:01C8AA2B xrGame.dll 001B:01C82A34 xrGame.dll
Відкриваю сцену в макс, додаю 2 кістки: Create-> System -> Bones. Першу назву link, друга може називатися хоч як, без різниці.
Тепер застосую до міша ящика модифікатор Physique. Проініціалізуємо скелет, натиснувши кнопку Attach to Node і вибравши кістку link.
Тепер невеликий відступ щодо цього модифікатора. Розкривши сувій модифікатора, ми бачимо там наступне:
- Envelope – Налаштування ваги вершин та прив'язки до кістки за допомогою обгинальних
- Link – Налаштування параметрів кісток
- Bulge – Редактор опуклостей
- Tendons – Редактор сухожиль
- Vertex – Налаштування типу вершин та прив'язка до кістки.
Але мене цікавить тільки Envelope та Vertex. Настрою прив'язку вершин до кістки, враховуючи, щоб жодна вершина не залишилася неприв'язаною. Іду до Vertex.
Типи вершин:
+ Деформовані вершини (м'які)
+ Недеформовані вершини (Тверді)
+ Порожні вершини без ваги і прив'язки до кістки
Сам ящик твердий, і тому ми використовуємо для нього rigid вершини. Счала треба очистити вершини від інших кісток, натискаємо select, виділяємо вершини, перемикаємося на сині вершини, натискаємо Assign to link та тикаємо на жовту смужку кістки link. Вага і прив'язка зняті, тепер переключаємося на зелені і знову тикаємо на лінк, призначена прив'язка.
Тепер експортуємо модель нашого ящика через Export Skin, а частини – простим експортом (Export Editor Objects). Я зберіг модель скриньки під ім'ям test_box, а частин як test_box_prt{номер частини}.
Подальше налаштування та конвертування в *.ogf
Запускаємо Actor Editor, для зручності роботи змінимо деякі налаштування програми, а саме Preferences -> Objects -> Skeleton, поставимо всі галочки. Тепер завантажимо наш об'єкт (File-> Load ...).
Налаштування об'єкта
Насамперед налаштуємо наш об'єкт в цілому, як я вже говорив у секції про дослідження, що частини об'єкта задаються конфігом. Для першого свого об'єкта, що руйнується, я взяв конфіг від ящика (gamedata\config\models\objects\box_wood_01.ltx), скопіював його, перейменував на test_box.ltx, далі трохи змінив його відповідно до своєї задуми.
Поміняв тільки шляхи до частин:
Оригінал(box_wood_01.ltx) | Наш конфіг(test_box.ltx) |
---|---|
[ destroyed ] |
[ destroyed ] |
Решту поки що залишив без змін. Завантажимо конфіг, що вийшов, в User Data об'єкта, тобто. у Object Item вибираємо Object, у нижній частині Item Properties, клацаємо по полю User Data. Відкриється діалог у якому натискаємо Load та шукаємо наш конфіг.
Все з налаштуванням об'єкта закінчили, перейдемо до налаштування геометрії.
Налаштування геометрії
У Object Items розгорнемо сувій Bones, у нашому випадку буде одна кістка з ім'ям link, вибираємо її. У властивостях пункт Bones -> Global -> Generate Shape натискає All. Ідемо нижче за списком:
- Bones -> Bone -> Game Material вказуємо матеріал для нашої кістки. Матеріал вибирається тільки з папки objects\, відповідно до того, який матеріал хочемо для нашого об'єкта, дивись Опис шейдерів XRayMtl . У нашому випадку я вибрав objects/large_furnitura, що відповідає матеріалу дерев'яних виробів.
- Bones -> Bone -> Mass - маса нашого об'єкта, я поставив два.
- Bones -> Bone -> Shape -> Type - форма геометрії, у разі Box.
Далі потрібно налаштувати геометрію так, як хочете, щоб ваш об'єкт колізував коїться з іншими, тобто. після того, як type встановлений в Box, повинен з'явитися білий напівпрозорий шейп, це колліжен для кулі та фізики. Можна додатково редагувати шейп, наприклад інструментом Scale.
Вся наша скринька готова до експорту в ogf.
File -> Export -> Export OGF... зберігаємо файл як: gamedata\meshes\physics\test_box\test_box.ogf
Тепер по черзі завантажуємо частини нашого об'єкта, нічого не змінюючи експортуємо їх як: gamedata \ meshes \ physics \ test_box \ prt \ test_box_prt { номер частини в соотв. з конфігом}.ogf
Ставимо нашу скриньку на карту
Наша скринька ставиться, як ентіті destroyable_object. Переводимо редактор у режим Spawn Element і додаємо на карту ентіті physics/destroyable_object.
Далі у властивостях ентіті встановлюємо нашу модель як Model/Visual. Все можна компілювати рівень і йти ламати її, ось як це виглядає приблизно в грі.
Що далі?
А далі намагатимемося згадати всі ролики GSC, FinalCountDown (проект "Ігроманії") і постараємося відновити все, що бачили в них. Шафа з відпадаючими дверцятами, "саморобні" лампи, що б'ються і т.д.