Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семестр2_lr.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

Лабораторная работа 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.