Подтвердить что ты не робот

Как 3D-игра может отобразить объект без спрайта для каждого отдельного угла?

При обучении программированию простых 2D-игр каждый объект будет иметь лист спрайтов с небольшими изображениями того, как игрок будет смотреть в каждом кадре/анимации. 3D-модели, похоже, не работают таким образом, или нам понадобится одно изображение для каждого возможного вида объекта!

Например, для вращающегося куба потребуется много изображений, изображающих, как он будет выглядеть на каждой стороне. Итак, мой вопрос: как 3D-модели "изображения" представлены и отображаются двигателем при просмотре с произвольных точек зрения?

4b9b3361

Ответ 1

Несколько методов

Существует несколько способов рендеринга и хранения 3D-графики и моделей. Существуют даже различные методы для рендеринга 2D-графики! В дополнение к 2D растровым изображениям вы также имеете SVG. SVG использует числа для определения точек в изображении. Эти точки создают фигуры. Точки также могут определять кривые. Это позволяет делать изображения без необходимости в пикселях. Результатом могут быть меньшие размеры файлов, а также возможность преобразования изображения (масштабирование и поворот) без искажения. В большинстве 3D-графиков используется аналогичная техника, за исключением 3D. Вместе с тем, что эти методы имеют общее значение, все они в конечном итоге предоставляют данные для 2D-сетки пикселей.

Проекция

Наиболее распространенным методом рендеринга 3D-моделей является projection. Все фигуры, которые будут отображаться, разбиваются на треугольники перед рендерингом. Почему треугольники? Потому что треугольники гарантированно будут копланарными. Это экономит много работы для рендеринга, поскольку ему не нужно беспокоиться о "раскраске вне линий". Один из недостатков этого заключается в том, что большинство технологий 3D-графики не поддерживают идеальные сферы или другие круглые поверхности. Вы должны использовать приближения и другие трюки для создания круглых поверхностей (хотя есть некоторые рендереры, которые поддерживают круглые поверхности). Следующий шаг - преобразовать или проецировать все 3D-точки на двумерные точки на экране (как показано ниже).

Изображение, демонстрирующее прогноз

Оттуда вы по существу "окрашиваете" треугольники, чтобы все выглядело сплошным. Хотя это довольно быстро, еще один недостаток заключается в том, что у вас не может быть таких вещей, как отражения и рефракции. Каждый раз, когда вы видите преломляющую или отражающую поверхность в игре, они используют только обман, чтобы сделать его похожим на отражающий или преломляющий материал. То же самое касается освещения и затенения.

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

Изображение гладкого затенения

Трассировка лучей

Вы также можете отображать полигоны с помощью трассировки лучей. С помощью этого метода вы в основном отслеживаете пути, которые свет принимает для достижения камеры. Это позволяет делать реалистичные отражения и преломления. Тем не менее, я не буду вдаваться в подробности, поскольку он слишком медленный, чтобы реально использовать в играх в настоящее время. Он в основном используется для 3D-анимаций (например, что делает Pixar). Простые сцены с настройками низкого качества могут быть прослежены довольно быстро. Но со сложными реалистичными сценами рендеринг может занять несколько часов для одного кадра (как в случае с фильмами Pixar). Однако он создает сверхреалистичные изображения:

Изображение сцены с трассировкой лучей

Литье под давлением

Ray casting не следует путать с вышеупомянутой трассировкой лучей. Рэй-кастинг не прослеживает пути света. Это означает, что у вас есть только плоские поверхности; не отражает. Он также не создает реалистичного света. Однако это можно сделать относительно быстро, так как в большинстве случаев вам даже не нужно бросать луч для каждого пикселя. Это метод, который использовался для ранних игр, таких как Doom и Wolfenstein 3D. В ранних играх для карт использовалось лучевое кастинг, а персонажи и другие предметы были визуализированы с использованием 2D спрайтов, которые всегда были обращены к камере. Спринты были сделаны из нескольких разных углов, чтобы заставить их выглядеть 3D. Вот изображение Wolfenstein 3D:

Изображение Wolfenstein3D (Javascript clone)
Замок Вольфенштейн с помощью JavaScript и HTML5 Canvas: Изображение Мартина Клима

Сохранение данных

3D-данные могут храниться с использованием нескольких методов. Это не обязательно зависит от используемого метода рендеринга. Сохраненные данные ничего не означают сами по себе, поэтому вы должны сделать это, используя один из методов, о которых уже упоминалось.

Полигоны

Это похоже на SVG. Это также самый распространенный метод хранения данных модели. Вы определяете геометрию с помощью трехмерных точек. Эти точки могут иметь другие свойства, такие как данные текстуры (в форме UV-отображения), данные о цвете и все, что вам может понадобиться.

Данные можно сохранить с помощью нескольких форматов файлов. Обычный формат файла, который используется, COLLADA, который является XML файлом, в котором хранятся 3D-данные. Однако есть много других форматов. В принципе, однако, все форматы файлов все еще сохраняют 3D-данные.

Вот пример модели многоугольника:

Изображение модели многоугольника

Воксели

Этот метод довольно прост. Вы можете придумать voxel models, как растровые изображения, за исключением того, что они представляют собой кучу растровых изображений, сложенных вместе, чтобы создавать 3D-растровые изображения. Таким образом, у вас есть 3D-сетка пикселей. Одним из способов рендеринга вокселов является преобразование воксельных точек в 3D-кубы. Обратите внимание, что вокселы не должны отображаться как кубы. Как и пиксели, они представляют собой только точки, которые могут иметь цветовые данные, которые могут быть интерпретированы по-разному. Я не буду вдаваться в подробности, поскольку это не слишком часто, и вы обычно визуализируете вокселы с помощью методов многоугольника (например, когда вы представляете их как кубы. Вот пример модели воксела:

Voxel data
Изображение пользователя Wikipedia Vossman

Ответ 2

В 2D-мире с листами спрайтов вы рисуете один из спрайтов в зависимости от состояния актера (визуальное представление вашего объекта). В 3D-мире вы создаете модель для своего актера, представляющую собой серию полигонов с нанесенной на нее текстурой. Существуют стандартизированные файлы моделей (я в основном знаком с Autodesk 3DS Max), в которых модель и назначенные текстуры могут быть упакованы вместе (файл .3DS или .MAX), предоставляя все, что ваша графическая библиотека должна отображать для объекта и его текстуры.

Вкратце, вы не используете изображения для каждого вида 3D-объекта, у вас есть модель с текстурой, отображаемой на ней, создавая динамическое представление, поскольку оно визуализируется графической библиотекой.