ГлавнаяРегистрацияВход
Приветствую Вас Гость | RSS
Главная » Статьи » Game Maker » Game Maker

3D Графика

3D Графика

Это функциональное назначение доступно только в зарегистрированной версии Game Maker.

Game Maker является программой предназначенной для создания 2-ухмерных и изометрических игр. Но всё же существуют некоторые функциональные назначения, которые позволят создать 3-ёхмерную графику. Прежде чем Вы начнёте изучать эту главу, существует несколько вещей для пояснения.

  • 3D функциональное назначение в Game Maker ограничено графической частью. Оно не поддерживает других 3D функциональных назначений. Как только Вы начнёте использовать 3D графику, то можете получить проблемы с другими аспектами Game Maker, например: с видами, указываемой глубиной и т.п. Функциональное назначение ограничено и имеет по умолчанию низкий приоритет, который нужно повысить. Так что не рассчитывайте на поддержку 3D моделей и т.п.
  • Когда Вы используете 3D функциональное назначение, то некоторые вещи не могут больше использоваться.
    • Вы не сможете больше использовать изображения ни фонового, ни переднего плана. (Причина в том, что они изразцовые (основанные на тайлах), и замощение изображения в перспективном проектировании - долго не проработает).
    • Вы не можете больше использовать курсор мыши. Мышь не будет конвертирована в 3D координаты. Вы можете всё ещё получить позицию мыши на экране (в виде), но Вы должны сами производить необходимые вычисления (либо вообще не использовать мышь).
    • Вы больше не можете использовать тайлы. Тайлы, скорее всего, будут неправильно сочетаться.
    • Проверка столкновения всё ещё может использоваться 2-d позициями образцов объекта в комнате. Также столкновение в 3D не обнаруживается. Иногда Вы можете всё ещё использовать это (если Вы используете комнату как представление плоского мира, например: гонки или FPS игры), но в других ситуациях - Вы должны сами определять события.
  • Всё 3D функциональное назначение осуществляется через код. Вы, по-видимому, должны хорошо знать GML. Также Вы действительно должны много понять о том, как Game Maker будет работать, в противном случае Вы столкнётесь с проблемами.
  • Вы также должны знать немного основных понятий о 3D графике. В частности, Я использую условия подобно перспективной проекции: скрытие удаляемой поверхности, освещение и туман без значительных объяснений.
  • В Game Maker Вы не сможете моделировать в 3D. Также, Я не планирую добавления поддержки загрузки 3D моделей.
  • Вы должны прорабатывать всё очень тщательно, чтобы оптимизировать игру. Также учтите, что некоторые вещи не могут быть оптимизированы.

Если это Вас не обескуражило, то изучите главу подробнее.

Информация о 3D графике может быть обнаружена на следующих страницах:

Переход в 3D режим
Простое рисование
Рисование полигонов в 3D
Рисование основных форм
Просмотр окружения
Преобразования
Туман
Освещение
Создание моделей
Заключительные слова

 

Переход в 3D режим

Если Вы хотите использовать 3D режим, то Вы сначала должны установить Game Maker в 3D режим. Вы можете при желании, потом переключиться в 2D режим. Для этого существуют две следующие функции.

d3d_start() Начало использования 3D режима. Возвращает, если успешно.
d3d_end() Завершение использования 3D режима. Возвращает, если успешно.

Отметьте, что все функции имеющие отношение к 3D режиму начинаются с: d3d_.

Запуск 3D режима внесёт следующие изменения. Прежде всего, будет включено скрытое поверхностное удаление (использование 16-бит z-буфера). Это означает, что для каждого пикселя на экране будет выполняться рисование только с помощью минимальной z-величины (= значение глубины). Если образцы объекта имеют одинаковую глубину, то это может вызвать недоразумения, при которых Вы можете получить безобразные эффекты. Убедитесь, что образцы не имеют одинаковое значение глубины!

Во-вторых, нормальное орфографическое проектирование заменяется перспективным. Это означает следующее. Обычный размер образцов объекта на экране независим от присвоенной глубины. С перспективным проектированием образцы объекта имеют меньшую глубину. Когда глубина 0, то она равняется старому размеру (если Вы не изменяете проектирование; смотрите ниже). Точка обзора для камеры устанавливается на расстоянии выше комнаты. (Это расстояние равняется ширине комнаты; что предоставляет проектирование по умолчанию.) Образцы объекта будут нарисованы только перед камерой. Так что не используйте образцы с глубиной меньше чем 0 (или, по крайней мере, меньше чем -w, где w - ширина комнаты или вида).

В-третьих, возвращается y-координата. Обычно позиция находиться в верхней левой позиции (0,0) вида, а в 3D режиме - в левой нижней позиции (0,0), что является нормальным для 3-ёхмерных видов.

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

d3d_set_hidden(enable) Включает скрытое поверхностное удаление (истина) или его отключает (ложь).
d3d_set_perspective(enable) Включает использование перспективного проектирования (истина) или его отключает (ложь).

 

Простое рисование

Как только 3D режим включён, Вы можете использовать Game Maker как и использовали (за исключением замечаний сделанных в начале). Только объекты будут основаны в других размерах основанных на их установках глубины. Вы можете даже использовать виды. Одна дополнительная функция может быть полезной. Если Вы делаете множество вещей в части кода, то Вы могли бы захотеть изменить величину глубины между простым своим рисованием. Для этого Вы используете:

d3d_set_depth(depth) Устанавливает глубину, используемую для рисования.

Отметьте, что в это время новый образец объекта рисует глубину повторно.

 

Рисование полигонов в 3D

Проблема рисования прошлым путём состоит в том, что спрайт или полигон всегда (ложь) находиться в плоскости xy, то есть, все углы имеют одинаковую глубину. Для 3D, Вы захотите иметь грани в других глубинах (истина). С этого момента мы поговорим о z-координате, а не о глубине. Итак, мы хотим определить координаты (x,y,z) кортежей. Для этого имеется специальная версия продвинутых функций рисования:

d3d_primitive_begin(kind) Начинает с 3D примитива указанного типа: pr_pointlist, pr_linelist, pr_linestrip,pr_trianglelist,pr_trianglestrip или pr_trianglefan.
d3d_vertex(x,y,z) Добавляет вершину (x,y,z) в примитив, используя величину цвета и альфа прозрачности установленных прежде.
d3d_vertex_color(x,y,z,col,alpha) Добавляет вершину (x,y,z) в примитив, со своей собственной цветовой и альфа значением. Это позволит Вам создать примитивы с гладко изменяющимися цветовыми и альфа значениями.
d3d_primitive_end() Заканчивает описание примитива. Эта функция в действительности его рисует.

Например, чтобы нарисовать четырёхгранник (трёхстороннюю пирамиду) располагаясь на z=0 плоскости с вершиной в z = 200, Вы можете использовать следующие коды:

{
  d3d_primitive_begin(pr_trianglelist);
    d3d_vertex(100,100,0);
    d3d_vertex(100,200,0);    
    d3d_vertex(150,150,200);
    d3d_vertex(100,200,0);
    d3d_vertex(200,200,0);    
    d3d_vertex(150,150,200);
    d3d_vertex(200,200,0);
    d3d_vertex(100,100,0);    
    d3d_vertex(150,150,200);
    d3d_vertex(100,100,0);
    d3d_vertex(100,200,0);    
    d3d_vertex(200,200,0);
  d3d_primitive_end();
}

Теперь, используя это, наиболее вероятно, Вы должны просто видеть треугольник на экране, поскольку верхушка четырёхгранника будет находиться за ним с точки зрения вида. Также, используя просто один цвет, будет трудно увидеть другие лицевые стороны. Ниже мы увидим, как пути изменяли точку зрения вида. "Назначитель" цветов может быть создан перед дополнительной функцией draw_set_color(col), вызванной между гранями.

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

d3d_primitive_begin_texture(kind,texid) Начинает с 3D примитива указанного типа kind с указанной текстурой texid.
d3d_vertex_texture(x,y,z,xtex,ytex) Добавляет вершину (x,y,z) в примитив с позицией (xtex,ytex) в текстуре, смешивающейся с цветовым и альфа значением, установленных прежде.
d3d_vertex_texture_color(x,y,z,xtex,ytex,col,alpha) Добавляет вершину (x,y,z) в примитив с позицией (xtex,ytex) в текстуре, смешивающейся со своим собственной цветовым и альфа значением.
d3d_primitive_end() Заканчивает описание примитива. Эта функция в действительности его рисует.

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

{
  var ttt;
  ttt = background_get_texture(back);
  d3d_primitive_begin_texture(pr_trianglefan,ttt);
    d3d_vertex_texture(0,480,0,0,0);
    d3d_vertex_texture(640,480,0,1,0);    
    d3d_vertex_texture(640,480,1000,1,1);
    d3d_vertex_texture(0,480,1000,0,1);
 
 
  d3d_primitive_end();
}

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

d3d_set_culling(cull) Указывает, запустить ли отбор задней лицевой стороны (истина) или остановить отбор задней лицевой стороны (ложь).

 

Рисование основных форм

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

d3d_draw_block(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat) Рисует блок в текущем цвете с указанными противоположными углами, используя указанную текстуру. Используйте -1, чтобы не использовать текстуру. hrepeat - указывает, как часто текстура должна быть повторена вдоль каждого горизонтального лицевого края. vrepeat - проделывает всё так же, но для вертикального лицевого края.
d3d_draw_cylinder(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat,closed,steps) Рисует вертикальный цилиндр в текущем цвете в окошках bounding box, используя указанную текстуру. Используйте -1, чтобы не использовать текстуру. hrepeat - указывает, как часто текстура должна быть повторена вдоль каждого горизонтального лицевого края. vrepeat - проделывает всё так же, но для вертикального лицевого края. closed - указывает закрытие верха и низа цилиндра. steps - указывает, сколько шагов вращения должно быть задействовано. Типичная величина - 24.
d3d_draw_cone(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat,closed,steps)Рисует вертикальный конус в текущем цвете в окошках bounding box, используя указанную текстуру. Используйте -1, чтобы не использовать текстуру. hrepeat - указывает, как часто текстура должна быть повторена вдоль каждого горизонтального лицевого края. vrepeat - проделывает всё так же, но для вертикального лицевого края. closed - указывает закрытие верха и низа конуса. steps - указывает, сколько шагов вращения должно быть задействовано. Типичная величина - 24.
d3d_draw_ellipsoid(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat,steps) Рисует эллипс в текущем цвете в указанной области (bounding box), используя указанную текстуру. Используйте -1, чтобы не использовать текстуру. hrepeat - указывает, как часто текстура должна быть повторена вдоль каждого горизонтального лицевого края. vrepeat - проделывает всё так же, но для вертикального лицевого края. steps - указывает, сколько шагов вращения должно быть задействовано. Типичная величина - 24.
d3d_draw_wall(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat) Рисует вертикальную стену в текущем цвете с заданными углами, используя указанную текстуру. Используйте -1, чтобы не использовать текстуру. hrepeat - указывает, как часто текстура должна быть повторена вдоль каждого горизонтального лицевого края. vrepeat - проделывает всё так же, но для вертикального лицевого края.
d3d_draw_floor(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat) Рисует (наклонный) пол с заданными углами, используя указанную текстуру. Используйте -1, чтобы не использовать текстуру. hrepeat - указывает, как часто текстура должна быть повторена вдоль каждого горизонтального лицевого края. vrepeat - проделывает всё так же, но для вертикального лицевого края.

Следующая часть кода рисует два блока:

{
  var ttt;
  ttt = background_get_texture(back);
  d3d_draw_block(20,20,20,80,40,200,ttt,1,1);  
  d3d_draw_block(200,300,-10,240,340,100,ttt,1,1);  
}

 

Просмотр окружения

По умолчанию, Вы смотрите вдоль негатива оси z по отношению к середине комнаты. Часто в 3D играх Вы захотите изменить просмотр окружения. Например, в FPS, Вы, вероятно, захотите иметь вид камеры из позиции немного выше плоскости xy вдоль плоскости xy. В течение графических условий, Вы устанавливаете правильное проектирование. Чтобы изменить путь, ознакомьтесь с двумя существующими функциями.

d3d_set_projection(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup) Определяет просмотр окружения. Вы определяете точку просмотра from (от), и точку для просмотра по верхнему вектору.

Эта функция требует некоторое объяснение. Чтобы установить проектирование, Вам сначала нужна позиция просмотра from (от). Она указывается параметрами (xfrom,yfrom,zfrom). Затем Вы должны определить направление просмотра. Это делается посредством подачи точек секунды, для просмотра towards (к). Это точка (xto,yto,zto). Наконец, Вы можете всё ещё вращать камеру вокруг линии с точки вида в точку просмотра. Для того чтобы определить это, мы должны задать верхний вектор, то есть, направление, которое находиться вверху камеры. Это задаётся последними тремя параметрами (xup,yup,zup). Позвольте мне предоставить пример. Чтобы смотреть вдоль плоскости xy как в FPS Вы можете использовать

{
  d3d_set_projection(100,100,10,200,100,10,0,0,1);
}

Итак, Вы смотрите из точки (100,100) и 10 - выше плоскости в направлении (200,100). Верхние векторные точки являются z-направлением, как это и нужно. Для того чтобы сделать это более усложнённым - представьте, что у Вас есть образец объекта в Вашей комнате, который определяет позицию камеры. У него будет текущая позиция (x,y) и направление (и, возможно, равная скорость). Теперь Вы можете определить это как камеру, используя следующий код:

{
  with (obj_camera)
    d3d_set_projection(x,y,10,
               x+cos(direction*pi/180),y-sin(direction*pi/180),10,
               0,0,1);
}

Это может выглядеть немного сложно. Мы смотрим из позиции камеры (x,y), 10 - выше земли. Чтобы определить точку в правильном направлении, нам нужно заняться небольшой арифметикой. Эта точка указывается следующими тремя параметрами. Наконец мы используем верхний вектор, как и в случае выше.

Одно важное замечание! Когда Game Maker начинает рисовать комнату, то он устанавливает точку вида в встроенную по умолчанию позицию. Итак, первая вещь, которую Вы должны делать при рисовании сцены - набор желаемых проектирований. Это должно быть указано в событии рисования!

Имеется немного расширенная версия вышеупомянутой функции:

d3d_set_projection_ext(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup,angle,aspect,znear,zfar) Расширенная версия вышеуказанной функции, в которой Вы дополнительно определяете: угол, определяющий поле зрения, отношение свободной длины к высоте между горизонтальным и вертикальным размером вида, и близко или далеко вырезать плоскости.

Дополнительные параметры работают следующим образом. Если Вы определили позицию камеры - укажите точки просмотра и верхний вектор. Вы можете всё ещё изменить широкую линзу камеры. Это называется - поле зрения. Разумная величина - 45 градусов и это значение по умолчанию. Но Вы можете изменить это значение. Затем Вы можете определить отношение свободной длины к высоте между горизонтальным и вертикальным проектированием. Обычно Вы захотите использовать такое же проектирование, которое имеет и аспекты комнаты или вида, например: 640/480. Наконец, Вы можете указать вырезание плоскости. Объекты, находящиеся ближе, чем в позиции znear (ближняя z-плоскость) - в камере не рисуются. Аналогично и для объектов, находящихся дальше плоскости zfar. (дальняя z-плоскость). Это может быть важным, чтобы установить эти параметры в разумные величины, поскольку они также влияют точность z-comparisons (сравнения). Если Вы делаете диапазон слишком большим, то точность получается хуже. По умолчанию используется 1 и 32000. znear должно быть больше 0!

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

d3d_set_projection_ortho(x,y,w,h,angle) Устанавливает обычное орфографическое проектирование указанной области в комнате и вращение над указанным углом.
d3d_set_projection_perspective(x,y,w,h,angle) Устанавливает обычное перспективное проектирование обозначенной области в комнате, вращаемой по указанному углу.

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

{
  draw_set_color(c_black);
  d3d_set_projection_ortho(0,0,room_width,room_height,0);
  d3d_set_hidden(false);
  draw_text(10,10,'Score: ' + string(score));
  d3d_set_hidden(true);
}

 

Преобразования

Преобразования позволяют Вам изменить место в мире, в котором происходит рисование определённых вещей. Например, функция для рисования блоков, может нарисовать только "ось-параллельные" блоки. Сначала, установив вращение преобразования, Вы можете создать вращающиеся блоки. Также спрайты всегда рисуются параллельно плоскостям xy. Устанавливая преобразование, Вы можете его изменить. Существует два типа функций: одна - для установки преобразования и вторая - для добавления преобразования.

d3d_transform_set_identity() Устанавливает преобразование в тождество (без преобразования).
d3d_transform_set_translation(xt,yt,zt) Устанавливает преобразование в перевод над указанным вектором.
d3d_transform_set_scaling(xs,ys,zs) Устанавливает преобразование в масштабирование с указанными суммами.
d3d_transform_set_rotation_x(angle) Устанавливает преобразование во вращение вокруг оси х с указанной суммой.
d3d_transform_set_rotation_y(angle) Устанавливает преобразование во вращение вокруг оси y с указанной суммой.
d3d_transform_set_rotation_z(angle) Устанавливает преобразование во вращение вокруг оси z с указанной суммой.
d3d_transform_set_rotation_axis(xa,ya,za,angle) Устанавливает преобразование во вращение вокруг оси указанного вектора с помощью указанной суммы.
d3d_transform_add_translation(xt,yt,zt) Добавляет перевод над указанным вектором.
d3d_transform_add_scaling(xs,ys,zs) Добавляет масштабирование с указанными суммами.
d3d_transform_add_rotation_x(angle) Добавляет вращение вокруг оси x с указанной суммой.
d3d_transform_add_rotation_y(angle) Добавляет вращение вокруг оси y с указанной суммой.
d3d_transform_add_rotation_z(angle) Добавляет вращение вокруг оси z с указанной суммой.
d3d_transform_add_rotation_axis(xa,ya,za,angle) Добавляет вращение вокруг оси указанного вектора с помощью указанной суммы.

Поймите, что вращение и масштабирование, которые касаются начала мира, не касаются объекта, который должен быть нарисован. Если объект находиться не в начале, то он может переместиться в другое место - не в то, что нужно. Чтобы, например, вращать объект вокруг своей оси x, мы должны сначала перевести его в начало, затем его вращать и, наконец, перевести его в свою позицию. Необходимы некоторые функции для установки преобразований.

Следующие примеры могут пояснить это подробнее. Допустим, что у Вас есть спрайтspr, который Вы хотите нарисовать в позиции (100,100,10). Для этого Вы можете использовать следующие коды.

{
  d3d_transform_set_translation(100,100,10);
  draw_sprite(spr,0,0,0);
  d3d_transform_set_identity();
}

Отметьте, что поскольку мы используем перевод, то мы должны теперь нарисовать спрайт в позиции (0,0). (Это предполагает, что текущий образец объекта имеет глубину 0! Если Вы не уверены, то устанавливайте первоначальную глубину.) Если мы должны использовать это в своём FPS, то мы не захотим видеть спрайт. Причина в том, что он всё ещё параллелен плоскости xy. Мы захотим вращать его свыше 90 градусов вдоль оси x (или оси y). Итак, нам нужно добавить вращение. Запомните порядок: мы должны сначала вращать спрайт, а затем его перевести. Итак, мы можем использовать следующие коды.

{
  d3d_transform_set_identity();
  d3d_transform_add_rotation_x(90);
  d3d_transform_add_translation(100,100,10);
  draw_sprite(spr,0,0,0);
  d3d_transform_set_identity();
}

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

d3d_transform_stack_clear() Очищает стек преобразований.
d3d_transform_stack_empty() Возвращает, когда стек преобразования пуст.
d3d_transform_stack_push() Выталкивает текущее преобразование в стек. Возвращает, если преобразование находилось в размещённом стеке, чтобы выгрузить его оттуда (если Вы забываете выгрузить преобразования, то Вы в некоторых моментах можете испытать недостаток памяти для размещаемого стека).
d3d_transform_stack_pop() Выгружает верхнее преобразование из стека и делает его текущим. Возвращает, если было преобразование в стеке.
d3d_transform_stack_top() Делает верхнее преобразование текущим, но не удаляет это из стека. Возвращает, если в стеке произошло преобразование.
d3d_transform_stack_discard() Удаляет верхнее преобразование из стека, но не делает его текущим. Возвращает, если в стеке произошло преобразование.

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

 

Туман

В 3D играх может использоваться туман для "размытия" объектов на расстоянии или даже позволять им исчезать. Это помогает создать необходимую атмосферу и предоставляет возможность не рисовать объекты, которые находятся вдалеке. Чтобы включить или отключить туман существует следующая функция:

d3d_set_fog(enable,color,start,end) Включает или отключает эффект тумана. color - указывает цвет тумана. start - указывает расстояние, в котором эффект тумана должен запуститься. end - указывает расстояние максимальной видимости в тумане.

Лучше осознать, что действительно случается: фактически имеется два типа тумана, таблица базируется туманом и его вершиной. Первый тип вычисляет значения тумана на основе пикселей. Второй тип вычисляет значение тумана для каждой вершины и затем их интерполирует. Первый тип лучше, но не всегда поддерживается. Game Maker пробует использовать таблицу базирования тумана, когда получается её поддерживать, иначе использует базирование вершины туман (если тот туман не поддерживается). Обратите внимание, что некоторая графика карты указывает, что они могут обращаться с таблицей, базируя туман, но предложить пользователю отключить эти продвинутые возможности в установках экрана. В таком случае результат может преподнести чёрный экран!

 

Освещение

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

Чтобы включить освещение Вы можете использовать следующую функцию:

d3d_set_lighting(enable) Включает или отключает использование освещения.

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

d3d_set_shading(smooth) Устанавливает или не устанавливает использование эффекта плавного затенения.

Чтобы использовать освещение, Вам, очевидно, нужно его определить. Существуют два типа освещения: направленное освещение (подобно солнцу) и позиционное освещение. Свет имеет цвет. (Мы поддерживаем только рассеиваемый свет - не спекулярное отражение.) Для определения и использования освещения существуют следующие функции:

d3d_light_define_direction(ind,dx,dy,dz,col) Определяет направление освещения. ind - индекс света (используйте небольшое положительное число). (dx,dy,dz) - направление освещения. col - является цветом света (часто Вы будете использовать c_white. Эта функция освещение не включает.
d3d_light_define_point(ind,x,y,z,range,col) Определяет точку освещения. ind - является индексом света (используйте небольшое положительное число). (x,y,z) - позиция освещения. range - указывает сияние освещения. Интенсивность освещения будет уменьшена после уменьшения последнего значения. col - цвет света. Эта функция освещение не включает.
d3d_light_enable(ind,enable) Включает (истина) или отключает (ложь) освещение числа ind.

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

d3d_vertex_normal(x,y,z,nx,ny,nz) Добавляет вершину (x,y,z) в примитив с обычным вектором (nx,ny,nz).
d3d_vertex_normal_color(x,y,z,nx,ny,nz,col,alpha) Добавляет вершину (x,y,z) в примитив с обычным вектором (nx,ny,nz) и с некоторым цветом и значением альфа.
d3d_vertex_normal_texture(x,y,z,nx,ny,nz,xtex,ytex) Добавляет вершину (x,y,z) в примитив с обычным вектором (nx,ny,nz) и с позицией (xtex,ytex) в текстуре, смешивающейся с цветом и с альфа значением, установленных прежде.
d3d_vertex_normal_texture_color(x,y,z,nx,ny,nz,xtex,ytex,col,alpha) Добавляет вершину (x,y,z) в примитив с обычным вектором (nx,ny,nz) с позицией (xtex,ytex) в текстуре, смешивающейся с некоторым цветом и альфа значением.

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

 

Создание моделей

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

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

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

d3d_model_create() Создаёт новую модель и возвращает её индекс. Этот индекс используют все другие функции, имеющие дело с моделями.
d3d_model_destroy(ind) Уничтожает модель с заданным индексом, освобождая его память.
d3d_model_clear(ind) Очищает модель с заданным индексом, удаляя все его примитивы.
d3d_model_save(ind,fname) Сохраняет модель под указанным файловым названием.
d3d_model_load(ind,fname) Загружает модель из указанного файлового названия.
d3d_model_draw(ind,x,y,z,texid) Рисует модель в позиции (x,y,z). texid - текстура, которая должна быть использована. Используйте -1, если Вы не хотите использовать текстуру. Если Вы хотите вращать или масштабировать модель, Вы можете использовать п

Категория: Game Maker | Добавил: Strateg (27.12.2010)
Просмотров: 5672 | Комментарии: 2 | Рейтинг: 4.7/3
Всего комментариев: 2
2 Марсель  
0
Всё для создания игр - http://юасок.рф

1 paytightihos  
0
hi

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Меню сайта

-=ЯП=-

Конструктор\Движки

Игроделу

Наш опрос
Какого жанра игр, вы предпочитаете делать?
Всего ответов: 56

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

DiamonD
Бесплатный конструктор сайтов - uCoz