Popov_vorobev
.pdfЭти строчки добавляют один источник света с именем 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