Задать вопрос
Persey14
@Persey14
Будущий геимдизайнер-программист Изучаю Unity и C#

Как реализованы порталы в игре Portal?

Как реализованы порталы в игре Portal? Как их реализовать например на движке Unity(или на любом другом движке)?
  • Вопрос задан
  • 3858 просмотров
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 6
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Честные порталы делать очень сложно, нужно хорошо понимать физику и весь пайплайн рендера. Есть очень много граничных случаев, каждый из которых нужно отдельно поддерживать: портал внутри портала, пересечение границ внутреннего и внешнего портала, несколько внутренних порталов, повороты плоскости портала, перемещение предметов, тени и освещение, прозрачные материалы и т. п. Есть две основные техники реализации отрисовки порталов: через рендер текстуры и стенсильный буфер.

Порталы на рендер текстурах делаются проще, но они дороже по производительности, даже на простой геометрии несколько порталов могут оказаться непосильной задачей для компьютера. Основной принцип следующий: когда вы смотрите на портал, на другой стороне портала камера рисует картинку в текстуру, эта текстура натягивается на плоскую геометрию, и со стороны кажется, будто бы через дырку видно другую часть сцены. Примитивную реализацию такой схемы можно собрать руками в редакторе, но дальше начинаются сложности. Если у конечного портала "за спиной" будет геометрия, она попадёт во вьюпорт камеры и будет странно смотреться. Чтобы это предотвратить нужно ближнюю плоскость отсечения у камеры сдвигать в плоскость портала с помощью CalculateObliqueMatrix. Для вычисления положения камеры и пересчёта матрицы есть удобный колбэк OnRenderObject. После корректировки матрицы порталы будут смотреться более-менее корректно, но будут всплывать всевозможные косяки при перемещении через плоскость портала из-за буфера глубины и nearClipPlane основной камеры.

Стенсильные порталы будут работать сильно быстрее, но для их реализации нужно хорошо шарить в шейдерах. Расписывать их работу подробно не буду, в целом они делаются точно так же, только трюки с рендер текстурами заменяются на трюки с буферами, предлагаю лучше почитать пару полезных статей на тему: раз и два. В контексте юнити всё немного сложнее, чем на чистом OpenGL, потому что нет прямого доступа ко всем буферам и для получения похожего результата придётся немного поизвращаться. Потенциально облегчить задачу может низкоуровневое API, но у меня не получилось добиться хороших результатов без потери качества картинки. Я возлагаю большие надежды на ScriptableRenderLoop, если судить по документации, это как раз то, что нужно.

Прошу заметить, что всё вышесказанное касается чисто графической части, для простейшего случая, когда мы имеем FPS камеру без анимаций, без дополнительных механик, которая просто ездит по уровню и может заглядывать в порталы. Что уж говорить про миллион потенциальных багов, если вы захотите включить рядом с порталом систему частиц или взять в руки кубик. Посему советую либо купить плагин и довольствоваться тем, что он умеет, либо приготовиться потратить несколько месяцев на разработку своей портальной системы. И в том и другом случае ограничения движка не позволят вам в разумные сроки получить Portal, в лучшем случае это будет Narbacular Drop.
Ответ написан
Комментировать
TheTalion
@TheTalion
При выстреле портала, создаем игровой объект с материалом камеры (доступно в платной юньке), которая находится на другом портале. Таким образом видим из порталов вид из другого порталов, после входа в портал просто изменяем позицию игрока на позицию портала.
Ответ написан
@KickMicro
ну с телепортацией по тригеру наверное все ясно, а изображение в портале, это наверное на одном стоит камера, а другой выводит изображение той камеры, и чтоб окончательно приблизиться к результату, можно поворачивать камеру на одном портале относительно положения игрока к другому порталу, чтобы подойдя к краю портала можно было увидеть что с краю у другого портала.
Ответ написан
@GreatRash
Ответ написан
Комментировать
@koronabora
Человек
1) Изображение портала - это рендер в текстуру с камеры которая висит в середине другого портала.
2) При коллизии модели игрока с порталом - спавним копию во втором портале. Ту модель из двух, которая оказывается с обратной стороны портала (за порталом или внутри) - убиваем. Камеру вешаем к оставшейся модели.
3) Вопросы коллизий и отбрасывания граней моделей при просмотре с камеры внутри портала решать также нужно в каждом конкретном случае.
Как-то так.
Ответ написан
Комментировать
@DowowTeam
Поиграйте в первый Portal с комментариями разработчиков
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы