3ds Max. Создание ломающегося предмета (дневник исследования) — различия между версиями — S.T.A.L.K.E.R. Inside Wiki

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

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск
м
м (Дальнейшая настройка и конвертирование в *.ogf)
 
(не показаны 22 промежуточных версий 9 участников)
Строка 1: Строка 1:
{| align="right"
+
''Автор:'' '''Neo]['''
|''Автор:'' '''Neo]['''
+
 
|}
+
== Структура статьи ==
__TOC__
+
Раз это дневник, а не полноценная статья, то структура несколько странная получилась. Если интересен сам процесс исследования, то можно читать по порядку, иначе можно сразу перейти к секции ''Создание модели''.
 
== Введение ==
 
== Введение ==
 
Ну что, я пока тоже не знаю как это сделать, но на то это и дневник, чтобы записывать сюда ход исследований. Разбираться буду на каком-нибудь примере. Возьму для разбора деревянный ящик.
 
Ну что, я пока тоже не знаю как это сделать, но на то это и дневник, чтобы записывать сюда ход исследований. Разбираться буду на каком-нибудь примере. Возьму для разбора деревянный ящик.
Строка 34: Строка 34:
 
Значит со структурой ломающихся объектов разобрались.
 
Значит со структурой ломающихся объектов разобрались.
  
== Создаём, да прибудет SDK в помощь ==
+
== Создание модели ==
  
 
Теперь перенести бы это на процесс создания, первым делом попробуем подобрать необходимые шейдеры. Пошёл смотреть [[Описание шейдеров XRayMtl]].
 
Теперь перенести бы это на процесс создания, первым делом попробуем подобрать необходимые шейдеры. Пошёл смотреть [[Описание шейдеров XRayMtl]].
Строка 46: Строка 46:
 
*Compiler - def_vertex(Основной vertex shader, раз физический объект, вершинный шейдер значит по любому нужен)
 
*Compiler - def_vertex(Основной vertex shader, раз физический объект, вершинный шейдер значит по любому нужен)
 
*Material - objects/large_furnitura(Материал деревянных изделий)
 
*Material - objects/large_furnitura(Материал деревянных изделий)
 +
{{Message_box|
 +
id =pseudoscience|
 +
align = left|
 +
backgroundcolor = #f9f9f9|
 +
image =Lamp.gif|
 +
heading = Update|
 +
message = Так как объект не компилится стандартными средствами, то шейдеры Compiler и Material можно не указывать}}
 +
<br clear="both" />
  
 
Попробую повторить тот же самый ящик, запускаю макс, быстренько моделю подобие ящика и частей на которые он будет распадаться. Для всего ящика ставлю настройки шейдеров, которые написаны выше, для частей же просто как для деревянный досок([[Пресеты XRay материалов]]).
 
Попробую повторить тот же самый ящик, запускаю макс, быстренько моделю подобие ящика и частей на которые он будет распадаться. Для всего ящика ставлю настройки шейдеров, которые написаны выше, для частей же просто как для деревянный досок([[Пресеты XRay материалов]]).
Строка 56: Строка 64:
  
 
'''Update:''' При загрузке уровня получаю следующий лог:
 
'''Update:''' При загрузке уровня получаю следующий лог:
  stack trace:
+
<pre>  stack trace:
  
 
   001B:0049B5FF XR_3DA.exe, CCF_Skeleton::CCF_Skeleton()
 
   001B:0049B5FF XR_3DA.exe, CCF_Skeleton::CCF_Skeleton()
 
   001B:01CC39FF xrGame.dll
 
   001B:01CC39FF xrGame.dll
 
   001B:01C8AA2B xrGame.dll
 
   001B:01C8AA2B xrGame.dll
   001B:01C82A34 xrGame.dll
+
   001B:01C82A34 xrGame.dll</pre>
 
+
[[Изображение:3D-max-bone-test-box.jpg|thumb|left|400px|Добавление костей]]
 
Хм, после раздумий делаю выводы, что надо делать также как и оружие или персов. Ну что ж будем делать.
 
Хм, после раздумий делаю выводы, что надо делать также как и оружие или персов. Ну что ж будем делать.
  
Открываю сцену в максе, добавляю кость: Create-> System -> Bones. Переименую её в link.
+
Открываю сцену в максе, добавляю 2 кости: Create-> System -> Bones. Первую назову link, вторая может называться хоть как, без разницы.
{|
+
 
|[[Изображение:3D-max-bone-test-box.jpg|thumb|400px|Добавление кости]]
+
[[Изображение:3d-max-init.gif|frame|Инициализация скелета]]
|[[Изображение:3d-max-init.gif|frame|Инициализация скелета]]
+
|}
+
<br clear="both" />
+
 
Теперь применю к мешу ящика модификатор Physique. Проинициализурем скелет, нажатием на кнопку Attach to Node и выбрав кость link.<br />
 
Теперь применю к мешу ящика модификатор Physique. Проинициализурем скелет, нажатием на кнопку Attach to Node и выбрав кость link.<br />
 
Теперь небольшое отступление по поводу этого модификатора. Раскрыв свиток модификатора, мы видим там следующее:
 
Теперь небольшое отступление по поводу этого модификатора. Раскрыв свиток модификатора, мы видим там следующее:
Строка 79: Строка 84:
 
*Vertex – Настройка типа вершин и привязка к кости.<br />
 
*Vertex – Настройка типа вершин и привязка к кости.<br />
 
Но меня интересует только Envelope и Vertex. Настрою привязку вершин к кости, учитывая, чтобы ни одна вершина не осталась непривязанной. Иду в Vertex.<br />
 
Но меня интересует только Envelope и Vertex. Настрою привязку вершин к кости, учитывая, чтобы ни одна вершина не осталась непривязанной. Иду в Vertex.<br />
 +
 
Типы вершин:<br />
 
Типы вершин:<br />
 
<font color="red" size="101%">+</font>  Деформируемые вершины (мягкие)<br />
 
<font color="red" size="101%">+</font>  Деформируемые вершины (мягкие)<br />
 
<font color="green" size="101%">+</font>  Недеформируемые вершины (Твердые)<br />
 
<font color="green" size="101%">+</font>  Недеформируемые вершины (Твердые)<br />
 
<font color="blue" size="101%">+</font>  Пустые вершины без весa и привязки к кости<br />
 
<font color="blue" size="101%">+</font>  Пустые вершины без весa и привязки к кости<br />
Сам ящик твердый, и поэтому мы используем для него rigid вершины. Счала надо очистить вершины от других костей, нажимаем select, выделяем вершины, переключаемся на синие вершины, нажимаем Assign to link и тыкаем на желтую полоску кости link. Вес и привязка сняты, теперь переключаемся на зеленые и опять тыкаем на линк, привязка назначена, делаем тоже самое с плафоном только тыкаем уже на соответствующую кость plafon. Теперь провод, здесь нам нужно перейти на Envelopes, тыкаете на нужные кости провода, переключаетесь на cross Section масштабируете енвайлоп как надо, периодически вращая кости подгоняете все как нужно у каждой кости.
+
Сам ящик твердый, и поэтому мы используем для него rigid вершины. Счала надо очистить вершины от других костей, нажимаем select, выделяем вершины, переключаемся на синие вершины, нажимаем Assign to link и тыкаем на желтую полоску кости link. Вес и привязка сняты, теперь переключаемся на зеленые и опять тыкаем на линк, привязка назначена.
 +
 
 +
Теперь экспортируем модель нашего ящика через Export Skin, а части простым экспортом(Export Editor Objects). Я сохранил модель ящика под именем test_box, а частей как test_box_prt{номер части}.
 +
 
 +
== Дальнейшая настройка и конвертирование в *.ogf ==
 +
[[Изображение:SDK-Actor-Ed-preferences.gif|thumb|500px|Настройка Actor Editor-a]]
 +
Запускаем Actor Editor, для удобства работы изменим некоторые настройки программы, а именно Preferences -> Objects -> Skeleton, поставим все галочки.
 +
Теперь загрузим наш объект(File-> Load...).
 +
 
 +
=== Настройка объекта ===
 +
 
 +
Первым делом настроим наш объект в целом, как я уже говорил в секции про исследование, что части объекта задаются конфигом. Для первого своего разрушаемого объекта я взял конфиг от ящика(gamedata\config\models\objects\box_wood_01.ltx), скопировал его, переименовал в test_box.ltx, далее немного изменил его в соответствии со своей задумкой.
 +
 
 +
Поменял только пути к частям:
 +
{| class="standard" align="left"
 +
! Оригинал(box_wood_01.ltx) || Наш конфиг(test_box.ltx)
 +
|-
 +
|<code ini>[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\prt\box_wood_01_prt5
 +
physics\box\prt\box_wood_01_prt6
 +
physics\box\prt\box_wood_01_prt7</code>
 +
| valign="top" | <code ini>[destroyed]
 +
physics\test_box\prt\test_box_prt1
 +
physics\test_box\prt\test_box_prt2</code>
 +
|}
 +
Остальное пока оставил без изменений.
 +
Загрузим получившийся конфиг в User Data объекта, т.е. в Object Item выбираем Object, в нижней части Item Properties, щёлкаем по полю User Data. Откроется диалог в котором нажимаем Load и ищем наш конфиг.<br />
 +
Всё с настройкой объекта закончили, перейдём к настройке геометрии.
 +
 
 +
 
 +
=== Настройка геометрии ===
 +
В Object Items развернём свиток Bones, в нашем случае будет одна кость с имненем link, выбираем её.
 +
В свойствах пункт Bones -> Global -> Generate Shape нажимае All. Идём ниже по списку:
 +
*Bones -> Bone -> Game Material указываем материал для нашей кости. Материал выбирается только из папки objects\, в соответствии с тем, какой материал хотим для нашего объекта, смотри [[Описание шейдеров XRayMtl]]. В нашем случае я выбрал objects/large_furnitura, что соответствует материалу деревянных изделий.
 +
*Bones -> Bone -> Mass - масса нашего объекта, я поставил 2.
 +
*Bones -> Bone -> Shape -> Type - форма геометрии, в нашем случае Box.
 +
 
 +
Далее нужно настроить геометрию так, как хотите, чтобы ваш объект коллизил с другими, т.е. после того, как type установлен в Box,
 +
должен появиться белый полупрозрачный шейп, это коллижен для пули и физики. Можно дополнительно редактировать шейп, например инструментом Scale.
 +
 
 +
Всё наш ящик готов к экспорту в ogf.<br />
 +
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. Всё можно компилировать уровень и идти ломать её, вот как это примерно выглядит в игре.
 +
 
 +
{|
 +
|[[Изображение:Ss pavel 06-11-07 23-54-58 (ww).jpg|thumb|400px|Ломающийся объект в игре]]
 +
|[[Изображение:Ss pavel 06-11-07 23-55-08 (ww).jpg|thumb|400px|Ломающийся объект в игре]]
 +
|}
 +
 
 +
== Что дальше? ==
 +
А дальше постараемся вспомнить все ролики GSC, FinalCountDown(проект "Игромании") и постараемся восстановить всё, что видели в них. Шкаф с отпадывающими дверками, "самодельные" бьющиеся лампы и т.д.
 +
 
 +
== Благодарности ==
 +
*Юрию Негробову - за помощь в настройке объекта в Actor Editor-е.
 +
[[Категория:Wireframe]]

Текущая версия на 13:32, 2 февраля 2018

Автор: Neo][

Структура статьи

Раз это дневник, а не полноценная статья, то структура несколько странная получилась. Если интересен сам процесс исследования, то можно читать по порядку, иначе можно сразу перейти к секции Создание модели.

Введение

Ну что, я пока тоже не знаю как это сделать, но на то это и дневник, чтобы записывать сюда ход исследований. Разбираться буду на каком-нибудь примере. Возьму для разбора деревянный ящик.


Поехали

Первым делом решил посмотреть, что из себя представляет модель деревянного ящика, нашёл две модели:

  • 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\prt\box_wood_01_prt5
physics\box\prt\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(Материал деревянных изделий)
Lamp.gif Update
Так как объект не компилится стандартными средствами, то шейдеры Compiler и Material можно не указывать


Попробую повторить тот же самый ящик, запускаю макс, быстренько моделю подобие ящика и частей на которые он будет распадаться. Для всего ящика ставлю настройки шейдеров, которые написаны выше, для частей же просто как для деревянный досок(Пресеты XRay материалов).

Тестовый ящик

Экспортирую ящик и каждую из частей отдельно. Далее после экспорта в 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.

Типы вершин:
+ Деформируемые вершины (мягкие)
+ Недеформируемые вершины (Твердые)
+ Пустые вершины без весa и привязки к кости
Сам ящик твердый, и поэтому мы используем для него rigid вершины. Счала надо очистить вершины от других костей, нажимаем select, выделяем вершины, переключаемся на синие вершины, нажимаем Assign to link и тыкаем на желтую полоску кости link. Вес и привязка сняты, теперь переключаемся на зеленые и опять тыкаем на линк, привязка назначена.

Теперь экспортируем модель нашего ящика через Export Skin, а части простым экспортом(Export Editor Objects). Я сохранил модель ящика под именем test_box, а частей как test_box_prt{номер части}.

Дальнейшая настройка и конвертирование в *.ogf

Настройка Actor Editor-a

Запускаем 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\prt\box_wood_01_prt5
physics\box\prt\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 - масса нашего объекта, я поставил 2.
  • 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(проект "Игромании") и постараемся восстановить всё, что видели в них. Шкаф с отпадывающими дверками, "самодельные" бьющиеся лампы и т.д.

Благодарности

  • Юрию Негробову - за помощь в настройке объекта в Actor Editor-е.
Другие места
LANGUAGE