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

  • Tutorial
  • Статья 1: алгоритм Брезенхэма
  • Статья 4: Необходимая геометрия: фестиваль матриц
    • 4в: новый растеризатор и коррекция перспективных искажений

Улучшение кода

Official translation (with a bit of polishing) is available

Постановка задачи

Цель этого цикла статей - показать, как работает OpenGL, написав его (сильно упрощённый!) клон самостоятельно. На удивление часто сталкиваюсь с людьми, которые не могут преодолеть первоначальный барьер обучения OpenGL/DirectX. Таким образом, я подготовил краткий цикл из шести лекций, после которого мои студенты выдают неплохие рендеры.

Итак, задача ставится следующим образом: не используя никаких сторонних библиотек (особенно графических) получить примерно такие картинки:

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

Я постараюсь не перевалить за 500 строк в конечном коде. Моим студентам требуется от 10 до 20 часов программирования, чтобы начать выдавать подобные рендеры. На вход получаем текстовый файл с полигональной сеткой + картинки с текстурами, на выход отрендеренную модель. Никакого графического интерфейса, запускаемая программа просто генерирует файл с картинкой.

Поскольку целью является минимизация внешних зависимостей, то я даю своим студентам только один класс, позволяющий работать с TGA файлами. Это один из простейших форматов, поддерживающий картинки в формате RGB/RGBA/чёрно-белые. То есть, в качестве отправной точки мы получаем простой способ работы с картинками. Заметьте, единственная функциональность, доступная в самом начале (помимо загрузки и сохранения изображения), это возможность установить цвет одного пикселя.

Никаких функций отрисовки отрезков-треугольников, это всё придётся писать вручную.

Я даю свой исходный код, который пишу параллельно со студентами, но не рекомендую его использовать, в этом просто нет смысла.

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

#include "tgaimage.h" const TGAColor white = TGAColor(255, 255, 255, 255); const TGAColor red = TGAColor(255, 0, 0, 255); int main(int argc, char** argv) { TGAImage image(100, 100, TGAImage::RGB); image.set(52, 41, red); image.flip_vertically(); // i want to have the origin at the left bottom corner of the image image.write_tga_file("output.tga"); return 0; }

Output.tga должен выглядеть примерно так:

Алгоритм Брезенхэма

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

Как выглядит простейший код, рисующий отрезок между двумя точками (x0, y0) и (x1, y1)?
Видимо, как-то так:

Void line(int x0, int y0, int x1, int y1, TGAImage &image, TGAColor color) { for (float t=0.; t<1.; t+=.01) { int x = x0*(1.-t) + x1*t; int y = y0*(1.-t) + y1*t; image.set(x, y, color); } }

Проблема этого кода (помимо эффективности) это выбор константы, которую я взял равной.01.
Если вдруг мы возьмём её равной.1, то наш отрезок будет выглядеть вот так:

Мы легко можем найти нужный шаг: это просто количество пикселей, которые нужно нарисовать.
Простейший (с ошибками!) код выглядит примерно так:
void line(int x0, int y0, int x1, int y1, TGAImage &image, TGAColor color) { for (int x=x0; x<=x1; x++) { float t = (x-x0)/(float)(x1-x0); int y = y0*(1.-t) + y1*t; image.set(x, y, color); } }

Осторожно: наипервейший источник ошибок в подобном коде у моих студентов - это целочисленное деление типа (x-x0)/(x1-x0).

Line(13, 20, 80, 40, image, white); line(20, 13, 40, 80, image, red); line(80, 40, 13, 20, image, red);

То выяснится, что одна линия хороша, вторая с дырками, а третьей вовсе нет.
Обратите внимание, что первая и вторая строчки (в коде) дают одну и ту же линию разного цвета. Белую мы уже видели, она хорошо отрисовывается. Я надеялся перекрасить белую в красный цвет, не получилось. Это тест на симметричность: результат отрисовки сегмента не должен зависеть от порядка точек: сегмент (a,b) дожен быть ровно таким же, как и сегмент (b,a).

Дырки в одном из сегментов из-за того, что его высота больше ширины.
Мои студенты часто мне предлагают такой фикс: if (dx>dy) {for (int x)} else {for (int y)}.
Ну ёлки!

x1) { // make it left-to-right std::swap(x0, x1); std::swap(y0, y1); } for (int x=x0; x<=x1; x++) { float t = (x-x0)/(float)(x1-x0); int y = y0*(1.-t) + y1*t; if (steep) { image.set(y, x, color); // if transposed, de-transpose } else { image.set(x, y, color); } } }

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

Итак, предыдущий код прекрасно работает, но он может быть оптимизирован.

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

Для тестов я рисую 1000000 раз 3 отрезка, которые мы рисовали перед этим. Мой процессор: is Intel® Core(TM) i5-3450 CPU @ 3.10GHz.
Этот код для каждого пикселя вызывает конструктор копирования TGAColor.
А это 1000000 * 3 отрезка * примерно 50 пикслей на отрезок. Немало вызовов.
Где начнём оптимизацию?
Профилировщик нам скажет.

Я откомпилировал код с ключами g++ -ggdb -g3 -pg -O0; затем запустил gprof:

% cumulative self self total time seconds seconds calls ms/call ms/call name 69.16 2.95 2.95 3000000 0.00 0.00 line(int, int, int, int, TGAImage&, TGAColor) 19.46 3.78 0.83 204000000 0.00 0.00 TGAImage::set(int, int, TGAColor) 8.91 4.16 0.38 207000000 0.00 0.00 TGAColor::TGAColor(TGAColor const&) 1.64 4.23 0.07 2 35.04 35.04 TGAColor::TGAColor(unsigned char, unsigned char, unsigned char, unsigned char) 0.94 4.27 0.04 TGAImage::get(int, int)

10% рабочего времени - это копирование цвета.
Но ещё 70% проводятся в вызове line()! Тут и будем оптимизировать.

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

Void line(int x0, int y0, int x1, int y1, TGAImage &image, TGAColor color) { bool steep = false; if (std::abs(x0-x1)x1) { std::swap(x0, x1); std::swap(y0, y1); } int dx = x1-x0; int dy = y1-y0; float derror = std::abs(dy/float(dx)); float error = 0; int y = y0; for (int x=x0; x<=x1; x++) { if (steep) { image.set(y, x, color); } else { image.set(x, y, color); } error += derror; if (error>.5) { y += (y1>y0?1:-1); error -= 1.; } } }
% cumulative self self total time seconds seconds calls ms/call ms/call name 38.79 0.93 0.93 3000000 0.00 0.00 line(int, int, int, int, TGAImage&, TGAColor) 37.54 1.83 0.90 204000000 0.00 0.00 TGAImage::set(int, int, TGAColor) 19.60 2.30 0.47 204000000 0.00 0.00 TGAColor::TGAColor(int, int) 2.09 2.35 0.05 2 25.03 25.03 TGAColor::TGAColor(unsigned char, unsigned char, unsigned char, unsigned char) 1.25 2.38 0.03 TGAImage::get(int, int)

А зачем нам нужны плавающие точки? Едиственная причина - это одно деление на dx и сравнение с.5 в теле цикла.
Мы можем избавиться от плавающей точки, заменив переменную error другой, назовём её error2, она равна error*dx*2.
Вот эквивалентный код :

Void line(int x0, int y0, int x1, int y1, TGAImage &image, TGAColor color) { bool steep = false; if (std::abs(x0-x1)x1) { std::swap(x0, x1); std::swap(y0, y1); } int dx = x1-x0; int dy = y1-y0; int derror2 = std::abs(dy)*2; int error2 = 0; int y = y0; for (int x=x0; x<=x1; x++) { if (steep) { image.set(y, x, color); } else { image.set(x, y, color); } error2 += derror2; if (error2 > dx) { y += (y1>y0?1:-1); error2 -= dx*2; } } }
% cumulative self self total time seconds seconds calls ms/call ms/call name 42.77 0.91 0.91 204000000 0.00 0.00 TGAImage::set(int, int, TGAColor) 30.08 1.55 0.64 3000000 0.00 0.00 line(int, int, int, int, TGAImage&, TGAColor) 21.62 2.01 0.46 204000000 0.00 0.00 TGAColor::TGAColor(int, int) 1.88 2.05 0.04 2 20.02 20.02 TGAColor::TGAColor(unsigned char, unsigned char, unsigned char, unsigned char)
Другой разговор, теперь достаточно убрать ненужные копии при вызове функции, передвая цвет по ссылке (или просто включив флаг компиляции -O3) и всё готово. Ни единого умножения, ни единого деления в коде.
Время работы снизилось с 2.95 секунды до 0.64.

Проволочный рендер.

Теперь всё готово для создания проволочного рендера. Снимок кода и тестовая модель

Я использовал wavefront obj формат файла для хранения модели. Всё, что нам нужно для рендера, это прочитать из файла массив вершин вида

V 0.608654 -0.568839 -0.416318
[...]
это координаты x,y,z, одна вершина на строку файла

И граней
f 1193/1240/1193 1180/1227/1180 1179/1226/1179
[...]

Тут нас интересуют первое число после каждого пробела, это номер вершины в массиве, который мы прочитали ранее. Таким образом эта строчка говорит, что вершины 1193, 1180 и 1179 образуют треугольник.

Файл model.cpp содержит простейший парсер.

Пишем такой цикл в наш main.cpp и вуаля, наш проволочный рендер готов.

For (int i=0; infaces(); i++) { std::vector face = model->face(i); for (int j=0; j<3; j++) { Vec3f v0 = model->vert(face[j]); Vec3f v1 = model->vert(face[(j+1)%3]); int x0 = (v0.x+1.)*width/2.; int y0 = (v0.y+1.)*height/2.; int x1 = (v1.x+1.)*width/2.; int y1 = (v1.y+1.)*height/2.; line(x0, y0, x1, y1, image, white); } }

В следующий раз будем рисовать 2D треугольники и подправлять наш рендер.

Теги: Добавить метки

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

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

Перейдем к разбору самых популярных приложений для 3D моделирования.

Autodesk 3ds Max

Самым популярным представителем 3Д-моделлеров остается Autodesk 3ds Max — самое мощное, функциональное и универсальное приложение для трехмерной графики. 3Д Макс — это стандарт, под который выпущено множество дополнительных плагинов, разработано готовых 3Д-моделей, отснято гигабайты авторских курсов и видеоуроков. С этой программы лучше всего начинать учиться компьютерной графике.

Эта система может использоваться во всех отраслях, начиная от архитектуры и дизайна интерьеров и заканчивая созданием мультфильмов и анимированных видеороликов. Autodesk 3ds Max идеален для статичной графики. С помощью него быстро и технологично создаются реалистичные картинки интерьеров, экстерьеров, отдельных предметов. Большинство разрабатываемых 3Д-моделей создаются именно в формате 3ds Max, что подтверждает эталонность продукта и является самым большим его плюсом.

Cinema 4D

Cinema 4D — программа, которая позиционируется как конкурент Autodesk 3ds Max. Синема обладает практически таким же набором функций, но отличается в логике работы и способах выполнения операций. Это может создать неудобства для тех, кто уже привык работать в 3Д Макс и хочет воспользоваться преимуществами Cinema 4D.

По сравнению со своим легендарным конкурентом, Cinema 4D может похвастать более совершенным функционалом в создании видеоанимаций, а также способностью создавать реалистичную графику в режиме реального времени. Уступает же Cinema 4D, в первую очередь, своей меньшей популярностью, из-за чего количество 3Д-моделей под эту программу намного меньше, чем для Autodesk 3ds Max.

Sculptris

Для тех, кто делает свои первые шаги на поприще виртуального скульптора, идеально подойдет несложное и веселое приложение Sculptris. С помощью этого приложения, пользователь сразу погружается в увлекательный процесс лепки скульптуры или персонажа. Воодушивившись интуитивным творением модели и развивая свои навыки, можно перейти на профессиональный уровень работы в более сложных программах. Возможности Скульптрис достаточны, но не полны. Результат работы — создание одиночной модели, которая будет использоваться при работе в других системах.

IClone

IClone — это программа, разработанная специально для создания быстрых и реалистичных анимаций. Благодаря большой и качественной библиотеке примитивов, пользователь может ознакомится с процессом создания анимации и приобрести свои первые навыки в этом виде творчества. Сцены в IClone создаются легко и увлекательно. Хорошо подойдет для первоначальной проработки фильма на этапах эскизирования.

IClone хорошо подходит для изучения и использования в простых или малобюджетных анимациях. Однако его функционал не так широк и универсален, как в Cinema 4D.

ТОП-5 программ для 3D моделирования: видео

AutoCAD

Для целей строительного, инженерного и промышленного проектирования применяется самый популярный чертежный пакет — AutoCAD от компании Autodesk. Эта программа обладает мощнейшим функционалом для двухмерного черчения, а также проектирования трехмерных деталей разной сложности и назначения.

Научившись работать в AutoCAD, пользователь сможет проектировать сложные поверхности, конструкции и прочие изделия материального мира и оформлять к ним рабочие чертежи. На стороне пользователя — русскоязычное меню, справка и система подсказок по всем операциям.

Эту программу не стоит применять для красивых визуализаций, как Autodesk 3ds Max или Cinema 4D. Стихия Автокада — рабочие чертежи и подробная разработка модели, поэтому для эскизных разработок, например, архитектуры и дизайна лучше выбрать более подходящий для этих целей Sketch Up.

Sketch Up

Sketch Up — это интуитивная программа для дизайнеров и архитекторов, которая используется для быстрого создания трехмерных моделей предметов, конструкций, зданий и интерьеров. Благодаря интуитивному процессу работы, пользователь может воплотить свой замысел достаточно точно и графически понятно. Можно сказать, что Sketch Up — самое простое решение, используемое для 3d моделирования дома.

Скетч Ап обладает возможностью создания как реалистичных визуализаций, так и эскизных чертежей, что выгодно отличает его от Autodesk 3ds Max и Cinema 4D. В чем уступает Sketch Up, так это в низкой детализации объектов и не столь большим количеством 3Д-моделей под свой формат.

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

Sweet Home 3D

Если требуется несложная система для 3D-моделирования квартиры, на эту роль отлично подойдет Sweet Home 3D. Даже неподготовленный пользователь сможет быстро начертить стены квартиры, разместить окна, двери, мебель, нанести текстуры и получить эскизный проект своего жилья.

Sweet Home 3D — решение для тех проектов, в которых не требуется реалистичная визуализация и наличие авторских и индивидуальных 3Д-моделей. Построение модели квартиры основывается на встроенных библиотечных элементах.

Blender

Бесплатная программа Blender является очень мощным и многофункциональным инструментом для работы с трехмерной графикой. Количеством своих функций он практически не уступает большим и дорогим 3ds Max и Cinema 4D. Эта система вполне подойдет как для создания 3Д-моделей, так и для разработки видеороликов и мультфильмов. Несмотря на некоторую нестабильность работы и отсутствие поддержки большого числа форматов 3Д-моделей, Blender может похвастать перед тем же 3ds Max более продвинутым инструментарием создания анимаций.

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

NanoCAD

NanoCAD можно считать очень урезанной и переработанной версией многофункционального AutoCAD. Конечно же, Нанокад не обладает даже близким набором возможностей своего прародителя, но подойдет для решения небольших задач, связанных с двухмерным черчением.

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

Lego Digital Designer

Lego Digital Designer — это игровая среда, с помощью которой можно собрать конструктор Лего на своем компьютере. Это приложение можно лишь условно отнести к системам для 3Д-моделирования. Цели Lego Digital Designer — развитие пространственного мышления и навыков комбинирования форм и в нашем обзоре нет конкурентов для этого чудо-приложения.

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

Visicon

Visicon — это очень простая система, используемая для 3d моделирования интерьера. Визикон нельзя назвать конкурентом для более продвинутых 3Д-приложений, зато он поможет справиться неподготовленному пользователю с созданием эскизного проекта интерьера. Его функционал во многом похож со Sweet Home 3D, однако Visicon обладает меньшим количеством возможностей. При этом, скорость создания проекта может оказаться быстрее, благодаря простому интерфейсу.

Простейшим способом создания несложных объемных объектов и их сочетаний в среде Windows 10 является использование интегрированного в операционную систему редактора Paint 3D. С помощью инструмента можно быстро и легко создавать, а также редактировать модели в трехмерном пространстве.

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

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

Эскизное моделирование интерьера — Visicon, Sweet Home 3D, Sketch Up
Визуализация интерьеров и экстерьеров — Autodesk 3ds Max, Cinema 4D, Blender
Предметное 3D-проектирование — AutoCAD, NanoCAD, Autodesk 3ds Max, Cinema 4D, Blender
Cкульптурирование — Sculptris, Blender, Cinema 4D, Autodesk 3ds Max
Создание анимаций — Blender, Cinema 4D, Autodesk 3ds Max, IClone
Развлекательное моделирование — Lego Digital Designer, Sculptris, Paint3D

Г Л АВ А 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- и VFX-художниками. А еще есть читатели, которые уже работают программистами, но хотят попробовать себя в создании мультиков и игр.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Сергей Савенков

    какой то “куцый” обзор… как будто спешили куда то