Blitz3d - трехмерная сцена и объекты

Структура трехмерной сцены и проекция ее на экран

Трехмерная система координат - это двумерная система с дополнительной осью z. Каждая точка в трехмерной системе координат имеет не две, а три координаты.
Начало координат - точка О(0, 0, 0) в ней пересекаются все координатные оси. Точка О разбивает все оси на 2 луча. Луч, по направлению совпадающий с направлением оси называется положительной полуосью, другой - отрицательной. Трехмерной сценой называется совокупность трехмерных объектов, заданных в трехмерной системе координат. Представьте себе съемки фильма: расставляются декорации, выходят актеры (все это по сути является трехмерными объектами) и затем сцена снимается на видеопленку с помощью камеры. Позже, мы можем посмотреть фильм на двумерном экране телевизора. То есть, с помощью камеры трехмерный мир проецируется на двумерный экран. Точно так же и трехмерная сцена с помощью виртуального объекта – камеры проецируется на экран монитора

Экран

Экран монитора можно представить, как прямоугольный лист бумаги в клетку, где каждая клетка имеет свой цвет. Клетки экрана называются пикселями. Разрешение экрана - это количество пикселей по горизонтали и вертикали. Уже при разрешении 640х480 пиксели достаточно малы, чтобы мы могли видеть качественное изображение, к примеру, фотографии или рабочего стола.
Установка режима экрана производится с помощью следующей команды (параметр, находящийся в квадратных скобках вводить не обязательно):

GRAPHICS3D ширина, длина [,глубина_цвета] [,режим] 

Возможные режимы экрана: 320х200, 640х480, 800х600, 1024х768. Глубина цвета может быть 16 или 32 бит на пиксель - картинка с большей глубиной цвета качественней картинки с меньшей. Режимы: 0 - авто, 1 - показ рабочего поля в окне, 2 - поле развернуто на весь экран.

Адресация объектов

Теперь перейдем к программированию. Каждый созданный трехмерный объект в Blitz3D имеет адрес, по которому к нему можно обращаться. Этот адрес заносится в переменную при создании объекта, например:

SphereAddr = CREATESPHERE()

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

Простейшие объекты

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

Куб: a = CREATECUBE([род])
Сфера: a = CREATESPHERE([детализация] [,род])
Цилиндр: a = CREATECYLINDER([детализация] [,наличие оснований] [,род])
Конус: a = CREATECONE([детализация] [,наличие основания] [,род]) 

Параметр “наличие оснований” может быть равен 0 (нет оснований) и 1 (есть основания).
Все тела вращения, как и все объекты, составлены из граней. Детализация - параметр, указывающий, насколько объект будет приближен по форме к идеалу (сфера с большей детализацией будет иметь больше граней, выглядеть более округлой, зато на ее прорисовку понадобится больше времени).
О параметре “род” будет рассказано позже.

Камера

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

a = CREATECAMERA([род]) 

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

Двойная буферизация и визуализация

При инициализации режима экрана, Blitz3D создает еще один скрытый экран - экранный буфер, который невидим для пользователя. Команда RENDERWORLD отображает все, что находится в поле зрения камеры на этот скрытый экран, а команда FLIP копирует содержимое экранного буфера на экран. Для чего это делается? Предположим, вы создаете трехмерный мир с массой объектов. Если визуализировать его прямо на экране, то пользователь сможет наблюдать весь процесс, то есть объекты будут появляться один за другим. Обычно, в программах требуется часто менять содержимое экрана, в зависимости от положения камеры - стирать старый образ и тут же создавать новый. Двойная буферизация позволяет избавиться от неприятного мерцания экрана при этом, так как визуализация происходит на скрытом от глаз пользователя экране.
Далее будут описаны простейшие трансформации и движения объектов, изменения их свойств, необходимые для построения моделей, а также освещение. Хотя освещение – довольно комплексный процесс, в данном спецкурсе он рассматривается без углубления в подробности, используется простейший метод.
Позиционирование объектов
Если камера будет в одной и той же точке, что и сфера, мы увидим сферу изнутри. Чтобы этого не произошло, нужно переместить ее в другую точку. Это можно сделать с помощью следующей команды:

POSITIONENTITY объект, X, Y, Z

Точно так же можно двигать и другие объекты. Итак, теперь мы можем вывести на экран сферу:

GRAPHICS3D 640, 480, 32
Camera = CREATECAMERA()
Sphere = CREATESPHERE(20)
POSITIONENTITY Sphere, 0, 0, 5
RENDERWORLD
FLIP
WAITKEY

Пока мы видим только смутные очертания объекта. Поменяйте сферу на конус или цилиндр.
Угол поворота объектов
Для каждого объекта можно задать угол поворота командой:

ROTATEENTITY объект, RX, RY, RZ

RX, RY, RZ - угол поворота в градусах относительно осей X, Y и Z соответственно.
Пример (изменим несколько строк в предыдущей программе):

GRAPHICS3D 640, 480, 32
cam = CREATECAMERA()
cone = CREATECONE(20)
POSITIONENTITY cone, 0, 0, 5
ROTATEENTITY cone, 0, 0, 90
RENDERWORLD
FLIP
WAITKEY

Поменяйте углы в команде ROTATEENTITY.

Освещение

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

a = CREATELIGHT([тип][,род]) 

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

GRAPHICS3D 640, 480, 32
cam = CREATECAMERA()
l = CREATELIGHT()
ROTATEENTITY l, 90, 0, 0
cone = CREATECONE(20)
POSITIONENTITY cone, 0, 0, 5
ROTATEENTITY cone, 0, 0, 90
RENDERWORLD
FLIP
WAITKEY

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

Менять размеры объектов можно с помощью следующей команды:

SCALEENTITY объект, SX, SY, SZ

SX, SY, SZ - новый размер объекта вдоль осей X, Y и Z. Размер 1, 1, 1 устанавливается по умолчанию. Чтобы уменьшить объект, нужно ввести значения меньше 1, но больше 0. Чтобы увеличить объект, нужно ввести значения больше 1.
Цвет объекта
Цвет задается командой:

ENTITYCOLOR объект, красный, зеленый, синий

Красный, зеленый и синий - это градации соответствующего компонента в цвете объекта, лежащие в диапазоне 0 - 255. К примеру, (255, 255, 255) - белый цвет, (255, 255, 0) - желтый (смесь красного и зеленого), (0, 0, 0) - черный.
Для более наглядной демонстрации получения цвета путем смешения красного, зеленого и синего, можно получить, предложив учащимя поэкспериментировать с диалогом выбора цвета в редакторе Paint.
Прозрачность объекта
Команда ENTITYALPHA изменяет прозрачность объекта:

ENTITYALPHA объект, коэффициент прозрачности

Коэффициент прозрачности лежит в диапазоне от 0 (объект невидим) до 1 (объект непрозрачен). Например, объект с коэффициентом прозрачности 0.5 будет полупрозрачным.
Задание: создать трехмерный объект – елку

ФотоФото

Это задание, как и следующее, включает в себя определение свойств объекта, построение чертежа, работу с ним, разбивку объекта на примитивы, определение их параметров, а также построение шаблона. Так как сама по себе система составления объекта поначалу покажется учащимся сложной, рекомендуется в первом задании использовать наводящие вопросы, построить с помощью учащихся чертеж и помочь в написании программы. Второе задание во многом схоже с первым, поэтому можно ограничиться построением чертежа.
Построим чертеж: видно, что части елки (трехмерные примитивы) лежат на оси OY, так что они будут иметь координаты 0, y, 0:
Далее - копируем все строки предыдущей программы, которые задают экранное разрешение, создают камеру, свет и выводят трехмерный объект на экран (зададим новую позицию камеры). Теперь сделаем нижний конус (c1): его размеры - 10 х 10 х 10 (т. к. созданный конус первоначально имеет размеры 2 х 2 х 2, то необходимо увеличить его в 5 раз с помощью команды SCALEENTITY). Он изначально находится в точке 0, 0, 0, поэтому перемещать его не нужно. Зададим для него зеленый цвет (0, 255, 0) командой ENTITYCOLOR. Итак, нижний конус готов, добавляем остальные (копируем команды и заменяем значения). Добавим еще команду для перемещения объектов - POSITIONENTITY:
конус с2: размер - 4 х 4 х 4, положение - (0, 4, 0), цвет - зеленый (0, 255, 0)
конус с3: размер - 3х3х3, положение - (0, 7, 0), цвет - зеленый (0, 255, 0)
конус с4: размер - 2х2х2, положение - (0, 10, 0), цвет - зеленый (0, 255, 0)
Создадим ствол дерева - добавим цилиндр (cyl) с помощью команды CREATECYLINDER:
размер - 2х2х2, положение - (0, -6, 0), цвет - коричневый (170, 130, 30)
Программа:

GRAPHICS3D 640, 480

cam = CREATECAMERA()
POSITIONENTITY cam, 0, 0, -20
l = CREATELIGHT()
ROTATEENTITY l, 0, 45, 45

c1 = CREATECONE(20, 1)
SCALEENTITY c1, 5, 5, 5
ENTITYCOLOR c1, 0, 255, 0
c2 = CREATECONE(20, 1)
SCALEENTITY c2, 4, 4, 4
POSITIONENTITY c2, 0, 4, 0
ENTITYCOLOR c2, 0, 255, 0
c3 = CREATECONE(20, 1)
SCALEENTITY c3, 3, 3, 3
POSITIONENTITY c3, 0, 7, 0
ENTITYCOLOR c3, 0, 255, 0
c4 = CREATECONE(20, 1)
SCALEENTITY c4, 2, 2, 2
POSITIONENTITY c4, 0, 10, 0
ENTITYCOLOR c4, 0, 255, 0
cyl = CREATECYLINDER(20, 1)
POSITIONENTITY cyl, 0, -6, 0
SCALEENTITY cyl, 2, 2, 2
ENTITYCOLOR cyl, 170, 130, 30

RENDERWORLD
FLIP
WAITKEY

Запишем созданную программу под именем “fir.bb”.
Задание: создать трехмерный объект - стул
Нам потребуется более детальный чертеж для построения (вы, наверное, уже строили такой на уроках черчения) - чертеж объекта с трех сторон.
Как видим, стул состоит из параллелепипедов. Для того, чтобы построить параллелепипед, нужно масштабировать куб по осям с разными коэффициентами. Для правильного построения нужно определить размеры параллелепипеда и координаты его центра. Цвет каждого параллелепипеда зададим, как темно-коричневый (160,100,40). Для удобства будем использовать одну переменную (т.к. адреса параллелепипедов нам больше не понадобятся).
Фото

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

cam = CREATECAMERA()
POSITIONENTITY cam, 20, 30, -20
ROTATEENTITY cam, 45, 45, 0
l = CREATELIGHT()
ROTATEENTITY l, 45, 135, 45

Напишем шаблон для построения параллелепипеда:

p = CREATECUBE()
SCALEENTITY p, , ,
POSITIONENTITY p, , ,
ENTITYCOLOR p, 160, 100, 40

Далее, копируем этот шаблон, и заполняем его данными:
Ножки:
1: Размер: 1, 6, 1, координаты:(5, -8, 5)
2: Размер: 1, 6, 1, координаты:(-5, -8, 5)
3: Размер: 1, 6, 1, координаты:(5, -8, -5)
4: Размер: 1, 6, 1, координаты:(-5, -8, -5)
Сиденье:
Размер: 6, 1, 6, координаты:(0, -1, 0)
Доски спинки:
Широкая: Размер: 2, 7, 1, координаты:(0, 7, 5)
Левая узкая: Размер: 1, 7, 1, координаты:(-5, 7, 5)
Правая узкая: 1, 7, 1, координаты:(5, 7, 5)
Поперечная: Размер: 6, 1, 1, координаты:(0, 15, 5)

Программа:

GRAPHICS3D 640, 480, 32

cam = CREATECAMERA()
POSITIONENTITY cam,20, 30, -20
ROTATEENTITY cam, 45, 45, 0
l = CREATELIGHT()
ROTATEENTITY l, 45, 135, 45

p = CREATECUBE()
SCALEENTITY p, 1, 6, 1
POSITIONENTITY p, 5, -8, 5
ENTITYCOLOR p, 160, 100, 40
p = CREATECUBE()
SCALEENTITY p, 1, 6, 1
POSITIONENTITY p, -5, -8, 5
ENTITYCOLOR p, 160, 100, 40
p = CREATECUBE()
SCALEENTITY p, 1, 6, 1
POSITIONENTITY p, 5, -8, -5
ENTITYCOLOR p, 160, 100, 40
p = CREATECUBE()
SCALEENTITY p, 1, 6, 1
POSITIONENTITY p, -5, -8, -5
ENTITYCOLOR p, 160, 100, 40

p = CREATECUBE()
SCALEENTITY p, 6, 1, 6
POSITIONENTITY p, 0, -1, 0
ENTITYCOLOR p, 160, 100, 40

p = CREATECUBE()
SCALEENTITY p, 2, 7, 1
POSITIONENTITY p, 0, 7, 5
ENTITYCOLOR p, 160, 100, 40
p = CREATECUBE()
SCALEENTITY p, 1, 7, 1
POSITIONENTITY p, -5, 7, 5
ENTITYCOLOR p, 160, 100, 40
p = CREATECUBE()
SCALEENTITY p, 1, 7, 1
POSITIONENTITY p, 5, 7, 5
ENTITYCOLOR p, 160, 100, 40
p = CREATECUBE()
SCALEENTITY p, 6, 1, 1
POSITIONENTITY p, 0, 15, 5
ENTITYCOLOR p, 160, 100, 40

RENDERWORLD
FLIP

WAITKEY