
- •«Северный (Арктический) федеральный университет имени м.В. Ломоносова»
- •«Северный (Арктический) Федеральный Университет имени м.В. Ломоносова»
- •Постановка задачи
- •Алгоритм удаления невидимых граней
- •Определение лицевых и не лицевых граней с помощью вектора нормали
- •2.4 Закраска трехмерного объекта с использованием простой модели освещения
- •Основные переменные и их предназначение
- •Результат
-
Постановка задачи
В данной работе требуется реализовать альфа-смешение, то есть создать трехмерные модели двух предметов: один прозрачный, другой нет. Цель работы заключается в том, чтобы наглядно показать свойства прозрачных тел, а именно отображение непрозрачного предмета сквозь прозрачный и сокрытие прозрачного предмета (или его части) за непрозрачным.
Создаваемая сцена будет состоять из двух предметов: трехмерной модели граненого стакана и модель куба. Стакан будет исполнять роль прозрачного предмета, а куб – непрозрачного. Стакан состоит из 20 боковых граней и грани основания стакана, все грани должны быть прозрачными. Куб – стандартная геометрическая модель, имеющая 6 граней, выполненных в форме правильных прямоугольников, квадратов. Данная сцена должна отражать эффект прозрачности и эффект освещения.
Рассмотрим координаты вершин модели стакана (таблица 1).
Таблица 1 – Координаты вершин модели стакана
Номер вершины |
Координата Х |
Координата Y |
Координата Z |
0 |
-50 |
-50 |
0 |
1 |
-48 |
-50 |
-15 |
2 |
-40 |
-50 |
-30 |
3 |
-28 |
-50 |
-42 |
4 |
-15 |
-50 |
-48 |
5 |
0 |
-50 |
-50 |
6 |
15 |
-50 |
-48 |
7 |
28 |
-50 |
-42 |
8 |
40 |
-50 |
-30 |
Продолжение таблицы 1
Номер вершины |
Координата Х |
Координата Y |
Координата Z |
9 |
48 |
-50 |
-15 |
10 |
50 |
-50 |
0 |
11 |
48 |
-50 |
15 |
12 |
40 |
-50 |
30 |
13 |
28 |
-50 |
42 |
14 |
15 |
-50 |
48 |
15 |
0 |
-50 |
50 |
16 |
-15 |
-50 |
48 |
17 |
-28 |
-50 |
42 |
18 |
-40 |
-50 |
30 |
19 |
-48 |
-50 |
15 |
20 |
-60 |
100 |
0 |
21 |
-58 |
100 |
-19 |
22 |
-48 |
100 |
-36 |
23 |
-35 |
100 |
-50 |
24 |
-18 |
100 |
-58 |
25 |
0 |
100 |
-60 |
26 |
18 |
100 |
-58 |
27 |
35 |
100 |
-50 |
28 |
48 |
100 |
-36 |
29 |
58 |
100 |
-19 |
30 |
60 |
100 |
0 |
31 |
58 |
100 |
19 |
32 |
48 |
100 |
36 |
33 |
35 |
100 |
50 |
34 |
18 |
100 |
58 |
35 |
0 |
100 |
60 |
36 |
-18 |
100 |
58 |
37 |
-35 |
100 |
50 |
38 |
-48 |
100 |
36 |
39 |
-58 |
100 |
19 |
В данном случае стакан представлен в цилиндра, с более широким верхом и менее широким основанием. Вершины от 0 по 19 составляют основание стакана, с помощью этого диапазона вершин строится грань основания стакана. Вершины от 20 до 39 составляют верхнюю грань стакана, но учитываю специфичную форму сосуда, грань из этих вершин строить не будем. В данном стакане предусмотрено 20 боковых граней, каждая грань строится по принципу соединения вершин в один полигон, например: одна из боковых граней имеет вершины 0, 20, 21, 1 (цикл: i, i + 20, i + 21, i + 1).
Рассмотрим координаты вершин куба с ребром 50 (таблица 2).
Таблица 2 – Координаты вершин куба
Номер вершины |
Координата Х |
Координата Y |
Координата Z |
Основание куба |
|||
40 |
-60 |
-50 |
-65 |
41 |
-60 |
-50 |
-115 |
42 |
-10 |
-50 |
-115 |
43 |
-10 |
-50 |
-65 |
Верхняя грань |
|||
44 |
-60 |
0 |
-65 |
45 |
-60 |
0 |
-115 |
46 |
-10 |
0 |
-115 |
47 |
-10 |
0 |
-65 |
Модель куба собирается по аналогичному принципу моделирования стакана, сначала формируем грань основания, потом верхнюю грань, а потом создаем боковые грани. Каждая грань куба задается 4 вершинами. Так как эти две модели образуют единую сцену, то координаты отсчитываются по единой системе, а также номера вершин задаются по порядку. В дальнейшем к разрабатываемым объектам сцены будет применено закрашивание граней, введение прозрачности и создание освещения всей сцены.
-
ОПИСАНИЕ ИСПОЛЬЗУЕМЫХ АЛГОРИТМОВ
-
Преобразование координат
В предыдущем разделе для построения трехмерных объектов были заданы координаты вершин объектов в мировой системе координат. Необходимо получить из заданных координат видовые (и экранные для ортогональной проекции) координаты. Для видовых координат следует применить перспективные преобразования для придачи разрабатываемым объектам реалистичности. Конечно, можно собрать трехмерную модель без использования перспективного преобразования, но тогда возможен так называемый обман зрения, возникающий из-за ракурса модели, но применив перспективные преобразования, данный эффект исчезнет. Экранные координаты вершин получим после того, как к видовым координатам применим перспективные преобразования, в данном случае и будем собирать наши модели.
// Видовые координаты View[i].x = 20 * (int)Math.Round(Vertex[i].x * (-Math.Sin(teta)) + Vertex[i].y * Math.Cos(teta));
View[i].y = 20 * (int)Math.Round(Vertex[i].x * (-Math.Cos(phi) * Math.Cos(teta)) - Vertex[i].y * (Math.Cos(phi) * Math.Sin(teta)) + Vertex[i].z * Math.Sin(phi));
View[i].z = -20 * (int)Math.Round(Vertex[i].x * (-Math.Sin(phi) * Math.Cos(teta)) - Vertex[i].y * (Math.Sin(phi) * Math.Sin(teta)) - Vertex[i].z * (Math.Cos(phi)) + R0);
// Перспективное преобразование Perspective[i].X = pictureBox1.Width / 2 + (int)Math.Round(D0 * (View[i].x / View[i].z)); Perspective[i].Y = pictureBox1.Height / 2 + (int)Math.Round(D0 * (View[i].y / View[i].z));
// Получение экранных координат Scrn[i].X = (int)Perspective[i].X + pictureBox1.Width / 2; Scrn[i].Y = (int)Perspective[i].Y + pictureBox1.Height / 2;
|
Рисунок 1 – Получение экранных координат
Более подробный алгоритм можно показан в приложении А, где указан листинг программы.