Что такое fov в играх
Как я FOV измерил без циркуля и линейки
Во дворе мы играли в войнушку. Слабые и толстые были фашистами, остальные их побеждали. Двор и детство исчезли, а воевать хочется.
Я превратил свой iPhone в автомат, а фашистов нарисовал в дополненной реальности.
Видеозахват рисует мир вокруг моего рабочего кресла, фашисты лезут из всех щелей, я держу круговую оборону.
Стоп! А как привязать врагов к окружающей действительности?
Я сделал это очень просто.
Обработка изображения
Посмотрите на первую картинку видеозахвата.
Я пробегаю по всей ширине (480 пикселей) изображения и суммирую RGB компоненты точек, лежащих с текущей точкой на одной вертикальной прямой. Получаем массив из 480 элементов.
На верхней части рисунка изображена красно-белая (оле!) гистограмма найденной функции.
То же самое проделываем со следующим кадром из видеопотока. Посмотрите на рисунок 2.
Моя задача — совместить красно-белые гистограммы первого и второго кадра. Сдвигая графики друг относительно друга, я очень быстро нахожу оптимальное совпадение. Разница в сдвиге и есть искомое смещение реальности в моем iPhone в горизонтальном направлении.
Таким, образом виртуальный объект навсегда привязывается к реальному местоположению. В каждый момент времени мы знаем, насколько пикселов его сдвинуть в горизонтальной плоскости.
Хорошо ли работает алгоритм? Очень неплохо. Главное, не дергать телефон во время игры — данный подход не любит смещения более 40 пикселов за такт. А такт у камеры 20 кадров в секунду.
При резких движениях надо, видимо, использовать уже тяжелую артиллерию — гироскоп и акселерометр.
Что такое FOV
У меня нет такой лаборатории. А зачем? Я просто запустил вышеописанную программу. Сел на любимое вращающееся кресло. И повернулся на 360 градусов. Программа выдала размер сферы вокруг меня.
Программа выдала размер сферы вокруг меня.
В пикселах — стабильно для iPod последнего поколения 3050-3060 пикселей.
Таким образом FOV моего iPod равен 480*360/3060 = 56-57 градусов.
А лазер намерял 55.7.
Неплохая точность у меня получилась, согласитесь.
Скрытая реклама моего приложения, использующего вышесказанный алгоритм, помещена в теги. Только это между нами, ок?
Эффективный расчёт области видимости и линии взгляда в играх
В стратегических играх обычно требуется знать область видимости NPC, чтобы игрок мог продумывать стратегию и делать следующий ход. Мы рассмотрим математику и реализацию рациональной модели, не просаживающей скорость игры при большом количестве NPC на карте. Если вы хотите увидеть готовое интерактивное демо модели, перейдите сюда и играйте прямо в браузере! Вот скриншот демонстрации:
Имея параметры видимости наблюдателя (направление взгляда, расстояние видимости и угол поля зрения), нам нужно найти видимую для него область, т.е. определить область видимости (field of view, FoV). Если препятствия отсутствуют, это будет сектор круга, состоящий из двух граней (радиусов) и соединяющей их дуги (см. Рис. 1). Кроме того, имея заданную точку мира, мы должны быстро определить, видима ли она для наблюдателя, т.е. необходимо обрабатывать запросы линии взгляда (line of sight, LOS) для заданной точки. Обе эти операции можно выполнить достаточно эффективно для использования при рендеринге в реальном времени.
Рис. 1
Положение наблюдателя представлено красной точкой, стрелкой указано направление взгляда, r — это расстояние видимости, а θ — половина угла поля зрения.
1 Входные данные
Если ребро «пережило» предыдущую проверку, мы проверяем его конечные точки, чтобы определить, где они расположены. На Рис. 10 показана текущая ситуация: серые точки за наблюдателем (1), красные — за пределами сектора (2), зелёные конечные точки — внутри сектора (3), а сиреневая находится внутри ограничивающей полуокружности, но за пределами сектора (4).
Рис. 10
Угловые точки и блокирующие рёбра можно определить из результатов:
3.2 Этап сужения
На этом этапе мы избавляемся от других ложноположительных результатов с помощью более затратных проверок, чтобы повысить производительность при испускании лучей. Мы можем провести проверки пересечения ребра и дуги арки и/или ребра и ребра.
Однако перед выполнением немного затратной проверки пересечения отрезка и дуги (в ней используется квадратный корень и больше трёх операций ветвления) мы можем использовать результаты предыдущей проверки, чтобы убедиться в необходимости проверки. Проверка нужна только когда ребро имеет возможность пересечь дугу. Если обе конечные точки находятся внутри ограничивающей окружности, ребро не сможет пересечь окружность. Ребро может пересечь дугу сектора только если одна из его конечных точек находится перед наблюдателем, а другая — за пределами ограничивающей окружности (случай 2.1 в разделе 3.1.1.2).
№ | Конец А | Конец Б | Состояние |
---|---|---|---|
1 | Внутри | Внутри (2.2.1) | Угловые точки: A, Б • блокирует |
2 | Внутри | Сзади (1) | Угловая точка: A • блокирует |
3 | Внутри | В полуокружности (2.2.2) | Угловая точка: A • блокирует |
4 | Внутри | За пределами (2.1) | Угловая точка: A • блокирует • может пересекать дугу |
5 | Сзади | Сзади | Отбрасывается |
6 | Сзади | За пределами | Может пересекать дугу • может блокировать |
7 | Сзади | В полуокружности | Может блокировать |
8 | В полуокружности | В полуокружности | Может блокировать |
9 | В полуокружности | За пределами | Может пересекать дугу • может блокировать |
10 | За пределами | За пределами | Может пересекать дугу • может блокировать |
С пунктами 1, 2, 3 и 5 мы уже имели дело на этапе раннего отбрасывания и с ними ничего уже делать не нужно. Для пункта 4 требуется проверка пересечения ребра с дугой, чтобы убедиться, что не нужна дополнительная угловая точка. На раннем этапе мы уже пометили одну из его конечных точек как угловую точку, а ребро — как блокирующее. Пункты 6-10 — самые интересные на этапе сужения. Для пунктов 6, 9 и 10 нужна проверка пересечения ребра с дугой, чтобы знать, возникают ли угловые точки при пересечении. Если это так, то ребро должно быть помечено как блокирующее. Если эти пункты не проходят проверку, они присоединяются к пунктам 7 и 8. Они не могут иметь угловых точек, но всё равно должны пройти проверку пересечения ребра и ребра, чтобы знать, блокируют ли они видимость.
3.2.1 Пересечение ребра и дуги сектора
Для пунктов 4, 6, 9 и 10 Таблицы 1 мы с помощью проверки пересечения отрезка и дуги проверяем, пересекает ли ребро дугу сектора [6]. Если это так, то помечаем точки пересечения как угловые точки, а ребро — как блокирующее. Дальнейшая обработка не требуется. Если это не так, ребро не может иметь угловых точек, но ребро должно пройти следующую проверку на блокировку видимости.
В сущности, это проверка пересечения линии и окружности, результатом которой являются две точки. Точки, лежащие и на отрезке, и на дуге, считаются точками пересечения. Здесь можно внести небольшую оптимизацию: если обе точки пересечения находятся за наблюдателем, то отрезок не может блокировать видимость и иметь угловые точки, поэтому ребро можно отбросить без дальнейшей обработки.
Рис. 11
На Рис. 11 проверяется серое ребро с одной конечной точкой за пределами видимости, а другой конечной точкой — за наблюдателем, но обе точки пересечения сзади наблюдателя (сиреневые), а поэтому отбрасываются. Зелёное ребро с обеими точками в полуокружности никогда не проверяется. Красное ребро с одной конечной точкой за пределами видимости проверяется, но единственная найденная точка пересечения (синяя) не находится на дуге. Это ребро не может иметь угловых точек, но отправляется на следующий этап (проверка пересечения ребра и ребра) для проверки на блокировку. Все другие рёбра (чёрные) с одной или обеими конечными точками за пределами ограничивающей окружности, имеющие подходящие (красные) точки пересечения помечаются как блокирующие, а точки пересечения — как угловые точки Каждое такое ребро соответствует одному из пунктов 4, 6, 9 или 10 в Таблице 1.
3.2.2 Пересечение ребра и ребра сектора
Для пунктов 7 и 8, которые ни разу не проходили предыдущую проверку и для пунктов (6, 9 и 10), проходивших проверку, не обнаружившую точек пересечения, на ребре не может быть угловых точек. Обе его конечные точки не находятся внутри сектора, и на дуге не лежат новые угловые точки. Однако такие рёбра нельзя отбрасывать, потому что они всё равно могут блокировать (см. Рис. 8) или не блокировать (см. Рис. 10; ребро с сиреневой конечной точкой). У нас есть два варианта: подстраховаться и пометить их как блокирующие или для уверенности проверить их на пересечение с рёбрами сектора. Выбрав первый вариант, для каждого ложноположительного непересечения с сектором видимости мы платим проверками пересечения отрезка и отрезка n на этапе испускания лучей, потому что каждый луч проверяется на пересечение с каждой потенциально блокирующим ребром. Вместо того, чтобы расплачиваться n раз за ложноположительные результаты, лучшим вариантом будет потратить n + 2 (в худшем случае). Поэтому мы проверяем ребро на пересечение с обоими рёбрами сектора. Если ребро пересекает хотя бы одно из них, мы помечаем его как блокирующее.
Рис. 12
Для пунктов 6-10 на Рис. 12 есть два соответствующих ребра: одно положительное (зелёное), другое отрицательное (красное). Из рисунка очевидно, что эта проверка имеет большую вероятность отбрасывания рёбер, несоответствующих видимости.
4 Испускание лучей
У нас есть все угловые точки и блокирующие рёбра. Перед выполнением отслеживания лучей необходимо отсортировать угловые точки по углу, чтобы окончательная форма области видимости была правильной при соединении точек попадания рёбрами и дугами. Кроме того, если две или более угловые точки и положение наблюдателя коллинеарны, то в одном направлении будет испущено несколько лучей. Необходимо отбросить дублирующие угловые точки, чтобы избежать лишних лучей.
Для сортировки может использоваться техника. описанная в разделе 3.1.1.2: использование векторного произведения для определения того, находится ли точка внутри сектора видимости. Дублирующие угловые точки можно с лёгкостью снова обработать с помощью векторного произведения. Перед испусканием луча для каждой угловой точки он векторно умножается с предыдущим, и если результат равен нулю, то векторы линейно зависимы (параллельны), а значит, их можно игнорировать.
Первичные лучи испускаются в отсортированные угловые точки. Если мы знаем, что точка является конечной точкой ребра, а не точкой пересечения, то необходимо испустить ещё и вспомогательные лучи (подробнее см. в разделе 2.2). Вспомогательные лучи испускаются только в угловые точки, являющиеся конечными точками рёбер, и не испускаются в точки пересечения, потому что те не могут быть углами полигонов, т.е. видимость не может распространяться дальше них.
Для каждого испускаемого луча мы находим точку пересечения луча и ближайшего к нему ребра. Она становится точкой попадания луча. Если эта точка находится за пределами расстояния видимости r, то мы берём точку попадания в качестве точки вдоль луча, которая находится на расстоянии r от наблюдателя. Т.е. мы перетаскиваем точку попадания назад, пока расстояние от неё до наблюдателя не становится равным r. Мы проверяем, находится ли каждая найденная точка попадания на границе дуги. Если эта и предыдущая точка находится на границе дуги, то мы соединяем их дугой, а в противном случае — отрезком. Однако при выполнении этой задачи «вслепую» возникает небольшая проблема.
Рис. 13
На Рис. 13 точки попадания (пронумерованные справа налево) 1 и 2 находятся на дуге, и должны быть соединены дугой. То же самое в случае с точками попадания 3 и 4. Однако точки попадания 2 и 3 должны быть соединены отрезком, потому что есть ребро, пересекающее дугу. При обнаружении точки попадания 3 и подтверждении того, что она и предыдущая точка попадания находятся на дуге, перед соединением их дугой нужно проверить, параллельна ли соединяющая их линия ближайшему ребру, на котором лежит точка попадания 3. Соединить их отрезком, если они параллельны.
5 Линия взгляда
Что такое fov в играх
FOV — это поле зрения. Угловое пространство, которое видит человеческий глаз при неподвижной голове и зафиксированном взгляде. Поле зрения среднестатистического человека составляет 55° вверх, 60° вниз, 90° наружу (суммарное поле зрения двумя глазами — 180°) и 60° — внутрь. Из-за особенностей строения человеческий глаз распознает объекты трехмерными в пределах 110°, а полноцветными — в еще меньшем диапазоне. Для сравнения, после зрения некоторых птиц достигает почти 360°.
А в мониторах?
Про-геймеры уже давно игрались со значением FOV, тогда как казуальные игроки обратили внимание на поле зрения с появлением Ultrawide LG мониторов. Точнее, когда LG выпустила доступные массовому потребителю модели.
Все преимущества FOV раскрываются на широкоформатных мониторах с соотношением сторон 21:9. Линейка Ultrawide LG 2017 года целиком состоит из таких моделей, тогда как в линейке Gaming их четыре. Остальные — привычные экраны 16:9. Но всех их объединяют хорошая контрастность, углы обзора и время отклика. Разрешение тоже не отстает: от FullHD на 24 и 27-дюймовых моделях до 2560×1080 на 29/34 дюймах. А у на 38 дюймах — до 3840×1600.
Зачем это?
Мудрые геймеры предпочитают ставить угол обзора больше, чтобы на экране сразу помещалось больше информации. Обратите внимание на отзывы к играм в Steam: игроки, привыкшие к увеличенному значению FOV, часто выделяют как недостаток отсутствие ручной регулировки угла обзора — даже там, где это совершенно не нужно. Такие отзывы копятся и совершенно необоснованно занижают рейтинг игр в Steam. Это особенно фатально для инди — ведь низкий рейтинг напрямую влияет на покупки.
На Ultrawide LG мониторе поле зрения по умолчанию значительно выше. Но, к сожалению, разработчики не всех игр озадачиваются поддержкой мониторов 21:9. Владельцы таких экранов уже добавили в закладки FOV-калькулятор и в курсе значений Vert-/Hor+. Первое — обрезка изображения сверху и снизу (те самые «кинематографичные» полосы), второе — увеличение FOV, которое влечет за собой больше доступного глазу контента по ширине.
Решить проблему поддержки широкоформатных мониторов в играх может адаптивное поле обзора Vert+/Hor+. Почитать об этом методе на примере Quake можно здесь.
Ультраширокие экраны по-новому раскрывают компьютеры в работе (мультитаскеры в восторге!) и в играх. Все больше мультимедиа контента выходит под экраны такой формы, и мониторы Ultrawide LG — доступный способ приобщиться.
Где может пригодиться повышенный FOV?
В шутерах вроде Titanfall 2, Overwatch, Call of Duty и сессионных играх типа World of Tanks и PUBG. Поиск оптимального значения FOV в последней — популярная тема на фан-сайтах. С увеличенным полем зрения ощутимо легче заметить врага на периферии, ориентироваться в замкнутых пространствах, заглядывать за угол. Кроме того, не придется так активно елозить мышью, за что в напряженной схватке вы неоднократно поблагодарите новенький монитор с повышенным FOV.
Секреты FoV от авторов Witchfire
Пара слов от Kacper Domański (разработчика AI в The Astronauts), которые могут порадовать некоторых ПК-игроков.
Kacper поделился интересной инфой о разработке с внутренней кухни, и я перевёл для своего бложика его мысли про FoV (поле зрения) и как оно работает в Witchfire.
Парни из AMD подогнали «астронавтам» сверхширокий LG монитор, оказавшимся и благословением, и проклятием.
Хорошая новость в том, Witchfire в 21:9 смотрится охренительно.
FoV (поле зрения) — это характеристика с которой большинство игроков шутеров знаком. Одноимённая настройка контролирует, по сути, то, что вы видите на экране и влияет на восприятие расстояния, размера и скорости игроками.
Мы меняем FoV во время игры, уменьшая его при наведении, что создаёт эффект зума, и слегка увеличивая его при спринте и броске, чтобы создать ощущение быстрого движения. В то же время (особенно большой) FoV может деформировать объекты определённым образом и влияет на производительность, поскольку на экране появляется больше объектов.
Как раз по причине нагрузки на консолях блокируют этот параметр, чтобы обеспечить стабильный FPS. На ПК у нас обычно полный контроль над этой настройкой (в разумных пределах, безусловно).
Как может происходить деформация объектов? Например, так:
Наибольшие деформации происходят на ближайших к камере объектах — руке игрока и оружии:
Мы определённо хотим дать игрокам возможность выбрать наиболее подходящий для них вариант, но мы не тратим сотни часов на полировку вещей, которые легко поломать!
ADS in FoV 60, как надо.
Первым шагом было внесение изменений в исходный код Unreal Engine, чтобы мы могли явно выбирать, хотим ли мы рендерить какую-либо модель в FoV камеры или кастомно. Затем мы немного поэкспериментировали с углом и остановились на магическом числе 77, чтобы Jakub, аниматор всех наших пушек, мог расположить их и сделать анимации, которые в конечном итоге выглядели бы точно так же, как и в его программном обеспечении.
Затем добавили щепотку матана, чтобы вращать камеру в зависимости от положения перекрестия на экране. Это позволило модели пистолета вписаться в UI; в противном случае всё ощущались бы как-то так.
Так всё и работало…пока мы не получили этот великолепный 21:9 экран и не заметили, что рендеринг оружий сломан.
Не то чтобы это было полной катастрофой, но мы хотели сделать эту часть игры идеальной. Поэтому я и изменил нашу залоченную FoV, сделал вертикальной вместо горизонтальной, и это решило проблему раз и навсегда. Не стесняйтесь спрашивать подробности в Твиттере.
В конце концов, прямо сейчас у парней полный контроль над тем, как выглядят пушки в игре, что в итоге позволит играть так, как нам удобно:
Что такое FOV и почему из-за него страдают игры?
Посмотрите, как обрастал нюансами процесс выбора монитора: сначала была важна только диагональ — чем больше, тем лучше. Потом я и мои сверстники быстро поняли важность разрешения. Затем мы стали учитывать тип матрицы и частоту обновления — да, TN матрицы были быстрее, но цветопередача и углы обзора IPS решали. Недавно добавилась новая заморочка — FOV.
FOV — это поле зрения. Угловое пространство, которое видит человеческий глаз при неподвижной голове и зафиксированном взгляде. Поле зрения среднестатистического человека составляет 55° вверх, 60° вниз, 90° наружу (суммарное поле зрения двумя глазами — 180°) и 60° — внутрь. Из-за особенностей строения человеческий глаз распознает объекты трехмерными в пределах 110°, а полноцветными — в еще меньшем диапазоне. Для сравнения, после зрения некоторых птиц достигает почти 360°.
Значение FOV увеличивается.
Про-геймеры уже давно игрались со значением FOV, тогда как казуальные игроки обратили внимание на поле зрения с появлением Ultrawide LG мониторов. Точнее, когда LG выпустила доступные массовому потребителю модели.
Все преимущества FOV раскрываются на широкоформатных мониторах с соотношением сторон 21:9. Линейка Ultrawide LG 2017 года целиком состоит из таких моделей, тогда как в линейке Gaming их четыре. Остальные — привычные экраны 16:9. Но всех их объединяют хорошая контрастность, углы обзора и время отклика. Разрешение тоже не отстает: от FullHD на 24 и 27-дюймовых моделях до 2560×1080 на 29/34 дюймах. А у на 38 дюймах — до 3840×1600.
Когда FOV равен 360, это значит, что вы можете видеть, что у вас за спиной. Удивильно, но с таким углом обзора проще ориентироваться в помещениях.
Мудрые геймеры предпочитают ставить угол обзора больше, чтобы на экране сразу помещалось больше информации. Обратите внимание на отзывы к играм в Steam: игроки, привыкшие к увеличенному значению FOV, часто выделяют как недостаток отсутствие ручной регулировки угла обзора — даже там, где это совершенно не нужно. Такие отзывы копятся и совершенно необоснованно занижают рейтинг игр в Steam. Это особенно фатально для инди — ведь низкий рейтинг напрямую влияет на покупки.
На Ultrawide LG мониторе поле зрения по умолчанию значительно выше. Но, к сожалению, разработчики не всех игр озадачиваются поддержкой мониторов 21:9. Владельцы таких экранов уже добавили в закладки FOV-калькулятор и в курсе значений Vert-/Hor+. Первое — обрезка изображения сверху и снизу (те самые «кинематографичные» полосы), второе — увеличение FOV, которое влечет за собой больше доступного глазу контента по ширине.
Ультраширокие экраны по-новому раскрывают компьютеры в работе (мультитаскеры в восторге!) и в играх. Все больше мультимедиа контента выходит под экраны такой формы, и мониторы Ultrawide LG — доступный способ приобщиться.
Где может пригодиться повышенный FOV?
В шутерах вроде Titanfall 2, Overwatch, Call of Duty и сессионных играх типа World of Tanks и PUBG. Поиск оптимального значения FOV в последней — популярная тема на фан-сайтах. С увеличенным полем зрения ощутимо легче заметить врага на периферии, ориентироваться в замкнутых пространствах, заглядывать за угол. Кроме того, не придется так активно елозить мышью, за что в напряженной схватке вы неоднократно поблагодарите новенький монитор с повышенным FOV.
Понял, а минусы есть?
Как и у всего в этом мире, дружище. С увеличенным FOV сложнее различать и попадать во врагов на дистанции, поскольку на экране все выглядит мельче. Также повышенное поле зрения сильнее грузит компьютер, поэтому на бюджетных ПК придется повозиться с настройками в поисках «золотой середины».
Во-вторых, упомянутая выше поддержка. Пока не все игры корректно отображаются в 21:9 и дают регулировать FOV вручную. К экранам 21:9 приходят производители мониторов и даже смартфонов — это значит, что и игровая индустрия тоже скоро подтянется.
Ручная регулировка FOV — однозначный мастхэв для игр, претендующих на звание киберспорта. Да и в остальных, кроме однопользовательских со ставкой на режиссуру, можно оставить! С одной стороны, игроки имеют полное право настаивать на регулировке FOV — к хорошему быстро привыкаешь, и отказываться от этого нет ни одной объективной причины. С другой — игры, даже мультиплеерные, не становятся хуже от фиксированного угла обзора. Поэтому и массовая истерия в виде негативных отзывов на Steam — не закономерная реакция, а обыкновенный каприз.