Hor+vert+ FOV, или адаптивное поле обзора



Привет всем!

Сегодня, когда я тестировал свой порт Quake на планшете, я заметил, что в портретной ориентации смотреть демки не очень приятно из-за узкого поля обзора.

Поэтому я решил придумать очень простой, но выглядящий хорошо (по моему мнению) как в портретной, так и в пейзажной ориентации, способ, как это исправить.

И назвал я это Hor+vert+ FOV.


В чём была проблема


Так как у моего десктопа широкоформатный монитор, я изначально решил использовать Hor+ FOV вместо Vert-, несмотря на то, что в Quake используется Vert-, поскольку казалось, что я смотрю на мир через увеличительное стекло.

Quake с Vert- FOV на широкоформатном мониторе.


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

Quake с Hor+ FOV в портретной ориентации.


Решение


А решение оказалось простейшим.

Вместо того, чтобы использовать какой-либо из двух типов FOV, я решил совместить эти два типа.

Так как Quake был разработан для мониторов с соотношением сторон 4:3, я стал использовать это соотношение как базовое для переключения между двумя режимами.

Если соотношение сторон больше 4:3 (экран широкий) — используется Hor+.
Если соотношение сторон меньше или равно 4:3 (экран узкий или близок к квадратному) — используется Vert-.


Но так как задачей было подогнать FOV под узкие экраны, то это значит, что чем уже экран, тем больше должно быть видно. Поэтому для нас Vert- фактически превратился в Vert+.

Реализация такого способа занимает одну-единственную проверку на условие.

Приведу весь код реализации данного способа из WebQuake.
if ((vrect.width * 0.75) <= vrect.height)
{
	R.refdef.fov_x = SCR.fov.value;
	R.refdef.fov_y = Math.atan(vrect.height / (vrect.width / Math.tan(SCR.fov.value * Math.PI / 360.0))) * 360.0 / Math.PI;
}
else
{
	R.refdef.fov_x = Math.atan(vrect.width / (vrect.height / Math.tan(SCR.fov.value * 0.82 * Math.PI / 360.0))) * 360.0 / Math.PI;
	R.refdef.fov_y = SCR.fov.value * 0.82;
}


Пояснение:
  • SCR.fov — консольная переменная, обозначающая горизонтальный FOV при соотношении сторон 4:3 (идеальном соотношении сторон для Quake).
  • Если соотношение сторон меньше или равно 4:3, используем Vert+. Если нет, используем Vert-.
  • В случае с Vert+, берем горизонтальный FOV из консольной переменной, а вертикальный — рассчитываем по известному алгоритму.
  • В случае с Hor+, берем вертикальный FOV из консольной переменной, а горизонтальный — рассчитываем.
  • 0.82 — отношение вертикального FOV к горизонтальному при соотношении 4:3. Чтобы получить вертикальный FOV из консольной переменной, умножаем значение переменной на эту константу.


Что из этого получилось:
Пейзажная ориентация — используется Hor+.

Портретная ориентация — используется Vert+.


Как вы видите, и приближения здесь нет, и обзор хороший.

Но есть одна маленькая проблема.

Ошибка и её решение


Как видно из предыдущего скриншота, модель оружия находится слишком далеко от игрока.

Данная проблема присутствует только в том случае, когда используется Vert+ — в Hor+ такой эффект не наблюдается.

Так как модель оружия в Quake рисуется отдельно от остальных моделей, ничто не мешает нам переключиться с Vert+ на Hor+ перед тем, как рисовать оружие, а после этого — обратно.

Мир рисуется в Vert+, а оружие — в Hor+.


Ошибка исправлена.

Итог и заключение


В итоге получилось так, как на первом скриншоте в этом посте.



Может быть, данная техника и не нова (хотя я пока ещё не встречал ни одной игры, использующей что-то подобное), но она имеет большое значение. Использование адаптивного FOV очень важно в эпоху веб-приложений и мобильных устройств, так как окно браузера может иметь любую прямоугольную форму, а смартфоны и планшеты работают как в горизонтальной, так и в вертикальной ориентации.

Спасибо за прочтение.
Share post

Comments 31

    +1
    Меня другое больше заинтересовало: что это за порт моего любимого первого Quake в барузер? Как работает, движок рисует на canvas?
      +9
      Порт мой, надеюсь, что выпущу через 1-2 месяца. Работает через WebGL, за исключением фоновой картинки и таблички «loading».
        +1
        Это порт NQ или QuakeWorld? А играть через такой веб-клиент можно будет или он больше предназначен для просмотра демок? Или, быть может, вы планируете запустить что-то глобальное, типа Quake Live (который сделан из Q3A)?
          +1
          NQ. Играть можно, синглплеер уже работает. Насчёт глобального, я думаю над этим. Возможно, запущу сайт с браузером серверов, базой модов, демок и скриншотов.
            +1
            Если глобально — лучше всё-таки QW, там много игроков, серверов, есть спрос так сказать.
              +1
              В QuakeWorld из QuakeC-кода игры полностью вырезана одиночная игра, а если использовать progs.dat от обычного Quake, придётся подгонять под него код движка, и получится не QuakeWorld, а какая-то страшная смесь. Из QuakeWorld я взял только RCON, поскольку listen-сервер через WebSockets в браузере сделать невозможно, и реализовать RCON очень просто (даже через XMLHttpRequest).
                0
                готов потестировать, если нужно.
                0
                Вот бета (только одиночная игра): github.com/SiPlus/WebQuake
            0
            Вы переписали Quake на JS или портируете с помощью Emscripten?
              +13
              Переписываю.
                0
                будет ведь open source? ^___^
                  0
                  С блекджекомаг репортами и путанамилл реквестами.
            +1
            Уже не первая попытка портировать первую «кваку» в браузер:
            flashok.ru/igrat-online/211-quake/
            0
            Не по поводу реализации, а к самой идее. Use-case выглядит странным — даже если делается тонкая настройка для fov-а, например, при смене оружия, это обычно делается через зум. Т.е. смена fov-а в такой ситуации выглядит неестественно и неожиданно.
              0
              Это не для зума, а для того, чтобы в нормальном состоянии был приемлемый угол обзора в обеих ориентациях экрана.
                –1
                Ну, может для планшета это и не так принципиально, но вообще, угол обзора скорее определяет механику управления движением, а не внешний вид, т.е. вы улучшается зрительное восприятие, но снижаете общее качество ощущений от игры. И если смена картинки является приемлемой и иногда встречается, то смену fov-а в процессе игры я никогда в конфигах не встречал.
                  +1
                  Ну не знаю насчёт общего качества ощущений. Лично мне неудобно играть, когда видишь только то, что прямо впереди тебя.

                  В данном случае имеется в виду автоматическая смена FOV во время игры в зависимости от пропорций экрана, в конфигах задаётся только базовый угол обзора для 4:3.
                +1
                Я бы делал так:
                — по умолчанию — настройки такие, как у автора (это действительно отличная идея)
                — в опциях можно настроить FOV для каждого режима отдельно, для гурманов
                  +2
                  … и привязать макрос рокетджампа к встряхиванию планшета =)
                    +4
                    bind TABLET_THROW disconnect
                    +4
                    Для гурманов есть консоль.
                    bind z "fov угол_для_альбомного_режима"
                    bind x "fov угол_для_портретного_режима"
                      0
                      Вообще, отдельная настройка FOV для каждого режима немного противоречит задумке. Суть этой идеи в том, чтобы переключение между режимами было плавным, чтобы когда мы сужаем окно браузера, сначала сужался обзор по горизонтали, а затем расширялся обзор по вертикали.
                        0
                        В дополнительные настройки или консоль можно вынести место, на котором будет производиться переход: либо соотношение сторон, либо минимальный горизонтальный или вертикальный угол.

                        Загромождать этим обычные настройки не вижу смысла — не такая большая важность для игрока.
                      +3
                      dump.bitcheese.net/files/avoxyzo/quake-demo.html
                      Елозить стрелочками, стрелять пробелом. Текстурки не портировал
                        0
                        ЧТО ЭТО???
                        А оно и должно быть таким фиолетовым?
                          +1
                          Это не quake а wolf3d какой-то.в EGA режиме.
                          +1
                          Я не особо разбираюсь в разработке игр, что бы сказать, что то технически по этому поводу. Но зачем пользоватерю на планшете играть в шутер в портретном режиме? Боюсь спрасить как управлять всем этим делом надо будет. Проще просто ставить на паузу и просить игрока вернуться в ландшафтный режим.
                            0
                            А чего картинки такие тёмные-то?
                              +6
                              Ну первый Квейк никогда не был особо светлой игрой
                              0
                              По-моему играть в портретной ориентации все равно никто не станет, мазохизм какой-то.
                              • UFO just landed and posted this here

                              Only users with full accounts can post comments. Log in, please.