С чего начать изучение программирования 3d графики. Описание алгоритмов произвольных преобразований камеры

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

Также, в связи с тем, что на территории бывшего СССР , то выпускники школ задаются вопросом "Можно ли сейчас пойти на факультет связанный с программированием, чтобы в будущем эти знания использовать для 3D?"

Вот два письма, где мои читатели спрашивают как можно совместить навыки программирования и 3D работу. А под письмами я даю свой ответ.

Первое письмо.

Реально ли совмещать графику и программирование?

Здравствуйте, Юрий!

Зовут меня ****, я из г. Омска.

Читаю ваш блог давно, спасибо за интересные статьи. Некоторые перечитываю каждый раз заново.

Вот у меня какая проблема возникла: занимался программированием все время (ну как занимался, пытался, хотел стать хакером так сказать качественным:-))))

Через некоторое время понял, что дело не движется, нужно себя в чем-то реализовывать. В университете проводились занятия по 3ds max, очень понравилась тема, пытался что-то создавать, но как-то забыл об этом.

С некоторых пор появилось желание заняться графикой.

Хочется и графикой заниматься и программированием, но понимаю, что нужно выбирать, т.к. области большие и одновременно и тем и другим быть сложно. Голова разрывается от противоречий, спать иногда полночи не могу, думаю что выбрать. Последнее время все-таки больше графика перевешивает))

Такой вопрос - реально совмещать графику и программирование или выбрать одно направление лучше?

Каков инструментарий у 3d-шника, какие приложение использовать, с чего начать?

Извините, если может быть не понятно изъяснился. Если советом поможете - буду очень благодарен!))

Второе письмо.

Какие языки программирования и технологии нужно изучать для 3D?

Здравствуйте Юрий.

Отв етьте пожалуйста на такой в опрос. Я ув лекаюсь 3d графикой некоторое в ремя, и со школы мечтаю работать в мультипликационной студии. Но т.к. дизайнерские (художеств енные) способности разв иты не были, учусь на программиста (2 курс). Т.к. после третьего надо уже идти работать, у меня в озникают против оречия, в каком направ лении продолжать разв итие.

Программирование перспектив но и позв оляет хорошо зарабатыв ать, но не так интересно. И пойдя по этому пути, я заберу у себя в ремя на разв итие дизайнерских способностей и нав ыков работы с 3d .

Поэтому я думаю над тем, что бы использов ать нав ыки программирования в 3d и найти работу которая объединяет в себе 2 эти специальности. Что бы остав аясь программистом, работать и с 3d графикой. Тогда, разобрав шись в себе, я смогу либо остаться в этой роли, либо перейти в одну из этих специальностей уже в чистом в иде.

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

Например сетап персонажей. Стоит ли углубляться в эту область? И на сколько в ажную роль играет в нём программирование ?

Теперь мой ответ.

Совмещать программирование и 3D можно. Причём в разном процентном соотношении.

Существует несколько вариантов такого совмещения:

Распишу последний пункт поподробней.

  • Вы захотели стать . У моделера есть куча повторяющихся операций, которые он выполняет часто, а значит их можно автоматизировать с помощью скриптов.
  • Вы мечтаете персонажей. Где-то 10-15% времени вам придётся что-то программировать и как-то улучшать даже существующий риг (не говоря уже о создании рига с нуля).
  • Вы желаете устроится в отдел . Здесь также пишут код - пишут свои шейдера.
  • Вы хотите стать лайтером? Одел лайтинга пишет свои тулзы для освещения.
  • Вам сильно хочется что-то взрывать, тогда вам дорога в отдел динамики. Тут пишут свои инструменты для управления динамикой, частиц (дыма, огня, жидкостей) и так далее.
  • Казалось бы только не нуждаются в навыках программирования, но и здесь всё не так просто. Посмотрите, к примеру, на , где текстуры рисуются не кисточкой, а эффектами погоды, которые накодил какой-то программист.

Может вы еще какие примеры приведёте, где можно совмещать работу программиста и тридешника?

А если не знаете с чего начать изучать 3D, то .

Подпишитесь на обновление блога (вот ).

P.S. Программист на заглавной картинке нарисован в Photoshop художником Bruno Hamzagic de Carvalho. .

Г Л АВ А 20

Программирование 3D-графики

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

Базовые принципы 3D-графики

Может показаться, что трехмерная игра всего в полтора раза сложнее двухмерной, поскольку в ней добавляется еще одна координата. Однако это не совсем так. Если поведение двухмерной игры в основном определяется перемещением объектов на экране, то в трехмерной игре возникает множество дополнительных сложностей.

Вместо плоской картинки объектами игры являются трехмерные модели, на которые можно смотреть с разных сторон. Это сложные структуры, состоящие из примитивов (треугольников), возможно, покрытых текстурами.

Трехмерные объекты выглядят по-разному в зависимости от освещения - необходимо задавать и различать такие виды освещения, как рассеянные (ambient) и направленные (directed) источники света.

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

Наименьшей из этих проблем является то, что у всех объектов появляется третья координата, и необходимо теперь думать об их взаимном расположении в пространстве и таких параметрах, как угол поворота и т. д.

За отображение трехмерной картинки на экране отвечает графический процессор телефона, в котором работает специальный механизм массивно-параллельного вычисления типовых операций, называемыйшейдерами . Для отображения модели из множества треугольников необходимо к каждой вершине применить некоторые

Программирование 3D-графики

преобразования (например, умножение на матрицу перемещения или поворота), что и делает шейдер. В терминологии XNA процесс обработки модели графическим процессором называется эффектом , и на телефоне с Windows Phone 7 доступно некоторое количество предопределенных эффектов, позволяющих добиться оптимального отображения различного вида моделей с сохранением высокой производительности. По сути дела, эффект определяет используемый алгоритм рендеринга (отображения) 3D-сцены, реализованный внутри графического процессора.

Для простейших игр вполне можно использовать базовый алгоритм отображения, называемый Basic Effect. Он позволяет указать базовое рассеянное освещение и три направленных источника света, используя при этом рендеринг на основе алгоритма Фонга. Помимо обработки света, алгоритм рендеринга отвечает за перевод трехмерных координат точек в двухмерные.

Для задания параметров отображения трехмерной модели используется набор из трех матриц 4 4:

 мировая матрица (world matrix) задает аффинные преобразования (перемещение, поворот, масштабирование), которые необходимо применить к модели перед отрисовкой;

 матрица обзора (view matrix) определяет "направление взгляда" камеры. Для создания такой матрицы может использоваться функцияMatrix.CreateLookAt с указанием векторов положения камеры и точки обзора;

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

Последние две матрицы определяют положение камеры и в простейшем случае могут задаваться один раз в начале работы программы в методе LoadContent или

Initialize (листинг 20.1).

Листинг 20.1. Задание матриц

Мировая матрица обычно используется для задания положения модели в трехмерном пространстве.

Отображаем 3D-модель

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

моделей хорошо подходит, скажем, свободно распространяемый редактор Blender (http://blender.org ). Модель и соответствующие ей текстуры (в виде графических файлов) поместим в Content Pipeline, как показано на рис. 20.1.

Файлы модели в данном примере располагаются в двух каталогах: файлы, описывающие саму модель, в каталоге Models, а текстуры - в каталоге Textures. Ссылки на текстуры прописаны внутри файла модели, поэтому относительное расположение каталога с текстурами и название файлов лучше не изменять. В нашем примере используется 3D-модель космического корабля (p1_wedge.fbx), показанная на рис. 20.2.

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

Matrix CameraView, CameraProj;

Vector3 CameraPos = new Vector3(0.0f, 0.0f, 150.0f); Vector3 ShipPos = new Vector3(0f, 0f, 0f);

protected override void LoadContent()

spriteBatch = new SpriteBatch(GraphicsDevice);

Программирование 3D-графики

CameraView = Matrix.CreateLookAt(CameraPos, Vector3.Zero, Vector3.Up); CameraProj = Matrix.CreatePerspectiveFieldOfView(

MathHelper.ToRadians(45.0f), GraphicsDevice.Viewport.AspectRatio, 1.0f, 10000.0f);

M = Content.Load("Models/p1_wedge");

В методе рисования отображение модели производится одной командой Draw (лис-

Листинг 20.3. Отображение модели

protected override void Draw(GameTime gameTime)

GraphicsDevice.Clear(Color.CornflowerBlue);

Matrix w = Matrix.CreateScale(0.01f) *

Matrix.CreateTranslation(ShipPos);

M.Draw(w, CameraView, CameraProj);

base.Draw(gameTime);

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

В результате мы получаем приложение, показанное на рис. 20.3.

Рис. 20.3. Работа приложения в эмуляторе

С детства я очень люблю играть в видео игры и мне хотелось написать какую-нибудь собственную игру. Изучив основы программирования, программированием 3D графики я занялся на 2-ом курсе. Я имею 2 года опыта работы с 3D графикой в компании Soft-Xpansion. В Soft-Xpansion я восновном моделирую шестерёнки, болты, подшипники, валы, тригера и т.д.

В мире освещены различные аспекты разработки трёхмерных приложений, однако основное внимание уделяется вопросам программирования - в частности, представления трехмерных объектов, их визуализации с учетом свойств материала объектов, освещения, перспективы, а также таким специфическим вопросам трехмерной визуализации, как создание различных визуальных спецэффектов и т.п. Рассмотрим такие задачи: визуализация трехмерного объекта, создание и параметризация объекта, алгоритмы центрального и параллельного проецирования, алгоритмы различных преобразований.

Программирование 3D графики рассмотрим на примере разработки графического редактора для работы с параметризированными трехмерными объектами. Существует множество прикладных программ, для работы с трехмерными графическими объектами. Всевозможные графические редакторы позволяют работать с объектами разного типа. При этом важными факторами являются точное отображение реальных объектов и скорость работы. В результате возникает задача графического моделирования объектов на ЭВМ, при решении которой главным фактором является наиболее точное отображение реального объекта.

1. Разработка полигональной модели объекта

1.1 Составляющие элементы объекта

Полигональная модель в компьютерной графике - это образ объекта, составленный из множества многоугольников. Мы будем разрабатывать полигональную модель объекта «самолёт». Трехмерное изображение объекта представлено на рис. 1.1.

Объект состоит из нескольких видов поверхностей, которые в свою очередь разбиваются на полигоны для удобства хранения и обработки. Объект состоит из следующих видов фигур:

  • капсула;
  • параллелепипед;
  • призма, в основании которой прямоугольный треугольник.

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

1.2 Триангуляция поверхности объекта

Триангуляция поверхностей – это процесс разбиения сложных объектов на треугольные полигоны. Триангуляция удобна при программировании графики, т.к.:

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

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

Для получения координат вершин капсулы используются формулы перехода из цилиндрической системы координат в декартову систему координат (рис. 1.2). В формулах цилиндр имеет радиус R и высоту ZC. Полной окружности соответствует диапазон изменения параметра угла от 0 до 2Пи. Если рассматривать некоторое фиксированное число, равномерно распределенных, точек по окружности, то приращение параметра между точками можно считать константой (рис. 1.3). На концах капсулы находятся полусферы, которые получаются путём разбиения конуса на части по высоте и вдоль основания, после этого нормализуем координаты всех вершин так что бы они лежали на нашей сфере и полученные прямоугольники разбиваем на полигоны.

Призма, в основании которой прямоугольный прямоугольник состоит из 2 треугольников и 3 прямоугольников, которые легко разбиваются на полигоны.

На рисунке 1.4 представлено каркасное изображение объекта.

2. Описание алгоритмов аффинных преобразований

Любое изображение, выводимое на экран монитора, состоит из точек. Каждая точка в трехмерном пространстве, в свою очередь содержит три координаты – X (абсцисса), Y (ордината), Z (аппликата). Координаты точки однозначно определяют ее положение в системе координат. Мы будем использовать правую декартовую прямоугольную систему координат, общий вид которой показан на рисунке 2.1.

Здесь буквами x, y, z обозначены положительные направления осей Ox, Oy и Oz соответственно. Для вывода сцены на экран используются 3 системы координат:

  • СК сцены;
  • экранная СК;
  • СК камеры.

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

После выполнения геометрических преобразований, координаты (x, y, z) точки переходят в новые координаты (x*, y*, z*). Общие формулы преобразования координат показаны на рисунке 2.2. Но более удобной является матричная форма записи трехмерного преобразования (рис. 2.3). Здесь к координатам (x ,y, z) точки добавилась четвертая координата, равная единице и необходимая для выполнения преобразований в матричной форме. Такие координаты называются однородными.

2.1 Перемещение объекта

Одним из простейших и часто применяемых аффинных преобразований является перемещение (сдвиг, перенос). Матрица A перемещения на вектор показана на рисунке 2.4. Алгоритм представлен на рисунке 2.5.

Рисунок 2.4 – Матрица перемещения

2.2 Вращение объекта

Аффинным преобразованием, которое позволяет смотреть на объект под разными углами и с разных сторон, является поворот объекта относительно координатных осей. Матрицы поворотов вокруг координатных осей показаны на рисунках 2.6, 2.7, 2.8 и вокруг произвольной оси на рисунке 2.9.

Рисунок 2.9 – Матрица поворота вокруг произвольной оси

Алгоритм поворота вокруг произвольной оси представлен на рисунке 2.10.

Рисунок 2.10 – Алгоритм поворота вокруг произвольной оси

2.3 Масштабирование объекта

Другим важнейшим аффинным преобразованием является масштабирование. Масштабирование - изменение размера изображения с сохранением пропорций. Под масштабированием подразумевается как увеличение изображения, так и его уменьшение. Матрица масштабирования представлена на рисунке 2.11, а алгоритм масштабирования на рисунке 2.12.

3. Описание алгоритмов проекционных преобразований

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

Элементами, с помощью которых осуществляется проецирование, являются (рис. 3.1):

  • центр проецирования - точка, из которой производится проецирование;
  • объект проецирования - изображаемый предмет;
  • плоскость проекции - плоскость, на которую производится проецирование;
  • проецирующие лучи - воображаемые прямые, с помощью которых производится проецирование.

Результатом проецирования является изображение или проекция объекта. Различают центральное и параллельное проецирование. При центральном проецировании все проецирующие лучи исходят из одной точки - центра проецирования, находящегося на определённом расстоянии от плоскости проекций (рисунок 3.1). При параллельном проецировании все проецирующие лучи параллельны между собой. На рисунке 3.2 показано, как получается параллельная прямоугольная проекция. Центр проецирования предполагается условно удалённым в бесконечность. Тогда параллельные лучи отбросят на плоскость проекций тень, которую можно принять за параллельную проекцию изображаемого предмета.

В проекте реализовано переключение между центральным и параллельным проецированием. Отличия при реализации системы проецирования появляются при вычислении координат проекций на аксонометрическую плоскость проекций камеры. Эта плоскость имеет размеры (–1,+1) по ширине и (–1/ar,+1/ar) по высоте, где ar – форматное отношение. Если при центральном проецировании имеет место формула, показанная на рисунке 3.3, то для параллельного проецирования справедлива формула, представленная на рисунке 3.4.

Рисунок 3.3 – Формула вычисления координат проекций при центральном проецировании

Рисунок 3.4 – Формула вычисления координат проекций при параллельном проецировании

В этой формуле a - половина ширины окна вывода, а b - половина его высоты.

4. Описание алгоритмов произвольных преобразований камеры

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

Камера задается следующими параметрами:

  • углом обзора;
  • фокусным расстоянием (от точки нахождения камеры до плоскости, на которую мы проецируем);
  • ближними и дальними плоскостями, которые участвуют в отсечении по пирамиде видимости.

Для камеры были реализованы: поворот, смещение и панорамирование.

Камера расположена в определенной точке пространства, а также имеет целевую точку. На основании этих двух точек рассчитываются три вектора: вверх, вправо и вперед, которые однозначно определяют направление камеры и образуют оси системы координат камеры (рисунок 4.1).

Получаем из МСК координаты точек объекта в координатной системе камеры. Схема представлена на рисунке 4.2.

Основные функции для работы с камерой представленны на рисунках 4.3, 4.4, 4.5.

Для того чтобы получить координаты точки, представленной в мировых координатах, в координатах камеры необходимо эту точку умножить на матрицу камеры трансформации из МСК. Точку следует представить в однородных координатах. Матрица трансформации камеры приведена на рисунке 4.6. В этой матрице U – вектор «вправо», V – вектор «вверх», N – вектор «вперед», camPos – позиция камеры в МСК.

Понравилась статья? Поделиться с друзьями: