26 августа 2012 в 16:26
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
комментарии отсутствуют
авторизуйтесь