Сповіщення
Очистити все

3ds Max. Створення ламаного предмета (щоденник дослідження)


Ранг:
Майстер
Роль:
Гість
Записи:
752
Приєднався:
2 роки тому
 

Структура статті

Якщо це щоденник, а не повноцінна стаття, то структура дещо дивна вийшла. Якщо цікавий сам процес дослідження, можна читати по порядку, інакше можна відразу перейти до секції Створення моделі .

Вступ

Ну що, я поки що теж не знаю як це зробити, але на те це і щоденник, щоб записувати сюди перебіг досліджень. Розбиратися буду на якомусь прикладі. Візьму для розбирання дерев'яну скриньку.

 

Поїхали

Насамперед вирішив подивитися, що являє собою модель дерев'яного ящика, знайшов дві моделі:

  • 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 ]
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
[ destroyed ]
physics\test_box\prt\test_box_prt1
physics\test_box\prt\test_box_prt2

Решту поки що залишив без змін. Завантажимо конфіг, що вийшов, в 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 (проект "Ігроманії") і постараємося відновити все, що бачили в них. Шафа з відпадаючими дверцятами, "саморобні" лампи, що б'ються і т.д.


   
Цитата