- PVSM.RU - https://www.pvsm.ru -

3D-режим в Diablo 2

Это перевод поста Don't Starve, Diablo — Parallax 7 из блога Simon Schreibt от 25 февраля 2014 года.
Осторожно, тяжелые гифки.

В 90-х игры начали свое движение от 2D к 3D. Если бы НЛО тогда посетило землю, пришельцы решили бы, что используемые в то время низкополигональные модели без всякой фильтрации никому не нужны, и уничтожили бы Землю.

Со временем они, конечно, научились бы тому, что делало людей особенными: даже в эру 2D у них было невероятное желание рендерить в 3D, даже при том, что тогда это было просто невозможно! Все началось с реализации эффекта параллакса (в зависимости от «дистанции» некоторые элементы двигались быстрее других). Этот эффект параллакса взорвал людям мозг [1] еще в 1982 году:

3D режим в Diablo 2
Игра: Moon Patrol [2] источник: YouTube [3]

Действительно, интересно, что несколько плоскостей, двигающихся по-разному, создают такой впечатляющий эффект. Но выглядит немного плоско, да? Перспективная камера над поверхностью земли выглядела бы лучше, но это невозможно сделать без применения «настоящего» 3D? Ок, воспользуемся машиной времени и переместимся в SNES-эру:

3D режим в Diablo 2
Игра: Moon Patrol [2] источник: YouTube [4]

Выглядит как 3D, но это не 3D! Это технология SNES [5] под названием “Mode 7 [6]”. Для ее визуализации Nintendo манипулировала текстурами (уменьшая высоту в пользу глубины) при помощи некой программистской магии. Вот слова человека, который знает, как ее применять (он говорит о Gameboy Advance [7], но, насколько я знаю, для SNES рецепт тоже подходит):

«У GBA нет никаких аппаратных возможностей рендерить 3D, но можно его подделать, если по-умному управлять масштабом и переходами REG_BGxX-REG_BGxPD для каждой линии», Cearn [8]

Кстати, даже сегодня некоторые люди сходят с ума по Mode 7 и используют его для проектов [9] с RPG Maker [10]. Впечатляет!
Сегодня можно рендерить каждый ресурс в «настоящем» 3D чтобы придать объем, но существуют примеры, где это просто не нужно. Фактически, иногда даже лучше использовать олдскул:

3D режим в Diablo 2
Источник: Don't Starve [11]

Все кусты, деревья и враги в Don’t starve плоские. Мне кажется, выглядит круто!
Для меня Diablo 2 (2D ARPG 2000-го года) была первой игрой, которая совместила параллакс-эффект из Moon Patrol и что-то подобное подходу Mode 7.
Давайте посмотрим на игру со стандартными настройками. Чистый 2D. Никакой перспективы. Никакого параллакса:

3D режим в Diablo 2
Источник: Diablo 2 [12]

Но у игры был «Режим перспективы». Давайте его включим! Обратите внимание, колья закрывают разные пиксели на земле в разное время:

3D режим в Diablo 2

Выглядит как Don’t Starve, но помните: Diablo 2 – 2D игра! Официальной информации об этом режиме не было. Все, что вы сейчас читаете, стало известно благодаря отличным инструментам/документации Тома Амиго [13] и Пола Симари [14]. Отдельное спасибо Полу за то, что он ответил на все мои вопросы и во многом меня поддержал.

Может показаться, что программисты Blizzard всего лишь каким-то образом двигали спрайты, но если сравнить игру с включенным режимом перспективы и выключенным, и при этом не передвигаться, то станет заметно, что они, по сути, сдвигали все относительно линии горизонта.

3D режим в Diablo 2

Если заменить текстуру земли прекрасной шахматной текстурой, видно даже лучше:

3D режим в Diablo 2

В смысле, подумайте вот о чем: каждый ресурс в сцене нужно было каким-то образом трансформировать, чтобы он выглядел перспективно без щелей у границ спрайта. Тем более учитывая количество спрайтов в сцене (шанс получить щели был достаточно велик…):

3D режим в Diablo 2
3D режим в Diablo 2

При этом код игры не должен был быть слишком запутанным! Так что, пожалуйста, имейте в виду, что в Blizzard подразделяли спрайты на кусочки размером 32х32px [15]. Загружать только те части картинки, которые необходимы – выглядит как оптимизация. Плюс ко всему, это становится полезно, когда необходимо применить трансформацию. Смотрите, как подразделяются спрайты в игре:

3D режим в Diablo 2
Источник: D1 format by Paul Simary [15]

Я нарисовал на прозрачной текстуре линии через каждые 32px, чтобы показать ложную сетку. Результат превзошел мои ожидания! Как показывают вертикальные линии, у спрайта есть «настоящая» исчезающая точка глубоко в земле (чего вы могли ожидать от перспективы):

3D режим в Diablo 2

Однако я не знаю, почему нижний край так выгнут. Для перспективы это не нужно (ниже есть сцена из 3ds Max, показывающая, что, если камера не вращается вокруг своей оси, то горизонтальные линии остаются прямыми):

3D режим в Diablo 2

В любом случае, волшебники из компании Blizzard знают, зачем они это сделали. Может, это ничего и не стоит, но такая деформация зависит от «угла», под которым вы смотрите на спрайт (позиции игрока/камеры). Смотрите, как нижний край выпрямляется:

3D режим в Diablo 2

Вот скриншот для тех, кому интересно искажение шахматной текстуры:

3D режим в Diablo 2

Если вы думаете, что это все достаточно интересно, то читайте дальше и очумейте. Пол пишет [15], что спрайты могут иметь некое значение ориентации. В зависимости от этого значения спрайты искажаются по-разному (да… еще сложнее)! Вот пример: у стены есть направления (Левый край, верхний край, левый нижний край, и т.д.)

3D режим в Diablo 2
Источник: DT1 format by Paul Siramy [15]

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

3D режим в Diablo 2

Как видно, трансформация в моем представлении слегка запутанная. Давайте посмотрим, как это на самом деле сделано в игре:

3D режим в Diablo 2

Этот спрайт ориентирован иначе, чем в примере, который я упомянул раньше. Смотрите, деформация совсем другая! Верхняя и нижняя границы уже не сгибаются, вместо этого они как бы «смотрят» на исчезающую точку слева. Снова обратимся к примеру как это выглядит в 3ds Max:

3D режим в Diablo 2

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

3D режим в Diablo 2

Следующий пример показывает, насколько важно значение ориентации у спрайтов. Если просто сказать игре: «это не левая стена, а правая», наступает время щелей:

3D режим в Diablo 2

Этот режим можно было активировать только в полноэкранном режиме с D3D (Diablo 2 так же поддерживал режимы Glide и Программное ускорение), что заставило меня попытаться разобраться со старой документацией по DirectX, безуспешно.

Таким образом… здесь заканчивается наше путешествие и я надеюсь, что вы впечатлились этим примером жажды заставить 2D выглядеть, как 3D так же, как и я. Недостаток официальной информации и отсутствие официальных заявлений по этому поводу (посмотрите на сайте правительства, там нет ничего на тему «Режим перспективы в Diablo 2») подвел меня к неизбежному выводу:

Это все технологии пришельцев!

Использовавшиеся инструменты:

  • MPQ Editor [13] (для извлечения DT1 файлов из MPQ) by Tom Amigo
  • DT1 Tools [16] (для извлечения PCX файлов из DT1) by Paul Simary
  • DT1 Tutorial [15] (для понимания формата DT1) by Paul Simary
  • GIMP [17] (для редактирования/сохранения файлов PCX)
  • Diablo 2 Map Editor [18](для понимания карт D2) by Paul Simary

Спасибо Гансу Вурсту за эту замечательную статью [19] об искажениях изображений, все это выглядит почти как Diablo 2 (с включенным режимом перспективы). Не знаю, может быть, программисты D2 использовали именно эту информацию, но выглядит она очень знакомо.

Автор: john_samilin

Источник [20]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/animatsiya-i-3d-grafika/69011

Ссылки в тексте:

[1] мозг: http://www.braintools.ru

[2] Moon Patrol: http://en.wikipedia.org/wiki/Moon_Patrol

[3] YouTube: http://www.youtube.com/watch?v=HBOKWCpwGfM

[4] YouTube: http://www.youtube.com/watch?v=sqkQr89wcTc

[5] SNES: https://ru.wikipedia.org/wiki/Super_Nintendo_Entertainment_System

[6] Mode 7: https://ru.wikipedia.org/wiki/Mode_7

[7] Gameboy Advance: https://ru.wikipedia.org/wiki/Game_Boy_Advance

[8] Cearn: http://www.coranac.com/tonc/text/mode7.htm

[9] проектов: http://www.youtube.com/watch?v=BO_GZzrdE9Y

[10] RPG Maker: https://www.google.ru/search?q=rpg+maker

[11] Don't Starve: http://www.dontstarvegame.com/

[12] Diablo 2: http://us.blizzard.com/en-us/games/d2/

[13] Тома Амиго: http://www.angelfire.com/sc/mpq/

[14] Пола Симари: http://paul.siramy.free.fr/

[15] кусочки размером 32х32px: http://paul.siramy.free.fr/_divers/dt1_doc/

[16] DT1 Tools: http://paul.siramy.free.fr/_divers/dt1/DT1%20Tools.zip

[17] GIMP: http://www.gimp.org/

[18] Diablo 2 Map Editor : http://paul.siramy.free.fr/_divers/ds1/doc/index.html

[19] эту замечательную статью: http://toothwalker.org/optics/distortion.html

[20] Источник: http://habrahabr.ru/post/235735/