-
123th
-
-
Вне сайта
-
Просветлённый
-
- Сообщений: 438
- Спасибо получено: 99
-
-
|
Речь пойдёт о том, каким образом представлены те или иные графические объекты - шкафы, ящики, стулья, столы... персонажи, животные и т.п.
Внимание! дальше будет жёсткое насилование мозга нудными и малопонятными объяснениями!
режиссёрская версия:
прежде чем переходить непосредственно к графическим макетам объектов надо понять чем руководствовались художники при выборе такого странного способа отображения, а это требует понимания некоторых принципов работы этих игровых движков.
и так - основной графической единицей в движках этой серии является тайл (плитка), представляющий из себя квадратное изображение фиксированного размера (например 32х32 пикселя). основная графика в игре собирается из таких плиток - местность, дома, деревья, дороги... внутренние помещения - пещеры, комнаты, мебель и прочее. конечно присутствует возможность вставлять отдельные картинки произвольного размера, но сейчас мы это не рассматриваем - движки подразумевают что основная графика будет создаваться с помощью тайлов.
тайл это также минимальная единица размера в этих графических движках. т.е. все расстояния измеряются тайлами - ширина, глубина и... высота. также стоит помнить что по умолчанию игровые персонажи могут передвигаться только по тайлам. 1 тайл это минимальный шаг персонажа - он не может шагать на половину тайла или на треть если применять стандартное решение игрового движка. а мы говорим про стандарт.
и так. как же на плоскости разбитой на квадраты изобразить объём? в голову разработчиков пришло простое решение - площадь объекта измеряется в тайлах. т.е. объект в любом случае занимает минимум 1 тайл, даже если значительно меньше по размеру. а значит самые основные объекты надо подогнать под размеры тайла - ширина человека не более ширины тайла, ширина двери, окна и т.п. также как и ширина стула, шкафа и такдалее.
тоесть нет смысла делать шкаф в полтора тайла шириной, поскольку персонаж не сможет нормально подойти к такому шкафу. это же касается и прочих объектов, поэтому их ширина или длина обычно кратна количеству тайлов - 1,2,3 и так далее.
глубина шкафов и ящиков обычно также равна 1 тайл, поскольку персонаж не может зайти за ящик на пол тайла - только на целый. так что в большинстве случаев предполагается что дно ящика квадратное и его размер равен одному тайлу. могут быть прямоугольные ящики 1х2 тайла и так далее. это конечно не обязательно но логично.
так как же от плоскости (вид сверху) перейти к объёму? в серии мейкеров используется своеобразный вид: спереди+сверху
т.е. мы одновременно видим объект строго спереди и также строго сверху. при этом высота объекта также обычно кратна тайлам. т.е. если условно шкаф метровой ширины и при этом его ширина 1 тайл, то если мы хотим сделать его двухметровой высоты - он будет занимать два тайла на отображение вида "спереди" 1 по горизонтали и 2 по вертикали.
а третий тайл, расположеный над шкафом, будет отображать его глубину - при глубине 1 метр третий тайл будет полностью заполнен верхом шкафа. но всётаки столь странные габариты выглядят своеобразно даже в такой графике и шкафы обычно имеют размеры примерно 1х1.5х0.5 тайла. тоесть тайл в ширину, полтора в высоту и пол тайла в глубину. что позволяет нарисовать шкаф вида спереди+сверху всего в два тайла (нижняя половина второго тайла занята верхней частью вида спереди, а верхняя половина второго тайла занята видом сверху) и все довольны.
почему мера высоты также составляет тайл? потому что персонаж может подняться или спуститься по лестнице ровно на 1 тайл а не на пол тайла и не на всякие там трети и 4/5. а поскольку исторически принято рисовать все объекты в первую очередь при виде "спереди" или "сбоку" - как вам удобнее, а шагает персонаж влево-вправо, вперёд-назад и вверх-вниз на одно и то же расстояние... то логическим путём пришли к выводу что никакого искажения пропорций соответственно нет
т.е. 1 шаг персонажа в любом направлении одинаков, а это значит что если персонаж высотой 2 тайла перемещается вперёд (вверх) на 1 шаг и на 1 тайл соответственно то за 1 шаг вертикального перемещения по плоской местности он проходит половину своей высоты. а значит его высота равна глубине. потому что вид местности у нас канонично строго сверху. иначе получилось бы что вперёд-назад персонаж делает шаги не соразмерные по расстоянию с шагами влево-вправо.
кстати стены также в большинстве случаев имеют ширину в 1 тайл, но могут быть и 0.5 тайла и на то есть причина.
чтобы визуально получалось что шкаф занимающий в целом 2 тайла прислонён к стене, логично что стена должна начинаться в том же тайле что и нижняя часть шкафа и быть на пол тайла дальше от переднего нижнего ребра шкафа. т.е. стык пола и стены должен проходить по середине тайла. иначе шкаф будет выглядить отстоящим на пол тайла от стены, что как то далековато...
однако канонично именно так и делают - стык между полом и стеной идёт по границе тайлов а не в середине тайла, и к такой стене "прислоняют" двухтайловый шкаф, который по законам местной графики отстоит от стены на пол тайла - очень жирные мыши могут жить за такими шкафами ^^
но как решить такую проблему тут не рассматривается.
и так мы пришли к пониманию что всё и вся отображается в весьма странной проекции - "строго спереди + строго сверху".
но если с квадратно-кубическими конструкциями проблем тут нет, то что делать с такими вещами как шары и прочие произвольно кривые чашки-ёлки?
тут есть два подхода и оба они каноничны, но! по канону шары всегда рисуются кругом а не вертикальной сосиской с полукруглыми концами, хотя опять же - можете рисовать их в строгом соответствии со шкафами. будет даже забавно.
и так. сложные геометрические объекты, персонажи и животные обычно рисуются или строго сбоку или с видом под углом около 45 градусов. их не пытаются разложить на вид спереди + вид сверху. но есть и такой вариант когда раскладывают. как это сделать - проще показать чем рассказать, поэтому в ближайшее время я добавлю картинки.
версия для зарубежного проката (на русском):
Пиксельная графика для рпг (вид сверху/сбоку):
Глава первая (вступленире):
Персонажи в таких рпг перемещаются по экрану в четырёх направлениях: вверх, вниз, влево и вправо.
Перемещение происходит не плавно - персонаж делает шаг фиксированой длинны и этот шаг является минимальной единицей перемещения. Длинна шага одинакова во всех четырёх направлениях. Игровое пространство, по которому передвигается персонаж, разбито на сетку, шаг персонажа равен одной ячейке этой сетки, тоесть за один шаг персонаж перемещается из той ячейки в которой он находится в соседнюю.
Поскольку шаг в любом из четырёх направлений имеет одинаковый размер, это определяет вид на игровой мир как "вид строго сверху" (если смотреть на игровой мир не строго сверху, а под каким-либо другим углом, перемещение в разные стороны за один шаг будет иметь разную длинну (если вы не знаете причины этого - можете спросить у родителей или преподавателей))
И так, мы установили, что в играх данного типа мы смотрим на игровой мир строго сверху, соответственно мы не можем видеть боковых поверхностей предметов, если они не наклонены так, чтобы сверху их было видно.
Например: квадратный ящик стоящий на ровном полу, мы будем видеть как его верхнюю квадратную крышку (его бока нам будут не видны), в то же время шар будет виден как его верхняя половинка, у конуса, расположенного вершиной вверх, будет видна боковая поверхность.
Но вид строго сверху не является популярным видом в играх, обычно на игровой мир мы смотрим под углом примерно 45 градусов, тоесть что-то среднее между видом строго сверху и строго сбоку.
Как же быть в том случае, если способ перемещения персонажа определяет вид как "строго сверху", а хочется, чтобы вид был "сверху/сбоку"?
Ответ прост - вид в самом буквальном смысле этого слова сделали сверху+сбоку! Тоесть мы не смотрим на предметы под некоторым углом, мы смотрим на них одновременно строго сверху и строго сбоку!
В нашей реальности мы можем увидеть предмет в таком виде, разве что разобрав его на части и положив их рядом. Например, если мы разберём ящик на дно, стенки и крышку, а потом прислоним к стене боковую стенку ящика, а над ней повесим крышку ящика, так чтобы они соприкасались, мы увидим ящик одновременно сбоку и сверху (как будто он стоит у стены (вид строго сбоку), но при этом мы также видим его крышку, причём так, как если бы смотрели на ящик строго сверху).
Такая странная игровая графика позволяет создать видимость нормального вида сбоку/сверху, тоесть под углом, в условиях фактического вида строго сверху.
С одной стороны - это гениальное решение, с другой стороны - это делает очень сложным процесс рисования элементов игрового мира, потому что требует от художника чёткого понимания как именно надо рисовать тот или иной элемент.
***
Глава вторая (трёхмерность игрового мира):
Поскольку в игре мы видим как верхнюю сторону объектов так и боковую сторону, логично предположить что в игре есть объём и игровой мир объёмен, а персонаж может перемещаться не только по плоскости, но и подниматься/опускаться, тоесть менять своё положение по высоте. Также персонаж может взаимодействовать с объектами по высоте - например он не может пройти в дверь, которая вдвое ниже него, или залезть на ящик, который вдвое выше него.
Понимание того, как осуществляется передача объёмности предметов и игрового мира в целом, при его двухмерности, необходима для понимания того, как рисовать элементы игрового мира.
Разберёмся с трёхмерностью на примере простого куба:
Разместим в игровом мире куб, каждая сторона которого будет равна одному шагу персонажа (поскольку шаг персонажа это эталонная единица измерения расстояния в таких играх).
И так, низ куба представляет собой квадрат, занимающий одну ячейку в сетке, по которой перемещается персонаж. Соответственно, чтобы обойти куб, персонаж должен сделать один шаг в сторону, после чего продолжить движение.
Пока мы видим на полу квадрат, обозначающий нижнюю сторону куба, мы понимаем какую именно ячейку занимает куб. Соответственно, мы знаем как его обойти.
Но как нам понять что это куб? как понять что это не просто кусок пола другого цвета, а что тут находится объект, имеющий достаточно большую высоту, и препятствующий прямому движению через эту ячейку?
Всё просто - мы должны нарисовать не нижнюю сторону куба, а его переднюю (повёрнутую к нам) боковую сторону и его верхнюю сторону. Поскольку именно так в игре отображаются объекты.
Но где расположить соответствующие стороны куба и какого размера они должны быть?
Тут всё также просто. Высота объекта, ширина объекта и его глубина в игре имеют одинаковый размер.
Тоесть, все стороны куба будут выглядеть как квадраты и все будут одинакового размера.
Передняя сторона куба (та, которой он развёрнут к нам) соединяется с ближним к нам (тоесть с нижним) ребром его нижней грани. Если, исходя из этого, разместить в игровом мире переднюю сторону куба, она полностью закроет собой ту ячейку, в которой находится его нижняя сторона.
В ячейку, которая располагается над ней, мы поместим верхнюю сторону куба. Таким образом куб занимает в игре две квадратные ячейки.
Но верхняя ячейка на самом деле свободна - она просто показывает верх куба, но сам куб там не находится. Персонаж может занять эту ячейку, зайдя таким образом за куб. Если персонаж равен по высоте кубу или ниже куба, куб полностью скроет от нас персонажа, если персонаж выше куба, верхняя часть куба закроет от нас часть персонажа, а выше будет нарисована оставшаяся часть персонажа. Например, если персонаж имеет высоту 2 шага (тоесть он вдвое выше куба), то верхняя часть куба закроет от нас ноги персонажа, начиная примерно с пояса.
Что делать если мы поставим на первый куб ещё один куб?
Выглядеть в игре это будет так: Квадрат обозначающий переднюю стенку куба, над ним ещё один квадрат обозначающий переднюю стенку куба, и над ним квадрат, обозначающий верхнюю часть куба.
Как понять что куб занимает одну ячейку на поверхности а не две и не три?
Верхняя часть куба говорит нам о том, сколько ячеек он занимает. Также шкаф, имеющий 2 шага в высоту, 1 шаг в ширину и 1 шаг в глубину, будет показан как вертикальный прямоугольник, занимающий две ячейки (передняя сторона шкафа) и над ним квадрат, занимающий одну ячейку (верх шкафа). Именно по верхней стороне мы понимаем что объект занимает 1 ячейку в глубину.
Исключением является случай, когда объект имеет сложную форму или за ним стоит второй объект.
Например мы поставили три куба: первый, за ним второй, а третий мы поставили на первый, поэтому второй куб за ними не виден. В таком случае, при попытке пройти за двумя стоящими друг на друге кубами, персонаж упрётся в препятствие, а игрок не будет понимать в чём дело, поскольку он не может видеть тот куб, в который упёрся персонаж. (поскольку в игре нельзя заглянуть за предмет, игроку останется только гадать по какой причине персонаж не может пройти за предметом (обойти предмет сзади)).
Высота предметов относительно друг друга:
До этого все предметы и персонаж располагались у нас на одной плоскости - на уровне пола.
Теперь представим что пол имеет ступеньку, высота которой равна 1 шаг.
Пусть левая часть пола будет ниже, а правая выше.
Если мы приставим куб к этой ступеньке (поставим его на левую часть пола, так чтобы в следующей клетке начиналась правая часть пола), то персонаж стоящий на верхнем уровне (правая сторона), сможет зайти на верхнюю часть куба, а персонаж стоящий на нижнем уровне (левая сторона), двигаясь по той же прямой, окажется за кубом.
Как бы странно это ни было, но находясь на одной высоте на экране, они находятся при этом на разной высоте в игровом мире.
При перепаде высоты, равном 1 шагу, плоскость игрового мира сдвигается на 1 ячейку (при подъёме на 1 ячейку вверх, при спуске на 1 ячейку вниз).
Это хорошо видно на том же кубе: его верхняя сторона, занимает ту же ячейку что и нижняя, но поскольку она поднята ровно на 1 шаг вверх, она находится на 1 ячейку выше.
Это нужно знать для того, чтобы понимать как правильно нарисовать предметы имеющие высоту больше одной ячейки, особенно предметы, которые имеют высоту 2 и более ячеек и на разной высоте имеют разную ширину или глубину (например деревья - они тоньше у земли, потому что там идёт только голый ствол, потом идёт широкая крона, потом верхушка; или если надо нарисовать высокий шпиль крыши башни - надо понимать как он будет выглядеть).
дополнение:
для разворота предмета - разверните его "вид сверху" в плоскости как вам надо и дорисуйте вниз сам предмет.
|