Как сделать коллизию в игре
Обработка коллизий
Table of contents
Это 10 из 16 уроков руководства разработки игры с помощью Phaser. Исходный код этого урока вы можете найти здесь: Gamedev-Phaser-Content-Kit/demos/lesson10.html.
Наша текущая задач — проверка коллизий между мячиком и кирпичами. К счастью, при помощи движка, мы можем проверить коллизии не только между двумя объектами (как это было с мячиком и платформой), но и между объектом и набором других объектов.
Проверяем коллизии Мячик/Кирпич
Физический движок облегчает очень многие задачи — нам понадобится, всего лишь, несколько простых кусочков кода. Для начала, добавим в функцию update() строчку проверки коллизий между мячиком и кирпичами, как показано ниже:
Вот и всё! Перезагрузите страницу и вы увидите, что все коллизии обрабатывается, как следует.
Вы думали, что нам придётся писать много кода для отслеживания коллизий, как мы это делали на чистом JavaScript? В этом и прелесть фреймворков — рутину они сделают за нас, а мы, в это время, можем сосредоточиться на действительно интересных вещах.
Сравните свой код
Вы можете проверить код из этого урока и поиграть с ним, чтобы лучше понять, как он работает:
Следующий шаг
Теперь мы можем разбивать кирпичи, а это уже отличное дополнение к нашему геймплею. Будет ещё лучше, если мы сможем считать количество разбитых кирпичей и присуждать за это очки.
Mozilla
© 2005- 2021 Mozilla and individual contributors. Content is available under these licenses.
\u0412\u043E\u0442 \u0438 \u0432\u0441\u0451! \u041F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0438 \u0432\u044B \u0443\u0432\u0438\u0434\u0438\u0442\u0435, \u0447\u0442\u043E \u0432\u0441\u0435 \u043A\u043E\u043B\u043B\u0438\u0437\u0438\u0438 \u043E\u0431\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u0435\u0442\u0441\u044F, \u043A\u0430\u043A \u0441\u043B\u0435\u0434\u0443\u0435\u0442.
\u0412\u044B \u0434\u0443\u043C\u0430\u043B\u0438, \u0447\u0442\u043E \u043D\u0430\u043C \u043F\u0440\u0438\u0434\u0451\u0442\u0441\u044F \u043F\u0438\u0441\u0430\u0442\u044C \u043C\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0434\u043B\u044F \u043E\u0442\u0441\u043B\u0435\u0436\u0438\u0432\u0430\u043D\u0438\u044F \u043A\u043E\u043B\u043B\u0438\u0437\u0438\u0439, \u043A\u0430\u043A \u043C\u044B \u044D\u0442\u043E \u0434\u0435\u043B\u0430\u043B\u0438 \u043D\u0430 \u0447\u0438\u0441\u0442\u043E\u043C JavaScript? \u0412 \u044D\u0442\u043E\u043C \u0438 \u043F\u0440\u0435\u043B\u0435\u0441\u0442\u044C \u0444\u0440\u0435\u0439\u043C\u0432\u043E\u0440\u043A\u043E\u0432 \u2014 \u0440\u0443\u0442\u0438\u043D\u0443 \u043E\u043D\u0438 \u0441\u0434\u0435\u043B\u0430\u044E\u0442 \u0437\u0430 \u043D\u0430\u0441, \u0430 \u043C\u044B, \u0432 \u044D\u0442\u043E \u0432\u0440\u0435\u043C\u044F, \u043C\u043E\u0436\u0435\u043C \u0441\u043E\u0441\u0440\u0435\u0434\u043E\u0442\u043E\u0447\u0438\u0442\u044C\u0441\u044F \u043D\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u044B\u0445 \u0432\u0435\u0449\u0430\u0445.
\u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u043A\u043E\u0434 \u0438\u0437 \u044D\u0442\u043E\u0433\u043E \u0443\u0440\u043E\u043A\u0430 \u0438 \u043F\u043E\u0438\u0433\u0440\u0430\u0442\u044C \u0441 \u043D\u0438\u043C, \u0447\u0442\u043E\u0431\u044B \u043B\u0443\u0447\u0448\u0435 \u043F\u043E\u043D\u044F\u0442\u044C, \u043A\u0430\u043A \u043E\u043D \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442:
\u0422\u0435\u043F\u0435\u0440\u044C \u043C\u044B \u043C\u043E\u0436\u0435\u043C \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044C \u043A\u0438\u0440\u043F\u0438\u0447\u0438, \u0430 \u044D\u0442\u043E \u0443\u0436\u0435 \u043E\u0442\u043B\u0438\u0447\u043D\u043E\u0435 \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u043A \u043D\u0430\u0448\u0435\u043C\u0443 \u0433\u0435\u0439\u043C\u043F\u043B\u0435\u044E. \u0411\u0443\u0434\u0435\u0442 \u0435\u0449\u0451 \u043B\u0443\u0447\u0448\u0435, \u0435\u0441\u043B\u0438 \u043C\u044B \u0441\u043C\u043E\u0436\u0435\u043C \u0441\u0447\u0438\u0442\u0430\u0442\u044C \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0440\u0430\u0437\u0431\u0438\u0442\u044B\u0445 \u043A\u0438\u0440\u043F\u0438\u0447\u0435\u0439 \u0438 \u043F\u0440\u0438\u0441\u0443\u0436\u0434\u0430\u0442\u044C \u0437\u0430 \u044D\u0442\u043E \u043E\u0447\u043A\u0438.
Коллизии (Collision) статического объекта для Skyrim
Создаем коллизии для статиков в Skyrim LE
Для начала следует обозначить пару моментов. Во первых, у вас в сцене должен быть 1 объект и соответственно 1 NiTriShape в NifSkope. Для объектов с большим количеством NiTriShape, данный способ не подходит. Во вторых, не советую начинать с импорта модели через Obj формат, как это показано в оригинале. В этом случае, у вас могут сбиться параметры сглаживания и выйдет не совсем то, чего вы ожидали.
Итак, начнем. Запускаем сцену с вашей моделью в 3Ds Max. У меня пусть будет стол. В начале следует его поставить в начало осей координат. для этого выбираем инструмент Move и значение осей X и Y сбрасываем на 0. Ось Z необходимо отредактировать самим, иначе начало осей координат будет находиться
посередине модели.
После этого можем экспортировать модель в Nif формат. Настойки экспорта:
Далее выделите NiTriShape, промотайте Block Detalis в самый низ и найдите вкладку Property или BSProperty. Разверните её и вместо None в первой вкладке напишите номер дефолтной ветки BSLightingShaderProperty, которая была сразу в файле.
Удалите из вкладки BSFadeNode bhkCollisionObject
Далее кликните ПКМ по модели, выберите flags, в выпадающем меню выберите Continue и нажмите Accept.
Сохраните файл. Во вкладке bhkCollisionObject будет bhkConvexVerticlesShape. Это и есть ваш коллизион. Далее зайдите в конструктор, создайте там новый объект, поместите в игру и зайдите проверить, работает ли коллизия.
Как видите, мой бомжеватый норд вполне вальяжно устроился на столике, значит коллизия в порядке.
В данном уроке мы рассмотрели, как экспортировать в игру статические объекты с адекватным отображением что текстур, что коллизий. На этом урок подошел к концу. Удачи в творчестве, до встречи.
Oblivion:Руководство по созданию коллизий для игры
В данном руководстве рассматривается создание модели в 3dsMax`e, экспорт ее в NIF и способ, с помощью которого предмет в игре TES4: Oblivion приобретает вес и реагирует на столкновения с другими предметами (коллизии). Однако позже, с выходом более совершенных экспортеров автор (gundalf) написал новое руководство по более простому экспорту модели в полноценный формат NIF, содержащий все необходимые свойства объекта, включая коллизии. Перевод этого небольшого туториала у нас на вики находится здесь.
Однако это отнюдь не умаляет ценности этого данного туториала.
Содержание
Руководство по созданию коллизий для игры TES 4: Oblivion
Прим. автора: Информация здесь несколько устарела (хотя может оказаться весьма полезной). Смотрите здесь новое руководство по экспорту коллизий.
У меня были проблемы с шаблоном, который выбрал первым (колонна дико прыгала в игре и при симуляции физики havok). Поэтому скриншоты не показывают того, что вы увидите, когда используется прикрепленный шаблон. Они должны помочь вам при работе с текстом.
Настройка Max’а и создание коллизионного меша
Создайте каркас вокруг вашей модели которая приблизительно по форме похожа на вашу модель. Сделайте ее низкополигональной (low-poly). Модификатор «Optimize» сделает большую часть работы в большинстве случаев, хотя результат может нуждаться в некоторых незначительных доводках.
Коллизионный объект должен иметь назначенный материал, который не используется другими объектами, потому что экспортер не группирует его с другими объектами. Выберите пустой материал (blank material) в редакторе материалов (material editor) и назначьте его вашему коллизионному мешу.
Создание коллизии, точно соответствующей объекту
Чтобы создать коллизию, точно соответствующей объекту, нужно использовать модификатор «bhkRigidBodyModifier». Делается это так:
Теперь модель можно спокойно добавить в игру.
Теперь загрузите прикрепленный шаблон. Затем вставьте ваш меш, кликая правой клавишей мыши на дереве и выбирая «Block->Paste Branch».
Сначала мы заменим существующую геометрию нашей. Убедитесь, что пункт «Block Details» отмечен в меню «View» (F2). Выберите корневой узел и найдите закладку «Children» в block list. Раскройте ее и двойной клик на колонке «Value». Измените существующий номер на номер блока NiNode вашего импортированного меша (номер блока указан слева от названия узла в древовидном списке).
Смотрим на данные коллизии. Найдите номер блока в ветви «NiTriStripsData» который был сгенерирован из вашего коллизионного объекта. Раскройте ветвь «bhkCollisionObject->RigidBodyT». Левый клик на узле «bhkNiTriStripsShape». Измените значение «Strips Data» в окне «Block Details» на номер блока strip data вашей коллизии.
Как вы можете видеть на скриншоте, объект havok не расположен должным способом. Выберите узел «bhkRigidBodyT» и приведите в порядок его «Translation» – изменяйте значения, выравнивая модель, чтобы исправить это.
Сейчас вам нужно определить материал, чтобы сделать камень подобным камню и т. п. Выберите узел «bhkNiTriStripsShape» и измените значение (value) «Material» в окне «Block Details».
Вы также можете назначить слой объекта (object’s Layer) выбрав узел «bhkRigidBodyT» и изменив значение «Layer» в окне «Block Details». Это изменит цвет, который будет показан в CS. Я делаю это для логичности и последовательности изложения. Вы можете увидеть список возможных значений наведением курсора мыши над колонкой «Name» в ряду «Layer».
Последний шаг, это очистка меша. Правым кликом выделите все узлы, не прикрепленные к корневому узлу, и выберите «Block->Remove Branch».
Создание моделей с коллизиями для Skyrim. Часть1. Пока без коллизии.
Добавлено: 25 Сентября 2015 в 10:39 | Обновлено:
Просмотров: 5152 | Комментарии: 13
Понравилось: 16 пользователям
Требуемые программы:
Подразумевается, что у Вас установлен 3DS Max с требуемым плагином для импорта/экспорта в формате nif и Вы умеете им пользоваться (лично у меня версия «макса» от 2012 года). Кроме того у Вас имеется программа для работы с nif файлами NifSkope (лично у меня версия 2.0.0 alpha, в ней, в отличие от более распространенной версии 1.3.3, отображаются коллизии). Ну и программа для присоединения коллизий ChunkMerge, входящая в пакет NifTools.
Рассмотрим метод на примере небольшого деревянного столика с бронзовой окантовкой столешницы. Для начала создадим в 3DS Max желаемую модель (рис.1). Объединяем все деревянные детали в один объект, соответственно все металлические в другой, так как это разные материалы и используют разные текстуры.
Экспортируем модель в формат nif, присвоив ему имя, допустим, table_.nif и смотрим на полученное в NifSkope (рис.2):
Известно, что плагин для экспорта все равно работает как-то криво в плане шейдеров. Для того, чтобы в игре все отображалось как надо, используется метод подмены шейпдаты в «родных» скайримовских моделях. Для этого нам понадобится какая-нибудь модель, вытащенная из ресурсов игры. Я обычно пользуюсь бочкой barrel01.nif.
Открываем эту бочку в еще одном окне NifSkope:
и удаляем в модели «родную» коллизию, так как мы собираемся заменить ее на свою. Для этого кликаем правой кнопкой мыши (далее ПКМ) на блоке bhkCollisionObject и выбираем в контекстном меню Block → Remove Branch (удалить всю ветку).
Примечание: как показали недавние эксперименты, удалять коллизию bhkCollisionObject вовсе не обязательно. Программа ChunkMerge ее попросту игнорирует и заменяет имеющуюся на ту, которую Вы укажете в строке Collision-File.
Затем копируем «родной» шейдер и вставляем его в эту же модель. Вы же помните, что в нашей модели два объекта из разных материалов и с разными текстурами, поэтому нам понадобится два «родных» шейдера, в которых мы подменим геометрию (шейпдату) на свои. Если в вашей модели объектов больше, то и копий шейдера понадобится больше. Для этого кликаем ПКМ на блоке с шейдером бочки, выбираем в контекстном меню Block → Copy Branch (копировать ветку) (рис.4),
затем кликаем ПКМ на «корневом» блоке модели, и выбираем Block → Paste Branch(поместить ветку) (рис.5)
Теперь, я обычно переименовываю модель и блоки по своему. Мне так удобнее, не путаюсь где что. Для этого кликаем на переименовываемом блоке и в детальном описании блока внизу кликаем ПКМ на его названии. Выбираем в контекстном меню txt Edit String Index и даем ему любое удобное для Вас имя (рис.6). В моем примере это, соответственно, Table и Kant (рис.7)
Теперь можно приступить к подмене геометрии. Для этого возвращаемся в окно NifSkope, в котором открыта Ваша модель и копируем шейпдату деревянной части стола. Развернем блок кликнув на «плюсик» блока, кликаем ПКМ на шейпдате NiTriShapeData. Выбираем в контекстном меню Block → Copy Branch (рис.8), после чего возвращаемся в окно NifSkope с моделью бочки и вставляем шейпдату в «корень» модели. Почему-то она вставляется именно в «корень», куда б не кликнул ;), но это не страшно. Вставка проста, кликаем ПКМ на «корневой» блок, выбираем в контекстном меню Block → Paste Branch (рис.9)
Как я уже сказал, шейпдата отправляется в корневой блок в самый его низ и автоматически получает номер 10. Теперь мы кликаем на блок, в котором мы хотим подменить геометрию, в данном примере Table. В детальном описании блока находим строку Data. В ней содержится номер блока, в котором прописана геометрия. Если «развернуть» блок с шейдером (клик на «плюсике»), то мы увидим, что сейчас это блок номер 3.
Двойной клик на этой строке позволит вручную прописать новый номер блока с геометрией (в нашем случае, как сказано выше, это 10). Прописываем номер 10, получаем следующее:
Как видите, блок 10 с геометрией начал отображаться на модели, а старый блок благополучно перекочевал из шейдера в «корень» и больше не виден. Та бочка, которая еще видна, это геометрия второго шейдера в нашей модели. Она еще не заменена.
Вытесненный ненужный блок номер 3 можно удалить чтобы не мешался. Кликаем по нему ПКМ и выбираем в контекстном меню Block → Remove Branch.
Аналогичную подмену проводим и для второго шейдера. В итоге получаем почти готовую модель, но с текстурами оставшимися от прошлой модели и отсутствующей коллизией.
Финальный аккорд – пропишем текстуры. Для этого разворачиваем в каждом блоке подблок с данными о текстурах BSShaderTextureSet и в детальном описании этого подблока (внизу) кликаем на строках ПКМ, выбираем в контекстном меню Texture → Choose и указываем путь к Вашим текстурам. Первая строчка это текстура, вторая – карта нормалей.
После замены текстур в обоих блоках получаем что-то вроде:
Это готовая модель, которая будет корректно отображаться в игре. Но пока она не содержит коллизий и персонажи в игре будут через нее свободно проходить. Сохраняем nif с тем именем, с которым она будет использована Вами в игре. К примеру table.nif (Save As…).
Категории
3ds Max создание коллизий вручную
При создании игр (например на движке Unreal Engine) для игровой модели необходимо создавать коллизии, конечно можно сделать коллизию автоматически при импорте в движок, но это не всегда подходит и не все программы имеют такую возможность. Поэтому в этой статье мы рассмотрим как создать коллизию вручную в программе 3ds Max.
Коллизия (с лат. collisio переводится как столкновение) — значение слова в различных областях имеет свое обозначение, но в нашем случае это физическая модель объекта определяющая его границы или придающая «осязаемости» 3д модели. Именно столкновение коллизий в играх определяет столкновение игрока со стеной, с монстром и т.д.
Имея некую 3д модель можно использовать на нее три вида коллизии это бокс, сфера и усложненная коллизия. Теперь по порядку:
Допустим у нас есть следующая 3Д модель:
Теперь меняем название объекта так чтобы вначале стояло UBX_ а далее уже имя объекта и его номер т.е. UBX_имя_объекта_1 в моем случае будет: UBX_collision_01
Моя коллизия будет иметь имя UCX_collision_03 и выглядеть вот так:
В заключение скажем что из трех видов коллизий (UBX_; USX_; UCX_) лучше использовать коллизию UBX_ так как благодаря меньшему числу граней она будет меньше потреблять ресурсов компьютера, конечно на одной двух, десяти объектах разницу Вы не заметите, но если этих объектов будет больше то соответственно разница будет очевидна.