[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "create", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-549065259", "adfox_url": "//ads.adfox.ru/228129/getCode?p1=bxeub&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid21=&puid22=&puid31=&puid32=&fmt=1&pr=" } } ]
{ "author_name": "Дмитрий Мучкин", "author_type": "self", "tags": ["\u0438\u043d\u0434\u0438"], "comments": 2, "likes": 22, "favorites": 10, "is_advertisement": false, "section_name": "gamedev", "id": "10103" }
Дмитрий Мучкин
781
Gamedev

Система управления камерой в 3D-платформере

Подход разработчика игры Suzy Cube.

Поделиться

В избранное

В избранном

Разработчик мобильной игры Suzy Cube Луис-Николас Дозоис (Louis-Nicolas Dozois) выложил в своём блоге на портале Gamasutra материал, в котором рассказал об устройстве системы управления камерой в своём проекте. Публикуем перевод.

Работа, которую я провёл над системой управления камерой в Suzy Cube, особенно важна для меня, потому что именно она была катализатором всего проекта. До этого Suzy Cube была не игрой, а экспериментальным проектом, в котором я собирался воссоздать работу камеры из Super Mario 3D Land для Nintendo 3DS.

Если вы не видели её, то это трёхмерный платформер, в котором игрок не может двигать камеру. Вместо этого камера автоматически меняет ракурс в зависимости от того, где находится главный герой, чтобы показать игроку происходящее под самым выгодным углом. Именно это сподвигло меня к созданию собственной системы.

Когда я начал работу над своей камерой, я рассчитывал, что она должна уметь делать базовые движения:

  • Поступательное — двигаться вверх, вниз или в сторону;
  • Движение по орбите — вокруг игрока, параллельно земле;
  • Движение по поперечной оси — вверх и вниз;
  • Приближение.

Чтобы добиться этого, я построил иерархию объектов. В подобных структурах при передвижении главного объекта будут двигаться и все подчинённые объекты, но передвижение подчинённого никак не повляет на главный. Таким образом, я мог построить систему, в которой какие-то действия относились ко всем объектам структуры, а какие-то — только к определённым.

Устройство камеры

Она состоит из корневого (root) объекта, которому подчинён осевой (pitch) объект, а ему подчинёна непосредственно камера. Такое устройство даёт возможность выполнять все вышеобозначенные движения камеры.

Корневой объект

Именно он следует за Сьюзи, когда ей управляет игрок. Так как это главный объект, все остальные двигаются соответствующе.

Сьюзи весьма отзывчива, и её движения могут быть быстрыми, так что позиция камеры всегда интерполируется в сторону места нахождения Сьюзи, чтобы камера передвигалась плавно.

Движение по орбите — тоже задача корневого объекта. При этом виде движения камера двигается вокруг Сьюзи параллельно земле. Как правило, корневой объект вращается только вокруг оси Y. Таким образом он всегда находится параллельно земле, и все изменения орбиты камеры влияют только на ось Y.

Использование корневого объекта как оси вращения позволяет камере двигаться по красивой дуге.

Сравните это с ситуацией, в которой позиция и вращение камеры просто интерполируются от одной точки до другой. Заметьте, как камера, двигающаяся вокруг корневого объекта, рисует красивую округлую дугу, тогда как интерполируемая камера двигается по прямой, приближаясь к Сьюзи в середине пути. Итак, корневой объект позволяет камере плавно двигаться по орбите персонажа, пока он перемещается по уровню.

Осевой объект

У осевого объекта всего одна работа — контролировать движение камеры вверх и вниз по поперечной оси. Он центрирован на корневом объекте и всегда находится в центре объектива камеры. Вращение осевого объекта по местной оси X вверх и вниз позволяет камере двигаться соответственно.

Необязательно создавать для этого целый новый объект, но такой подход позволяет избежать странных ракурсов камеры, когда у неё изменяется и высота, и орбита одновременно. Ещё одно преимущество подчинения осевого объекта коренному в том, что меняется только его положение относительно оси X.

Так как орбита камеры настраивается коренным объектом, вращение осевого объекта по оси X будет влиять только на движение камеры вверх и вниз, и не заставит её наклоняться или вращаться вокруг продольной оси из-за странной комбинации угловых данных (angular inputs) даже при интерполяции между вращениями.

Камера

И, наконец, сама камера, которая представляет собой ракурс, с которым рендерится сцена. Так как она двигается одновременно со своим главным объектом — осевым, который двигается одновременно со своим главным объектом — коренным, камеру можно двигать только вперёд и назад по местной оси Z: ближе и дальше от Сьюзи.

Несмотря на то, что камера всегда направлена на корневой объект, её можно двигать вдоль её осей X и Y. Это позволяет показывать игроку, что находится перед ним, а также выстраивать композицию. Так как эти движения делаются в местном пространстве камеры, они не будут меняться вне зависимости от настроек движения по поперечной и продольной осям.

Настройка всего этого

Как контролировать все эти движения камеры во время геймплея без участия игрока? Ответ кроется в триггерах изменения положения камеры (Camera Manipulation Trigger Volumes). Они обычно представляют собой триггербоксы, которые, когда их задевает Сьюзи, изменяют настройки камеры.

Здесь показаны все настройки камеры, которые могут быть изменены, включая способность фокусировать камеру на чём-то кроме Сьюзи, если этого требует геймплей на данном участке уровня. С помощью правильного расположения этих триггеров на уровне я всегда показываю игроку только то, что он должен увидеть.

#инди

Популярные материалы
Показать еще
{ "is_needs_advanced_access": false }

Комментарии Комм.

Популярные

По порядку

0

Прямой эфир

Узнавайте первым важные новости

Подписаться