Теоретические основы трехмерной графики
Теория построения трехмерных изображений и рендеринга.
3D Graphics
- Трехмерная графика (3D Graphics) – визуальное отображение трехмерной сцены или объекта. Для представления трехмерной графики на двумерном устройстве (дисплее) применяют рендеринг .
rendering
- Рендеринг (rendering) – процесс создания реалистичных изображений на экране, использующий математические модели и формулы для добавления цвета, тени и т. д.
Трехмерная модель
Из 3 D в 2 D
- Для отображения трехмерной модели на двухмерном экране монитора требуется произвести специальные математические преобразования трехмерных координат всех точек в двухмерные.
Камера
Аффинные преобразования
- При смене позиции наблюдателя требуется произвести преобразования координат, связанные с поворотом объекта, его масштабированием и учетом перспективы.
- Такие преобразования называются аффинными преобразованиями
Пример преобразования
- Аффинные преобразования применяются при повороте и трансформации объекта (масштабирование, скос).
- Допустим, что при повороте ординаты точек (у-координаты) не меняются. Значит, поворот происходит относительно оси y .
Освещение
- Модель начинает выглядеть трехмерной только после моделирования освещения, а это напрямую связано с положением плоскостей (полигонов) модели, точнее, с направлением перпендикуляров к плоскостям – нормалей.
- Степень освещенности точки зависит от угла падения лучей света. Чем меньше угол между нормалью и лучом света, тем больше освещенность точки поверхности.
Нормали
- Если взять ровную поверхность, то нормали в каждой ее точке будут одинаковыми и освещенность также будет одинаковой.
- А если поверхность неровная, то нормали в каждой точке будут разными - и освещенность тоже.
Модель освещенности Фонга
- Вклад в это значение от каждого источника света зависит от расстояния между источником света и точкой на поверхности.
Модель освещенности Фонга
Модель Фонга-Блинна
Дальнейшее развитие
- В дальнейшем, исследователи придумывали иные способы вычисления этой составляющей, более сложные (Blinn, Cook-Torrance, Ward), учитывающие распределение энергии света, его поглощение материалами и рассеивания в виде диффузной составляющей.
Игра света и тени
- С целью расчета теней и полутеней (диффузных теней) применяются различные алгоритмы – Ray tracing (трассировка лучей), R adiosity (излучение).
- На рисунке представлены результаты просчета теней и диффузной засветки при помощи R adiosity.
Камера
Свет
голова
Объекты
Действия с объектами
тело
окончание
ноги
Структура программы
Graphics3D 640,480,16,1 Устанавливает 3D Графический способ. Синтакс такой: Graphics3D ширина, высота, глубина цвета, режим Ширина, высота – размер создаваемого экрана Глубина – глубина цвета – 16, 24 или 32 бита на пиксель.
Режим: 0 – оконный во время разработки (если возможно), полноэкранный в .exe формате; 1 –полноэкранный 2 –оконный 3 –оконный, с возможностью изменения размеров окна.
SetBuffer BackBuffer() – установить поток, буфер.
cam=CreateCamera() – это самая основная команда в 3D программах. Если не будет даже одной камеры то 3D программа работать не будет, камера-это тоже самое, что и наши глаза, через неё мы видим окружающий 3D мир. Lit=CreateLight() – Это команда создает источник света. Можно изменять тип света, в скобки вписываем следующие значения: 1 :направленный 2 :точка 3 : пятно
cub=CreateCube() – Это мы создаем 3D объект куб.
Геометрические объекты:
CreateSphere () - сфера CreateCylinder () - цилиндр CreateCone() – конус
PositionEntity cub,0,0,5 – Эта команда помещает объект в позиции и в 3D месте.
ScaleEntity cub,1,0.3,1 – Изменяет размер объекта RotateEntity cub,0,40,0 – Вращает объект так, чтобы это было при абсолютной ориентации.
TurnEntity cub,0.6,0.2,0.3 – вращение
TurnEntity entity,pitch#, yaw#, roll#, [,global] Tpitch# - X угол и эквивалентна наклону вперед / назад. Yaw# - Y угол и эквивалентен вращению налево / вправо. Roll# - Z угол и эквивалентен наклону налево / вправо. UpdateWorld ()– UpdateWorld [anim_speed#] anim_speed# (необязательный) – скорость для мультипликации.
Установлен по умолчанию в 1.
Repeat
…………………………… .
Until KeyHit(1) – Между этими двумя командами будет происходить основной цикл игры. При нажатии кнопки ESC начинает читать следующую команду.
End – Завешает программу
________________________________________
Создаём шаблон
Интерфейс программы.
Так выглядит окно Blitz3d:
Синее текстовое поле является основным – в нём пишут программный код.
Create Executable Для включения\отключения отладочного окна: меню Program - Debug Enabled В правой части окна находится панель с тремя вкладками: Funcs – отображает все функции, которые используются в проекте. Types – отображает все типы, которые используются в проекте. Label – отображает все метки. " width="640"
Запуск и отладка программы: Для запуска программы нажмите F5 или
Для запуска предыдущей программы нажмите F6 Для проверки ошибок нажмите F7 Для создания .exe файла нажмите: меню Program - Create Executable Для включения\отключения отладочного окна: меню Program - Debug Enabled В правой части окна находится панель с тремя вкладками: Funcs – отображает все функции, которые используются в проекте. Types – отображает все типы, которые используются в проекте. Label – отображает все метки.
Graphics3D 640,480,16, 2 SetBuffer BackBuffer() cam=CreateCamera() lit=CreateLight() ………………………………………. Repeat ………………………………………… UpdateWorld RenderWorld Flip Until KeyHit(1) End
Нарисуем КУБ
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
camera=CreateCamera()
PositionEntity camera,0,2,-9
light=CreateLight()
cub=CreateCube()
RotateEntity light, 45 , 90 , 45
While Not KeyHit(1)=1
RenderWorld()
Flip()
Wend
End
камера
Позиция камеры
свет
Ставим куб
Поворот куба
Пока не нажата ESC
Поставим сферу.
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
camera=CreateCamera()
PositionEntity camera,0,2,-9
light=CreateLight()
cub=CreateCube()
sph=CreateSphere(32)
ScaleEntity sph,1,1,1
ScaleEntity cub,1,1,1
EntityAlpha cub,0.5
RotateEntity cub,45,45,45
RotateEntity light, 90,45,45
While Not KeyHit(1)=1
RenderWorld()
Flip()
Wend
End
Размер объекта
Прозрачность объекта
ДОМА:
Поставить цилиндр на куб.
Используем:
CreateCylinder () - цилиндр CreateCube() - куб
PositionEntity cub,0,0,5 – Эта команда помещает объект в позиции и в 3D месте.
ScaleEntity cub,1,0.3,1 – Изменяет размер объекта
Поставим объект
Graphics3D 640,480,16,1 SetBuffer BackBuffer() cam=CreateCamera() lit=CreateLight() cub=CreateCube() PositionEntity cub,0,0,5 ScaleEntity cub,1,0.3,1 RotateEntity cub,0,40,0 Repeat TurnEntity cub,.6,.2,.3 TurnEntity lit,5,5,0 UpdateWorld RenderWorld Flip Until KeyHit(1) End
Практическая работа.
- Изменить параметры света.
- Изменить размер объекта.
- Переместить объект вверх
- Переместить объект вправо.
- Изменить скорость вращения.
Дома: 1. Установить программу
2. Создать сферу и цилиндр.
Дома: 1. Установить программу
2. Создать полупрозрачную сферу и внутри цилиндр.