Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Popov_vorobev

.pdf
Скачиваний:
7
Добавлен:
22.06.2018
Размер:
1.57 Mб
Скачать

Эти строчки добавляют один источник света с именем 0. Таких источников с разными именами можно добавлять несколько: glEnable(GL_LIGHT1), glEnable(GL_LIGHT2) и т. д. Однако, мы не будем пока использовать несколько источников света. Если есть необходимость, то помимо обычного добавления, надо менять ряд настроек, так как иначе это никак не повлияет на внешний вид объектов сцены.

Далее, как уже говорилось, для каждой грани необходимо указать вектор нормали. Он указывается внутри блока glBegin()… glEnd() перед определением вершин:

glBegin (GL_QUADS);

glNormal3f(0.0, 0.0, 1.0); //векторнормали glVertex3f(1.0, 1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); glVertex3f(-1.0, -1.0, 1.0); glVertex3f(1.0, -1.0, 1.0);

glEnd;

Как известно, вектор нормали к плоскости — это вектор, перпендикулярный данной плоскости. Зная векторы нормалей для каждой грани и направление луча, выпущенного некоторым абстрактным источником света, программа сможет найти углы между этим лучом и нормалями граней. Самой яркой будет грань, угол между нормалью которой и лучом будет равен нулю, так как это будет означать, что луч падает прямо на неё. Грани, у которых угол между нормалью и лучом больше или равен 90°, рисуются черными, так как считается, что свет на них не падает вообще (см. лабораторную работу №1).

Если грани фигуры закрашиваются каким-то цветом с помощью функции glcolor3f (), то для сохранения этого цвета при включении освещения нужно вызвать команду glEnable с аргумен-

том GL_COLOR_MATERIAL.

Практическая часть

В данной лабораторной работе необходимо написать программу, которая будет выводить на экран, так называемый, «кубик Ру-

60

бика» (рис. 30). Фигура должна освещаться. Кроме того, при нажатии на стрелки на клавиатуре, кубик должен вращаться.

Для успешной реализации рекомендуется почитать дополнительную литературу по теме, так как в теоретической части данного методического пособия были представлены только минимально необходимые сведения.

Рис. 30. Кубик Рубика

61

 

Приложение 1

Основные методы и свойства компонента Canvas

 

 

Наименование метода

Назначение

или свойства

 

1

2

Arc(x1,y1,x2,y2,x3,y3,x4,y4:

Рисует дугу окружности или эллипса

Integer)

 

Brush.Color: TColor

Цвет фона (см. прил. 2)

Brush.Style: TBrushStyle

Определяет шаблон заливки (см. прил.

 

3)

Chord (x1,y1,x2,y2,x3,y3,x4,y4:Integer);

Рисует заполненную замкнутую фигу-

 

ру, ограниченную дугой окружности

 

или эллипса и хордой

Draw (x,y:Integer;Graphic:TGraphic);

Рисует графическое изображение в ука-

 

занную позицию канвы. Изображение

 

содержится в объекте, указанном пара-

 

метром Graphic. Источник изображения

 

может быть битовой матрицей, пикто-

 

граммой или метафайлом

DrawFocusRect (constRect:TRect);

Рисует изображение прямоугольника в

 

виде, используемом для отображения

 

рамки фокуса, операцией XOR, что по-

 

зволяет удалить изображение прямо-

 

угольника его повторной прорисовкой

Ellipse (x1,y1,x2,y2:Integer);

Рисует заполненную окружность или

 

эллипс

FillRect(const Rect:TRect);

Заполняет прямоугольник Rect на хол-

 

сте, используя текущую кисть. Может

 

быть применен, в том числе, для стира-

 

ния части изображения на холсте

FrameRect(constRect:TRect);

Рисует на канве текущей кистью пря-

 

моугольную рамку

LineTo(X, Y:Integer);

Производит рисование прямой линии из

 

точки текущей позиции к пикселу с ад-

 

ресом (X, Y). Адрес (X, Y) становится

 

точкой текущей позиции

62

 

 

Окончание табл.

 

 

1

2

MoveTo(X, Y:Integer);

Производит перемещение позиции к

 

пикселю с адресом (X, Y)

Pen.Color: TColor

Цвет кисти (см. прил. 2)

Pen.Style

Определяет режим (стиль) рисования

 

линий (см. прил. 4)

Pen.Width: Integer

Определяет толщину линии в пикселях.

 

Влияет на Style

Pie (x1,y1,x2,y2,x3,y3,x4,y4:Longint);

Рисует заполненную замкнутую фигуру

 

— сегмент окружности или эллипса

Pixels[i, j] :TColor

Двумерный массив точек (пикселей),

 

задаваемых своим цветом

Polygon (Points: array of TPoint);

Рисует на канве текущим пером замк-

 

нутую фигуру (многоугольник) по за-

 

данному множеству угловых точек, за-

 

мыкая первую и последнюю точки и

 

закрашивая внутреннюю область фигу-

 

ры текущей кистью

Polyline(Points: array of TPoint);

Рисует на канве текущим пером кусоч-

 

но-линейную кривую по заданному

 

множеству точек

Rectangle(x1,y1,x2,y2:Integer);

Рисует на канве текущим пером прямо-

 

угольник и закрашивает его текущей

 

кистью

RoundRect(x1,y1,x2,y2,x3,y3:Integer);

Рисует на канве прямоугольную рамку

 

со скругленными углами

TextHeight(var Text: String): Integer;

Содержит высоту строки Text в пиксе-

 

лях

TextOut(X, Y: Integer; const Text: Wid-

Производит вывод строки Text, начиная

eString);

с (X, Y) — левого верхнего пикселя тек-

 

ста

TextWidth(var Text: String): Integer;

Содержит длину строки Text в пикселях

63

Приложение 2

Значения свойства Color

Свойство Color определяет цет фона компонента. Значение цвета может задаваться как значение, определяющее интенсивности красного, зеленого и синего цветов в формате RGB (Например: Form1.Canvas.Brush.Color:= RGB (88, 87, 104)) или равным одной из предопределенных в Delphi констант. Ниже приведены некоторые из них.

Константа

Значение цвета

clBlack

Черный

clMaroon

Темно-бордовый

clGreen

Зеленый

clOlive

Оливково-зеленый

clNavy

Темно-синий

clPurple

Пурпурный

clTeal

Морской воды

clGray

Серый

clSilver

Серебряный

clRed

Красный

clLime

Лимонно-зеленый

clBlue

Синий

clYellow

Желтый

clFuchsia

Сиреневый

clAqua

Голубой

clWhite

Белый

clBackground

Текущий цвет фона стола Windows

clScrollBar

Текущий цвет полос прокрутки

64

65

Приложение 3

Значения свойства Brush.TStyle — шаблоны заливки

66

Приложение 4

Значения свойства Pen.Style — режим (стиль) рисования линий

psSolid

Сплошная линия

psDash

Штриховая линия

psDot

Пунктирная линия

psDashDot

Штрих-пунктирная линия

psDashDotDot

Линия, чередующая штрих и два пунктира

psClear

Отсутствующая линия

psInsideFrame

Сплошная линия, но при width> 1 допускающая цвета,

 

отличные от палитры windows

67

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

Краснов М. OpenGL в Delphi. URL: http://delphidevelop.ru/load/2-1-0-54, 10.12.2013.

Попов Д.И. Программирование на языке высокого уровня Паскаль : конспект лекций: — М. : Изд-во МГУП имени Ивана Федо-

рова, 2009. — 212 с.

Порев В.Н. Компьютерная графика. — Изд-во БХВ-Петербург, 2002.

Роджерс Д. Алгоритмические основы машинной графики. — Изд-во Мир, 1989.

68

Учебное издание

Попов Дмитрий Иванович, Воробьев Евгений Викторович

Компьютерная графика

Методические указания к лабораторным работам

для студентов, обучающихся по специальности 09.03.01 (230100) — Информатика и вычислительная техника

(бакалавриат)

Редактор Е.Б. Казакова

Компьютерная верстка Е.А. Бариновой

69