- •Лабораторная работа 1 Свободное движение графического объекта
- •Лабораторная работа 2 Ограниченное движение графического объекта
- •Лабораторная работа 3 Изменение траектории движения
- •Лабораторная работа 4 Дублирование графических объектов
- •Лабораторная работа 5 Построение геометрических фракталов
- •Лабораторная работа 6 Программное рисование двумерных объектов
- •Лабораторная работа 7 Столкновение множества графических объектов
- •Лабораторная работа 8 Моделирование системы гравитации
- •Лабораторная работа 9 Моделирование пружинной системы
- •Лабораторная работа 10 Программное рисование трёхмерных объектов
- •Лабораторная работа 11 Моделирование системы освещения
- •Лабораторная работа 12 Моделирование полигональных объектов
- •Лабораторная работа 13 Текстурирование трёхмерных объектов
Лабораторная работа 12 Моделирование полигональных объектов
Цель работы:
1). Изучить построение более сложных полигональных моделей; метод скрытия невидимых граней при рисовании проекции трёхмерных объектов.
2). Создать приложение для управления вращением сложного многогранника (24 вершины, четырёхугольные и треугольные полигоны).
Порядок выполнения работы:
1. Создайте новый проект с названием "lab12".
2. Используйте классы и методы предыдущей работы.
3. Создайте на основе куба из предыдущей работы многогранник по следующей схеме (рис. 15): добавьте четырёхугольники на одинаково удалённом расстоянии от граней куба; соедините вершины соседних четырёхугольников новыми полигонами; там, где требуется заполнить зазор треугольниками, используйте обозначение полигонов следующим образом:
object.setPolygon(a, b, c, a, rgb, alpha);
4. Для закрашивания граней используйте один и тот же цвет 0xff0099.
1 2 3
Рис. 15. Этапы построения многогранника с включённым (1, 2) и выключенным (3) свойством cullFace
5. Для оптимизации вывода графики на экран вручную удалите все невидимые (скрытые) полигоны, а также в классе Graphics3D создайте новый метод setCull(), и прототип для логической переменной cullFace, который можно использовать для включения (true) или выключения (false) этого свойства в классе Main:
private function setCull(x:Array, y:Array) {
if (cullFace) {
var acx = x[2]-x[0];
var acy = y[2]-y[0];
var bcx = x[1]-x[2];
var bcy = y[1]-y[2];
return (acx*bcy<acy*bcx);
}
}
6. Рисование должно происходить при выполнении следующего условия:
if (!setCull([vertex2D[zPolygon[0]].x, vertex2D[zPolygon[1]].x,
vertex2D[zPolygon[2]].x], [vertex2D[zPolygon[0]].y, vertex2D[zPolygon[1]].y, vertex2D[zPolygon[2]].y])) {
...
}
Контрольные вопросы:
1). Какую функцию выполняет переменная cullFace?
2). Что происходит при рисовании треугольника по четырём точкам?
3). Сколько полигонов требуется для построения данного многогранника?
4). Почему для закрашивания граней рекомендуется один и тот же цвет?
5). Как понимается прототип переменной cullFace в объектно-
ориентированной модели языка ActionScript 2.0?
Лабораторная работа 13 Текстурирование трёхмерных объектов
Цель работы:
1). Изучить методы трансформации графических объектов с помощью аффинных преобразований для текстурирования трёхмерных объектов.
2). Создать приложение для управления вращением текстурированного куба, изображающего игральную кость.
Порядок выполнения работы:
1. Для нового проекта "lab13" создайте новый класс Texture.
2. В классе Texture необходимо описать два метода: load() – для загрузки текстур, setDistortion() – для искажения текстуры при вращении:
var size:Number = 256;
...
public function load(target:MovieClip, path:String) {
var n:Number = target.getNextHighestDepth();
var holder:MovieClip = target.createEmptyMovieClip("holder"+n, n);
var sample:MovieClip = holder.createEmptyMovieClip("sample"+n, n);
sample.loadMovie(path);
return (sample);
}
public function setDistortion(target:MovieClip, vertices:Array) {
var dx1:Number = vertices[2].x-vertices[0].x;
var dy1:Number = vertices[2].y-vertices[0].y;
var dx2:Number = vertices[1].x-vertices[0].x;
var dy2:Number = vertices[1].y-vertices[0].y;
var a1:Number = Math.atan2(dy1, dx1)*180/Math.PI;
var a2:Number = Math.atan2(dy2, dx2)*180/Math.PI;
var a3:Number = (a1-a2)/2;
var cos:Number = Math.cos(Math.PI/180*(45-a3));
var sin:Number = Math.sin(Math.PI/180*(45-a3));
target._parent._rotation = a1-90-a3;
target._parent._x = vertices[0].x;
target._parent._y = vertices[0].y;
target._parent._xscale = (cos-sin)*100;
target._parent._yscale = (cos+sin)*100;
target._rotation = 45;
target._xscale = Math.sqrt(dx2*dx2+dy2*dy2)*100/size;
target._yscale = Math.sqrt(dx1*dx1+dy1*dy1)*100/size;
}
3. В методе setPolygon() вместо значения цвета будет передан путь к файлу с текстурой, для этого необходимо изменить его код следующим образом:
texture = new Texture();
var textures:MovieClip = texture.load(this, path);
polygons.push({vertices:[a, b, c, d], textures:textures, alpha:alpha});
4. Освободите метод render() от переменной focalLength и расчёта scale.
5. В цикле рисования метода render() необходимо добавить переключение глубины для сортировки отображения объектов, а также обращение к методу setDistortion() из массива текстур:
depths[i][0].textures._parent.swapDepths(i);
texture.setDistortion(depths[i][0].textures, [vertex2D[zPolygon[0]], vertex2D[zPolygon[1]], vertex2D[zPolygon[3]]]);
6. Скопируйте файлы текстур в формате JPEG в папку проекта вместе с компилированным файлом формата SWF. Проверьте динамическую загрузку файлов текстур на модель (рис. 16).
Рис. 16. Три положения текстурированного куба
Контрольные вопросы:
1). Можно ли записать все преобразования текстуры в виде матрицы?
2). Для чего используется два объекта MovieClip для хранения текстур?
3). Почему в данной работе нужно избавиться от переменной focalLEngth?
4). Какие нужны методы для искажения текстуры в перспективе?
5). Каким образом можно было бы создавать тень на текстуре?
Вопросы для отчёта по лабораторным работам 10-13:
1). Предоставьте окончательный вариант листинга класса Graphics3D с объяснением всех указанных в нём методов.
2). Предоставьте листинг класса Matrix, дополнив его методами для масштабирования объекта вдоль осей X, Y и Z – scaleX, scaleY и scaleZ.
3). Предоставьте листинг класса Light.
4). Предоставьте листинг класса Texture с объяснением решения задачи, поставленной в вопросе 5 для лабораторной работы 13.
