Vvmebel.com

Новости с мира ПК
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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

AlexeySpace.Ru

Программирование трехмерной графики. Часть 1.

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

Для программирования трехмерной графики мы будем использовать интегрированную среду программирования Borland Delphi 7.0 (все примеры и программы написаны именно на ней). А вывод графики будем осуществлять через стандартный графический класс TCanvas, который присутствует практически у всех визуальных компонентов Delphi. Я не буду здесь описывать принципы работы в среде Borland Delphi и основ программирования на языке Object Pascal. Это отдельная и большая тема. Предполагается, что у вас уже есть опыт работы в Delphi, а также навыки программирования графики с помощью класса TCanvas. Если нет, то придется наверстать. Тем более что в интернете достаточно информации на эту тему.

Сразу скажу, что используя данный класс для вывода графики, нам не удаться добиться высокой скорости отрисовки объектов, и уж тем более сделать на нем свой DOOM 3. Но нам это и не нужно. Для изучения основ трехмерности он вполне пригоден. К тому же этот класс скрывает от нас множество ненужных проблем, которые у нас возникли бы, если бы мы выводили графику через низкоуровневые API – функции. Я уже не говорю про низкоуровневую работу с видеоадаптером. Вот там настоящий АД!

Как я уже и сказал, сейчас скорость для нас не важна. Сначала нам нужно понять теорию, с помощью которой строятся трехмерные изображения. А именно: виды проекций, формулы проецирования, формулы трансформации трехмерных объектов в пространстве, нахождение нормалей, расчет освещения и т.д… Ведь освоив всю эту теория, ну или хотя бы ее основы, нам будет намного легче перейти на более высокоуровневые интерфейсы программирования графики, такие так OpenGL или DiretcX. Так было и со мной. Поразбиравшись немного во всех этих математических формулах и геометрических задачках, мне удалось понять и изучить OpenGL буквально за неделю!

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

Итак, что бы описать точку в пространстве, достаточно создать вот такую структуру:

На рисунке (1.2.1) видно, что каждая координата точки задает плоскость параллельную противоположенной координатной плоскости. Например, координата X – задает плоскости, которая параллельна координатной плоскости YZ. Пересечение всех трех плоскостей и дает нам искомое расположение точки в пространстве. На рисунке – это точка A.

Рис 1.2.1. Точка в пространстве

Итак, у нас имеются координаты точки в пространстве (X, Y, Z). Как же теперь нам отобразить эту точку на экране монитора? Очень просто! Для того что бы отобразить ее на мониторе, нам нужно спроецировать ее на плоскость экрана. Поэтому следующее, что нам понадобится – это формулы перевода трехмерных координат, в двухмерные, т.е. формулы проецирования.

Казалось бы, зачем нам какие-то формулы, когда можно просто взять (X, Y) – координаты точки, и по этим значениям нарисовать ее на экране? А координату Z – просто отбросить. В этом случае у нас получится параллельное (ортогональное) проецирование точки. Так конечно тоже можно сделать, и объекты, построенные на экране, таким образом, тоже будут казаться трехмерными. Но все-таки отображаться они буду не очень красиво. Дело в том, что построенное таким образом изображение, не будет учитывать эффекта перспективы . Такой вид проекции используется в основном в техническом черчении.

Поэтому в программировании трехмерной графики лучше использовать центральное (перспективное) проецирование.

Посмотрите на рисунки (1.2.2), (1.2.3), (1.2.3) и (1.2.5), на них видны основные отличия между параллельной и центральной проекциями.

Рис 1.2.2. Параллельная (ортогональная) проекция

Рис 1.2.3. Параллельная (ортогональная) проекция трехмерного куба

Рис 1.2.4. Центральная (перспективная) проекция

Рис 1.2.5. Центральная (перспективная) проекция трехмерного куба

  • Красные линии на рисунках – лучи проецирования.
  • Синие точки – точки проецируемого объекта c координатами: (X, Y, Z).
  • Красные точки – проекции синих точек на плоскость экрана.

По рисункам 1.2.3. и 1.2.5. видно, что в первом случае противоположенные ребра у куба параллельны, а во втором, все ребра куба имеют точку схода где-то на горизонте.

Мы уже выяснили, что найти параллельную проекцию трехмерного объекта, не составляет большого труда, а вот с центральной проекцией будет немного посложнее. Ниже представлена формула нахождения центральной проекции точки (X, Y, Z).

Давайте теперь разбираться в этих формулах. Начнем с простого. oX и oY – координаты центра нашего экрана. Что бы его вычислить, нужно проделать вот такую нехитрую операцию:

ClientWidth, ClientHeight – это стандартные свойства формы, задающие ширину и высоту клиентской части окна, т.е. без учета системного меню, строки заголовка и т.д. Собственно в этой области мы и будем, выводит графику.

Следующее, это параметр OfsZ – задающий расстояние от центра локальной координатной оси проецируемой точки, до центра плоскости экрана. Что бы понять это взгляните на Рис 1.2.6.

Рис 1.2.6. Перспективная проекция

На рисунке, параметр Ofs показывает длину отрезка зеленого цвета, соединяющий центр плоскости экрана и центр локальной координатной оси.

Следующий параметр D – влияющий на коэффициент угла обзора проекции, который вычисляется по формуле: k := D / (Z + Ofs);

Нам важно научится правильно подбирать параметры D и Ofs для того что бы наша проекция отображалась корректно. На Рис 1.2.7. – показана проекция человеческой головы с неправильно подобранными параметрами D и Ofs. На Рис 1.2.8. параметры подобраны, верно.

Рис 1.2.7. Неправильная проекция

Рис 1.2.8. Правильная проекция

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

Вы можете пока не заморачиваться с подбором этих параметров, и присваивать им следующие значения:

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

Конечно, что бы получить максимально точную проекцию объекта, нужно провести более сложные расчеты. Но об этом мы поговорим чуть попозже.

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

Я назвал этот метод фундаментальным, потому что он применяется во всех программах активно работающих с компьютерной графикой, а в компьютерных играх и подавно…

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

Создать данный буфер в Delphi – проще пареной репы! Для этого достаточно использовать стандартный графический класс Delphi – TBitMap.

Создание происходит следующим образом:

В первой строке собственно и происходит создание буфера рисования. А именно, создается экземпляр класса TBitMap, и под него выделяется память в компьютере. В следующих строчках указываем размеры нашего буфера, т.е. ширину и длину. Здесь мы указали свойства ClientWidth и ClientHeight т.е. наш буфер будет занимать всю область окна.

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

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

Очистка происходит следующим образом:

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

DrawBuffer.Canvas.Pen.Color – цвет рамки нашего прямоугольника

DrawBuffer.Canvas.Brush.Color – цвет заливки прямоугольника

В нашем случае, цвет рамки и цвет заливки у нас одинаковы.

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

Для этого в процедуру, которая вызывается при изменении размеров окна, добавляем следующий код:

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

Вот в принципе и все! Но остался еще один нюанс. Проведите небольшой эксперимент. Киньте на форму компонент Timer, свойству Enabled присвоим значение True, а значение Interval сделаем равным единице.

Кликнете два раза на таймере, и добавьте следующий код:

Запустите приложение и посмотрите что будет. А будет очень некрасиво, окно будет страшно мерцать. Это происходит потому, что при перерисовки окна, ему сначала посылается сообщение ”WM_ERASEBKGND”, которая стирает фон, а только потом посылается сообщение «WM_PAINT». Поэтому, что бы убрать это неприятное мерцание, нам просто нужно перекрыть функцию, которая вызывается при получении окном сообщения ”WM_ERASEBKGND”. Сделать это, тоже очень легко.

Достаточно добавить в раздел private главной формы следующую функцию:

А само описание функции оставить пустым:

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

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

Рис 1.4.1. Окно программы

Процедура генерации точек выглядит следующим образом:

Из этой процедуры видно, что точки генерируются так, что бы их координаты не выходили из поля обзора нашей проекции. Points3D – массив структур TPoint3D. PointsCount – количество элементов в массиве (т.е. количество генерируемых точек).

Теперь напишем главную процедуру рисования точек. Мы будем вызывать ее тогда, когда наше окно нужно будет перерисовать. Например, когда выполняется событие формы OnPaint, OnResize или событие таймера OnTimer.

Блок-схема этой процедуры будет выглядеть следующим образом:

Рис 1.4.2. Блок-схема процедуры рисования точек

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

Переменная Direct задает направление поворота. Если Direct = True, то точки вертятся сверху вниз, если Direct = False, то слева направо. Подробно эти формулы мы сейчас разбирать не будем, а познакомимся с ними в следующих наших уроках. Но уже сейчас видно, что ничего сложного в них тоже нет…

Первые шаги в изучении 3D-графики

Ответы на распространённые вопросы о 3D. Вполне возможно, вы найдёте здесь что-то полезное.

Раньше это было руководство, на 90% скопированное с мёртвого CG раздела 4chan, потом его переработали на форуме MapCore, а сейчас я его подогнал под интересы нашего сайта. Теперь это плагиат лишь частично.

Paper story — Mohamed Chahin, сделано в Blender;

С чего начать первые шаги в 3D?

Начинать можно по-разному, но проще всего с 3D-редактора. Выбор перед вами широкий:

  • Maya (Много доступной документации наряду с 3ds Max);
  • 3ds Max (Много доступной документации наряду с Maya);
  • Cinema 4D (Больше популярен в индустрии рекламы, чем в в игровой);
  • Modo (Я им не пользовался, вроде популярный среди моделлеров);
  • Houdini (3D-редактор, и среда визуального программирования для сложных процедурных моделей и эффектов);
  • Blender (Бесплатный и не перегружен, как 3ds Max и Maya. Популярен у специалистов 3D-печати. Где-то мощнее других, где-то слабее.).

И несколько вспомогательных программ:

  • Marvelous Designer (Создание одежды и Симуляция ткани);
  • Substance Designer и Substance Painter (Создание процедурно-генерируемых материалов и текстур);
  • MARI (еще один пакет для создания текстур).

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

Wooden House of Northern Kingdom — Mile Mićić, сделано в 3ds Max

Ого! Сколько всяких программ! А какая лучше? Я слышал, что ______ лучшая.

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

Ага, значит есть универсальные и специализированные? А как их распознать?

Универсальные пакеты (3ds Max, Maya, Blender) позволяют создавать модели, рендеры, анимацию, текстуры и динамику в рамках одного приложения. Они не требуют сторонних плагинов или приложений для выполнения базовых задач. Однако с помощью плагинов имеющийся функционал можно расширять.

О-о-о, это же Zbrush, в нём сделано столько отличных работ, начну-ка я с него!

Нет, вы забегаете далеко вперёд. Перед те, как браться за Zbrush, следует изучить базовые принципы и основы моделирования. Zbrush – великолепная программа для продвинутых пользователей, занимающихся тонкой доработкой своих моделей или быстрым прототипированием. Не зная общих концепций 3D, учиться работать в Zbrush – не лучшая идея.

Speed Sculpt_ Dragon — Keita Okada, сделано в ZBrush и отрендерено в Keyshot

Ладно, я понял, это не совсем моё, можете сделать для меня модель ______?

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

Но это же так сложно, есть какое-нибудь простое решение? Мне не хватает мотивации.

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

Так какой редактор проще всего изучить?

Нет, вам не нужно изучать софт. Сосредоточьтесь на изучении техник. Когда вы хорошо овладеете какой-либо техникой, программа станет лишь инструментом для достижения желаемого результата. Как уже было сказано, больше всего курсов и документации по 3ds Max и Maya, но вам следует учиться моделированию и грамотному использованию различных техник, а не зубрить, что делает каждая кнопка. Информацию об интерфейсе ищите в справочных материалах. F1 и Google – ваши верные друзья.

Gateway — Pedro Silva, сделано в Modo, Marvelous Designer и доработано в PhotoShop

На что смотрят студии при приёме на работу? Если я не знаю программу ______, меня могут не взять?

Рассматривая портфолио и резюме, студия оценивает ваши умения, отдавая им следующий приоритет:

  • Качество работы;
  • Универсальность навыков;
  • Опыт;
  • Умение работать с софтом.

Значит, им без разницы, в чём я работаю? И почему так важна универсальность?

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

Глядя на ваше знание софта, студии учитывают редактор, которым пользуются сами, но очень часто у них будут и свои собственные инструменты, так что этот вопрос несильно важен, пока вы хорошо разбираетесь в своём деле. При владении теорией и знании нужных техник, подробное знакомство с любым софтом – вопрос нескольких дней. Конечно, бывают и сложные случаи, когда вы прежде работали только в программе ______, но зачастую опыт работы с конкретными 3D-пакетами не имеет значения (да, блендерфаги, даже вас могут взять на работу при должном уровне навыков).

Если решили заняться созданием ассетов, то основное внимание нужно обращать на модели, текстуры и анимацию.

Низкополигональное моделирование – само по себе искусство, извлечение максимально возможного количества деталей из скромной кучки полигонов требует практики, и выработанной формулы здесь не существует. Создав модель, вы заставляете её выглядеть лучше с помощью UV-развёртки и рельефного текстурирования.

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

Cписок полезных ссылок

  • http://render.ru/ — сообщество и текстовые уроки, выпускают журнал про 3D;
  • http://3dpapa.ru/ — блог о 3D-графике;
  • http://3ddd.ru/ — еще один сайт на русском языке.

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

  • DigitalTutors.com, который сейчас стал называться Pluralsight Creative;
  • The Gnomon Workshop — курсы по 30+ часов;
  • Lynda.com — еще одна компания, предоставляющая услуги онлайн-обучения;
  • Udemy.com — и еще одна;
  • UArtsy.com — школа онлайн-искусств;
  • Allegorithmic — куча качественных бесплатных уроков про текстуры на youtube.com;
  • CGElves.com — тут ищите разнообразные уроки по Marvelous Designer.

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

На следующем этапе вас подстерегает проклятие новичка в виде прохождения одних только курсов и чтобы его избежать, постарайтесь быстрее перейти к созданию готовых продуктов. Если вы изучаете 3D только для игр, начните с создания карт к ним, например с помощью Source SDK. У вас есть опыт программирования? Сразу переключайтесь на игровые движки вроде Unreal или Unity. Когда вы получите первые отзывы от использования ваших работ, вы с новой силой захотите совершенствоваться в таком нелегком деле как компьютерная графика.

Программирование 3D графики на Visual Basic 6 и DirectX 8. Часть 4

200?’200px’:»+(this.scrollHeight+5)+’px’);»> d3dDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1
d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
d3dDevice.SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE
d3dDevice.SetTextureStageState 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE
d3dDevice.SetTextureStageState 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE

d3dDevice.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_BLENDCURRENTALPHA
d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_CURRENT
d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_DIFFUSE

200?’200px’:»+(this.scrollHeight+5)+’px’);»> d3dDevice.SetRenderState D3DRS_ALPHABLENDENABLE, 1[code]
Закрасим цилиндр текстурой, с использования альфа-компоненты из DIFFUSE:

[code] d3dDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1
d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
d3dDevice.SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1
d3dDevice.SetTextureStageState 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Private Sub Render()
d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &H346666, 1, 0
d3dDevice.BeginScene

d3dDevice.SetStreamSource 0, vBuf, vSize
d3dDevice.SetVertexShader vFlag
d3dDevice.SetTexture 0, Tex0

d3dDevice.SetRenderState D3DRS_CULLMODE, D3DCULL_CW
d3dDevice.DrawPrimitive D3DPT_TRIANGLESTRIP, 0, 128
d3dDevice.SetRenderState D3DRS_CULLMODE, D3DCULL_CCW
d3dDevice.DrawPrimitive D3DPT_TRIANGLESTRIP, 0, 128

d3dDevice.EndScene
d3dDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

200?’200px’:»+(this.scrollHeight+5)+’px’);»> d3dDevice.SetRenderState D3DRS_ZENABLE, D3DZB_TRUE
d3dDevice.SetRenderState D3DRS_ZWRITEENABLE, 0
d3dDevice.SetRenderState D3DRS_ALPHABLENDENABLE, 1

d3dDevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
d3dDevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_ONE
d3dDevice.SetRenderState D3DRS_BLENDOP, D3DBLENDOP_ADD

d3dDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1
d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
d3dDevice.SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE
d3dDevice.SetTextureStageState 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE
d3dDevice.SetTextureStageState 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE

2.6. Использование моделей. Mesh
До сих пор для того, чтобы создать какой-либо геометрический объект, мы выполняли некоторые стандартные действия, занимающие достаточно объемный код.
В первую очередь мы создавали флаговое описание вертекса, новый тип, соответствующий формату вертекса и сам вертексный буфер. Для более сложных моделей так же создавался индексный буфер.
Далее для отображения нашего геометрического объекта мы сообщали устройству рендера (d3dDevice), какие вертексный и индексный буферы используется, какой размер у вертекса и как его обрабатывать (флаговое описание). Дальше мы вызывали процедуру рендера с указанием с какого вертекса и индекса следует начинать вывод и сколько треугольников отображать.
Ну и, естественно, необходимо было не забыть уничтожить все ранее созданные объекты до завершения программы.
А, между прочим, создавать, отображать и уничтожать геометрические объекты можно одной командой. В Direct3D существует класс D3DXMesh, предназначенный для хранения таких объектов. Объект (экземпляр класса) можно загружать из файла, так же некоторые простые формы, такие как куб, сфера и т. п. можно генерировать.
Создадим новый проект, как обычно на основе предыдущего. Модуль modMain перепишем полностью. В разделе Declarations оставим только две общих переменных Running и FPS и добавим один объект класса D3DXMesh:

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Private Sub InitLight()
Dim Light As D3DLIGHT8
Light.Type = D3DLIGHT_DIRECTIONAL
Light.Direction = vec3(-1, -1, 1)
Light.diffuse.r = 1
Light.diffuse.g = 1
Light.diffuse.b = 1
d3dDevice.SetLight 0, Light
d3dDevice.LightEnable 0, 1
End Sub

Private Sub InitMaterial()
Dim Mat As D3DMATERIAL8
Mat.diffuse.r = 1
Mat.diffuse.g = 1
Mat.diffuse.b = 1
Mat.Ambient = Mat.diffuse
d3dDevice.SetMaterial Mat
End Sub

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Private Sub InitMatrix()
Dim Mtrx As D3DMATRIX
D3DXMatrixIdentity Mtrx
d3dDevice.SetTransform D3DTS_WORLD, Mtrx

D3DXMatrixPerspectiveFovLH Mtrx, Pi / 4, frmD3D.ScaleHeight / frmD3D.ScaleWidth, 0.5, 10
d3dDevice.SetTransform D3DTS_PROJECTION, Mtrx

D3DXMatrixLookAtLH Mtrx, vec3(0, 1, -3), vec3(0, 0, 0), vec3(0, 1, 0)
d3dDevice.SetTransform D3DTS_VIEW, Mtrx
End Sub

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Private Sub Render()
d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &H346666, 1, 0
d3dDevice.BeginScene

d3dDevice.EndScene
d3dDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

2.7. Имитация отражения. Spherical Environment Mapping
До сих пор мы использовали для наложения текстур координаты, непосредственно заданные в вертексах. Существуют и другие способы, при которых текстурные координаты рассчитываются непосредственно при растеризации. Один из наиболее распространенных подходов – расчет текстурных координат исходя из позиции вертекса и камеры и нормали вертекса, используемый для имитации отражений. Все расчеты производит DirectX, освобождая нас от изучения оптики.
Возьмем наш предыдущий проект, оставив в InitMesh генерацию чайника:

Первые шаги в изучении 3D-графики

Ответы на распространённые вопросы о 3D. Вполне возможно, вы найдёте здесь что-то полезное.

Раньше это было руководство, на 90% скопированное с мёртвого CG раздела 4chan, потом его переработали на форуме MapCore, а сейчас я его подогнал под интересы нашего сайта. Теперь это плагиат лишь частично.

Paper story — Mohamed Chahin, сделано в Blender;

С чего начать первые шаги в 3D?

Начинать можно по-разному, но проще всего с 3D-редактора. Выбор перед вами широкий:

  • Maya (Много доступной документации наряду с 3ds Max);
  • 3ds Max (Много доступной документации наряду с Maya);
  • Cinema 4D (Больше популярен в индустрии рекламы, чем в в игровой);
  • Modo (Я им не пользовался, вроде популярный среди моделлеров);
  • Houdini (3D-редактор, и среда визуального программирования для сложных процедурных моделей и эффектов);
  • Blender (Бесплатный и не перегружен, как 3ds Max и Maya. Популярен у специалистов 3D-печати. Где-то мощнее других, где-то слабее.).

И несколько вспомогательных программ:

  • Marvelous Designer (Создание одежды и Симуляция ткани);
  • Substance Designer и Substance Painter (Создание процедурно-генерируемых материалов и текстур);
  • MARI (еще один пакет для создания текстур).

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

Wooden House of Northern Kingdom — Mile Mićić, сделано в 3ds Max

Ого! Сколько всяких программ! А какая лучше? Я слышал, что ______ лучшая.

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

Ага, значит есть универсальные и специализированные? А как их распознать?

Универсальные пакеты (3ds Max, Maya, Blender) позволяют создавать модели, рендеры, анимацию, текстуры и динамику в рамках одного приложения. Они не требуют сторонних плагинов или приложений для выполнения базовых задач. Однако с помощью плагинов имеющийся функционал можно расширять.

О-о-о, это же Zbrush, в нём сделано столько отличных работ, начну-ка я с него!

Нет, вы забегаете далеко вперёд. Перед те, как браться за Zbrush, следует изучить базовые принципы и основы моделирования. Zbrush – великолепная программа для продвинутых пользователей, занимающихся тонкой доработкой своих моделей или быстрым прототипированием. Не зная общих концепций 3D, учиться работать в Zbrush – не лучшая идея.

Speed Sculpt_ Dragon — Keita Okada, сделано в ZBrush и отрендерено в Keyshot

Ладно, я понял, это не совсем моё, можете сделать для меня модель ______?

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

Но это же так сложно, есть какое-нибудь простое решение? Мне не хватает мотивации.

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

Так какой редактор проще всего изучить?

Нет, вам не нужно изучать софт. Сосредоточьтесь на изучении техник. Когда вы хорошо овладеете какой-либо техникой, программа станет лишь инструментом для достижения желаемого результата. Как уже было сказано, больше всего курсов и документации по 3ds Max и Maya, но вам следует учиться моделированию и грамотному использованию различных техник, а не зубрить, что делает каждая кнопка. Информацию об интерфейсе ищите в справочных материалах. F1 и Google – ваши верные друзья.

Gateway — Pedro Silva, сделано в Modo, Marvelous Designer и доработано в PhotoShop

На что смотрят студии при приёме на работу? Если я не знаю программу ______, меня могут не взять?

Рассматривая портфолио и резюме, студия оценивает ваши умения, отдавая им следующий приоритет:

  • Качество работы;
  • Универсальность навыков;
  • Опыт;
  • Умение работать с софтом.

Значит, им без разницы, в чём я работаю? И почему так важна универсальность?

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

Глядя на ваше знание софта, студии учитывают редактор, которым пользуются сами, но очень часто у них будут и свои собственные инструменты, так что этот вопрос несильно важен, пока вы хорошо разбираетесь в своём деле. При владении теорией и знании нужных техник, подробное знакомство с любым софтом – вопрос нескольких дней. Конечно, бывают и сложные случаи, когда вы прежде работали только в программе ______, но зачастую опыт работы с конкретными 3D-пакетами не имеет значения (да, блендерфаги, даже вас могут взять на работу при должном уровне навыков).

Если решили заняться созданием ассетов, то основное внимание нужно обращать на модели, текстуры и анимацию.

Низкополигональное моделирование – само по себе искусство, извлечение максимально возможного количества деталей из скромной кучки полигонов требует практики, и выработанной формулы здесь не существует. Создав модель, вы заставляете её выглядеть лучше с помощью UV-развёртки и рельефного текстурирования.

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

Cписок полезных ссылок

  • http://render.ru/ — сообщество и текстовые уроки, выпускают журнал про 3D;
  • http://3dpapa.ru/ — блог о 3D-графике;
  • http://3ddd.ru/ — еще один сайт на русском языке.

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

  • DigitalTutors.com, который сейчас стал называться Pluralsight Creative;
  • The Gnomon Workshop — курсы по 30+ часов;
  • Lynda.com — еще одна компания, предоставляющая услуги онлайн-обучения;
  • Udemy.com — и еще одна;
  • UArtsy.com — школа онлайн-искусств;
  • Allegorithmic — куча качественных бесплатных уроков про текстуры на youtube.com;
  • CGElves.com — тут ищите разнообразные уроки по Marvelous Designer.

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

На следующем этапе вас подстерегает проклятие новичка в виде прохождения одних только курсов и чтобы его избежать, постарайтесь быстрее перейти к созданию готовых продуктов. Если вы изучаете 3D только для игр, начните с создания карт к ним, например с помощью Source SDK. У вас есть опыт программирования? Сразу переключайтесь на игровые движки вроде Unreal или Unity. Когда вы получите первые отзывы от использования ваших работ, вы с новой силой захотите совершенствоваться в таком нелегком деле как компьютерная графика.

Можно ли совместить знания программиста и 3D работу: ответ на письма

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Создание своих или чужих 3D игр на готовых игровых движках. Вот, к примеру, я с другом-программистом (Сергеем) делаю игру. Чтобы сделать игру на движке Unity понадобится знание языка Javascript, .NET (C#), баз данных, облачных технологий (Microsoft Azure) — это то, что использует Сергей.
  • Разработка игрового движка с нуля.
  • Создание сайтов для просмотра и редактирования 3D контента прямо в браузере онлайн (HTML5, WebGL).
  • Написание плагинов/рендереров для 3ds Max, Maya, Houdini и других 3D-пакетов. Здесь нужно знать язык Python или С++. А начать можно с написания скриптов на MAXScript (для 3ds Max) или MEL (для Maya). Скрипты обычно решают повседневные проблемы/задачи 3D-шников, которые они повторяют по много раз. К примеру, перед тем как нажать кнопку Render (даже если он тестовый), нужно выбрать нужную папку, создать там новую папку, придумать имя для файла, указать расширение изображения, выбрать настройки для сохранения картинки и только потом нажать Рендер. Это всё можно автоматизировать, а значит сэкономить тридешнику уйму времени.
  • Устроится в R-n-D отдел какой-то анимационной студии. Это почти то же самое, что и пункт выше, но здесь вы будете писать инструменты, которые никто, кроме вашей команды, не сможет использовать
  • Выбрать практически любую классическую профессию 3D- или VFX-художника. В любом таком деле вы найдёте применение вашим навыкам программиста.

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

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

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

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

Подпишитесь на обновление блога (вот 3 причины для этого).

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

Похожие статьи:

  • Работать на любимой работе за еду или на… Возможно, название кажется странным или пессимистичным, но это не так и прочитав статью вы поймёте почему. В неё я органично…
  • Ответ на письмо: нужно ли уметь рисовать для… Идея для занятия бизнесом: перепродажа с наценкой. На отличном сайте princess-shoes.com.ua продается женская обувь оптом, которую потом можно реализовать у…
  • Моделер. Кто он? Ответы на наболевшие вопросы [1/2] Начинаю понемножку отвечать на письма пришедшие во время моего отпуска. Приветствую вас, Роман! Сразу скажу, что мне нет прощения за…
  • Можно ли освоить 3D без подготовки и… Не придумал вступления, поэтому сразу перейду к следующему письму из рубрики Вопросы 3D-художников :)))) Письмо. Здравствуйте, уже год читаю ваш…
  • Куда пойти после школы, если я хочу связать свою… Как это всегда бывает перед летом мне всё чаще пишут сознательные выпускники школ с такими вопросами: Куда же пойти учиться…
  • О гибких навыках 3D-шника (помимо технических и… Это не урок по программированию. Это не рассказ о создании приложения. Это не тутор по Unity. Это история о том,…
  • Фриланс аутсорсинг, он есть или нет? Так ли он… Когда мы еще независимы — мы мечтаем устроиться на работу, а когда мы уже взрослые, то работа оказывается совсем не…

Вам понравилась статья ? Хотите отблагодарить автора? Расскажите о ней друзьям.
Или подпишитесь на обновление блога по E-Mail.

Читать еще:  Ошибка 491 плей маркет
Ссылка на основную публикацию
Adblock
detector