Bender Bending

Max Payne: Физические объекты

Официальное Руководство пользователя Max Payne 2 Tools

Введение

Max Payne 2 использует программное обеспечение сторонних производителей самым большим из которых является физический движок Havok. Havok используется для расчета столкновений и моделирования поведения физических объектов.
Но прежде чем, Вы начнёте изучать этот раздел Вы должны знать о создании мешей, динамических объектов и скриптинга FSM. Так что сперва прочтите разделы касающиеся перечисленных вещей.

Основы

Все физические объекты должны быть динамическими и выпуклыми (узнать, какие объекты являются выпуклыми вы можете узнать в разделе "Динамические объекты".
Давайте сначала создадим простую коробку, которая станет физическим объектом. Откройте редактор и нарисуйте картонную коробку. Сделайте ее динамическим объектом.
Потом откроем свойства и изменим физический материал на "cardboard_hollow". Также выключите световые карты - lightmaps, так как мы не хотим, чтобы статические тени остались на объекте в то время, как будут перемещаться по комнате. Динамическое освещение будет использоваться автоматически, когда световые карты выключены. Также включите "Cast No Shadows", так чтобы не оставалось теней на земле, когда объект будет перемещаться.
Когда эти изменения будут сделаны, перейдите в режим F5, выберите коробку и откройте диалог FSM нажав B. Перейдите в поле StartUp -handler и наберите следующее:
this->DO_EnablePhysics(true);
Вот и всё. Вы создали свой первый физический объек. Теперь, если хотите, можете протестировать объект на уровне. Эта специфическая коробка станет обладать физическими свойствами при запуске, когда будет послано сообщение "DO_EnablePhysics". Прежде чем объект станет вести себя как нормальный ДО; Вы можете выпустить любой ДО с физикой в любое время. Но после того, как он станет физическим невозможно будет возвратить прежнее состояние. Физические объекты не могут быть анимированны не возвратив их в прежнее состояние предшествующее физическому. Они могут, однако, получить нормальное сообщение DO, подобное DO_Hide.
Физический материал определяет, сколько объект будет весить и какие звуки будет издавать, если объект задеть. Вес определяется экспортёром уровня. Автоматически вычисляется кубическая способность объекта и затем проверяется предопределённое значение удельного веса для частиц физического материала.

Столкновение отдельных мешей

Вы протестировали коробку, которую мы сделали ранее. Вы могли заметить, что коробка слегка парит в воздухе. Дело в том, что существует 5-ти сантиметровая "буферная зона" вокруг геометрии столкновения объекта. Это физическая потребность моделирования, размер, который определён решением физического движка. К счастью, есть пути решения проблемы; мы будем делать меньший, невидимый, объект внутри визуального объекта, который обратится с фактическими столкновениями.
Сперва мы должны установить размер сетки равный 5 см. Мы можем полностью изменить размер сетки по умолчанию в MaxED, но поскольку это неудачное решение добавить другие размеры сетки, чем точное кратное число или разногласия существующих (такое расположение вещей на сетке), мы должны использовать отдельный тестовый уровень для постройки на нём объектов.
Откройте ещё одну копию MaxED2 и запустите новый уровень. Кликните Tools -> Document preferences и посмотрите на "Grid Scale steps". Добавьте значение '0.05' между 0.03125 и 0.0625. Затем скопируйте коробку на этот уровень и измените масштаб сетки на 0.05. Выровняйте сетку с коробкой и создайте меш, который будет меньше, на 5 см в каждом измерении, чем первоначальная коробка. Используйте тот же самый материал, как и в основной коробке.
Когда меш будет готов, группируйте его к первоначальному объекту и откройте свойства. Проверьте "Do Not Render" наряду с "Cast No Shadows" . Мы не хотим, чтобы этот объект отображался, так как он действует только как объект столкновения для визуализируемого объекта. Нажмите OK и откройте свойства первоначального объекта.
Проверьте, выключен ли первый флаг "Collisions" , но оставьте другие в покое так, чтобы они перестали быть серыми. Тогда те определённые столкновения будут унаследованы дочерними объектами. Также включите "No Decals", так как пули не будут больше сталкиваться с объектами и не будут видны от внутреннего столкновения внутри.
Теперь переместите объект внутрь первоначальной коробки, убедитесь, что форма объекта столкновения меньше точно на 5 см с каждой стороны.
Вот что должно получиться. Теперь копируйте оба объекта назад к первоначальному виду и протестируйте получившееся.
Как Вы можете видеть, различие огромно.
Хорошей идее будет сделать коробку префабом. Прочтите об этом в руководстве по префабам.
Также, удачной идеей будет упрощение меша столкновения, насколько это возможно. Вот как меш столкновения используется для основы стула.
Выглядит очень просто, но в игре работает отлично.
Возможно сделать так, чтобы физическому объекту наносились повреждения, когда персонаж ударит слишком сильно. "DO_MovedToInvalidPosition" - событие для физических объектов вызванное ударом персонажа объектов с достаточной энергией (вычисляется как Velocity * Mass - скорость умноженная на массу).
Откройте диалог "FSM" для объекта и перейдите в "DO_MovedToInvalidPosition". Если Вы хотите, чтобы персонаж умирал, когда он ударит объект слишком сильно, используйте линию
activator->C_SetHealth(0);
Если Вы хотите, чтобы наносились некоторые повреждения, используйте линию:
activator->C_CauseDamage(10);
Параметр - hitpoints (число жизней), отнимаемых от здоровья персонажа.

Вогнутые физические объекты

Если Вы хотите сформировать вогнутую форму с физическим объектом, Вам необходимо сгруппировать статические дочерние объекты, которые расширят оригинальную форму.
Давайте представим, что надо создать L-образный физический объект. Проблема в том, что форма L вогнутая. Для создания этого нам необходимо наличие двух объектов. Сперва мы сделаем динамическую часть основания
Затем мы приложим верхнюю часть как статическую дочернюю.
Тогда мы только пошлём сообщения объекту-основе, активизирующее физические свойства.
Если бы верхняя часть была бы динамической, то она могла бы служить как индивидуальный физический объект. Это означает, что если Вы хотите сделать объект, который сломается как несколько физических объектов, когда попадёт пуля, то при запуске это не может быть физическим, а только, когда будет "разрушен".
Давайте развивать объект L -образной формы так, чтобы он разрушился после попадания.
Сначала удалим сообщение DO_EnablePhysics из объект-основы и сделаем верхний объект также динамическим. Затем откроем диалог FSM объекта-основы, выделив его в режиме F5 и нажмём B . Потом нажмём ALT-E , чтобы создать событие по-умолчанию, назвав событие "break" . После напечатайте знакомое
this->DO_EnablePhysics(true);
в событии, что должно выглядеть так
Затем переходим в StartUp и пишем
#change the hitpoints value at your digression
this->DO_SetHitpoints(20);
Это даст объекту 20 хитпойнтов (hitpoints) и когда объект получит повреждения, хитпойнты понизятся, подобно любым другим персонажам в игре. 20 хитпойнтов равняется приблизительно двум выстрелам 9 мм.
Затем перейдём на OnDeath и запишем
this->FSM_Send(break);
Также добавим сообщение DO_SetHitpoints к StartUp верхнего объекта. В OnDeath у Вас должно получится
parent->FSM_Send(break);
Это пошлёт событие по-умолчанию разрушение - родительскому объекту, который вы ранее создали.
Вот и всё. Протестируйте сделанное в игре и Вы уведите при запуске не физический объект. Попробуйте выстрелить в объект и части начнут разваливаться.
Добавление отдельных мешей столкновения не затронет этого, так как дочерний всегда будет работать как продолжение динамического родителя. Если ушерб наносится, то это означает, что родитель получает повреждения.

Просмотров: 2 938

Это сообщение удалено