3. Пульт управления
Пульт управления вентилятором составлен из четырех основных частей
- Основание пульта
Элемент строится из цилиндра с разбиением уменьшенным до 4х. |
Фрагмент кода программы основания пульта
M=4;
float qLeg=0;
glBindTexture(GL_TEXTURE_2D,texture5);
while (qLeg<M)
{
glBegin(GL_QUADS);
glNormal3f(0,sin(M_PI/4+qLeg*M_PI/2),cos(M_PI/4+qLeg*M_PI/2));
glTexCoord2d(0,qLeg/M);
glVertex3f(-1,sin((2*M_PI*qLeg)/M),cos((2*M_PI*qLeg)/M));
glTexCoord2d(0,(qLeg+1.0)/M);
glVertex3f(-1,sin((2*M_PI*(qLeg+1))/M),cos((2*M_PI*(qLeg+1))/M));
glTexCoord2d(1,(qLeg+1.0)/M);
glVertex3f(1,sin((2*M_PI*(qLeg+1))/M),cos((2*M_PI*(qLeg+1))/M));
glTexCoord2d(1,qLeg/M);
glVertex3f(1,sin((2*M_PI*qLeg)/M),cos((2*M_PI*qLeg)/M));
glEnd();
qLeg=qLeg+1.0;
}
- Крышки для пульта
Элемент состоит из квадрата, фрагмент кода которого содержался еще в описании ножки стойки вентилятора. |
- Кнопки на пульте
Элемент состоит из цилиндра и круга, примитивов описанных ранее. |
Освещение тела происходит в OpenGL благодаря включению функции SetupLighting() с необходимыми параметрами и условиями, а также за счет правильной расстановки нормалей к примитивам, из которого состоит тело. Чтобы задаваемые нормали нормировались автоматически необходимо включить функцию – glEnable(GL_NORMALIZE);
Подробней остановимся на нахождении нормалей к отдельным элементам тела.
Всего нормали были найдены и прописаны в код программы для 6 примитивов, элементов тела.
1. Лопасть
Для определения нормалей лопасти, поскольку она представляет собой некую поверхность, была использована аналитическая формула для нахождения уравнения поверхности по трём точкам и формула для нахождения нормали к поверхности, что находится через частные производные уравнения поверхности.
- уравнение поверхности, D не считаем, поскольку оно не влияет на выбор нормали.
Тогда координаты для нормали функции glNormal3f(a1,a2,a3) ,будет высчитываться по следующим формулам:
Исходя из записи уравнения поверхности и формулам, выписанные для коэффициентов в этой формуле получим:
Проведя расчет по данным формулам, получим что:
Для одинаково верного отображения освещения лопасти вентилятора как с одной, так и с другой стороны пришлось прибегнуть к подключению двустороннего освещения с помощью функции glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, k), где к =1 для включения и к =0 для её вылючения.
2. Цилиндр
Чтобы определить нормаль для цилиндра нужно координату, что изменяется линейно оставить нулевой, а две другие координаты будут совпадать с соответствующими координатами цилиндра ввиду того, что в основании цилиндра лежит окружность.
В итоге получим координаты нормали:
(0,sin((2*M_PI*qRoll)/M),cos((2*M_PI*qRoll)/M));
3. Круг
Нормаль для круга определяется как перпендикуляр к этой поверхности.
4. Квадрат
Нормаль для квадрата определяется аналогичным образом как и для круга.
5. Параллелепипед
У параллелепипеда нормаль определяется перпендикуляром к каждой грани и значит для всей грани нормаль будет одна и направлена наружу.
6. Полусфера
Нормаль для полусферы определяется координатами самой фигуры, поэтому просто переписаны координаты из glVertex3f в glNormal3f.
Графическое представление тела с освещением Описание наложения текстуры на телоДля наложения текстур на тела, поверхности применяется функция SetupTextures(); В своей работе я использовал 4 вида текстуры, различных размеров. Текстура накладывается на цилиндр, параллелепипед, лопасть, квадрат. Способ наложения примитивно прост. По порядку разберёмся с каждой из фигур.
- Цилиндр.
Для того, чтобы наложить текстуру на фигуру необходимо было абстрактно раскрутить цилиндр в ровную поверхность, прямоугольник и сопоставить координаты полученного прямоугольника с координатами текстуры, как показанно на рисунках.
| |||
- Параллелепипед.
По аналогии с цилиндром абстрактно раскучиваем параллелепипед и наложим текстуру.
- Лопасть.
На лопасть текстура накладывается также исходя из особенности посторения. Поскольку лопасть получается путем видоизменения прямоугольника, т.е. строится из прямоугольником накладывающихся сторонами друг на друга и поворачивающихся по мере наложения на некий угол, то на лопасть текстура накладывается по аналогии с прямоугольником, как это было показано на цилиндре.
- Квадрат.
Текстура на квадрат накладывается один к одному с существующими координатами.
Поверхность строится перебором координат x и y в пределах от -N до N и вычислением для каждой пары (x,y) значения z.
Нормаль к поверхности в точке находятся через честные производные функции по x, y, z
Примечание: Поскольку при обходе циклов по i и j они оба обращаются в ноль, то для того, чтобы избежать выход из области действительных значений координат в выражения для вектора нормали по х и по у вписаны незначительные для конечного результата добавки.
Текстура на поверхность накладывается целиком и растягивается по размерам поверхности. Наложение происходит соотношением координат поверхности и координат текстуры так, что каждому QUAD, из которого строится поверхность, соотносится часть растрового изображения, разбивая его, свои образом, на сетку. Координаты текстуры для точки :
Графическое представление поверхности
1. А.В. Боресков. Графика Трехмерной Компьютерной Игры на Основе OpenGL. М.: «Диалог-МИФИ»,2004
2. Ю.М. Боянковский, А.В. Игнатенко, А.И. Фролов. Графическая библиотека OpenGL. уч.-мет.пособие. Москва,2003
3. NeHe Tutorials
... . Аналогична поверхность редко бывает окрашена равномерно: чаще на ней бывает какой либо узор. Реалистичность изображения можно повысить путем нанесения узора на поверхность. Само перечисление способов построения реалистичных изображений говорит о том, какой большой объем работы необходимо проделать, чтобы получить что-нибудь, в самом деле, стоящее. И это было бы действительно так если бы не ...
... представляют собой числа с плавающей точкой. Наличие различных форматов позволяет библиотеке OpenGL принимать данные пользователя в его собственном формате данных. Некоторые команды библиотеки OpenGL допускают использование 8 различных типов данных в качестве своих параметров. Буквы, используемые в качестве суффиксов для того, чтобы определить эти типы данных для реализации ISO С библиотеки ...
... , комментарии в формате XML. Переняв многое от своих предшественников — языков С++, Delphi, Модула и Smalltalk — С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем: так, C# не поддерживает множественное наследование классов (в отличие от C++) или вывода типов (реализовано в .NET Framework 3.0). C# ...
... на другом или утверждения о реализации идеи человеко-машинного общения. Поэтому исследования в этой области являются весьма актуальными. 3. Разработка программного обеспечения для распознавания команд управления промышленным роботом 3.1 Реализация интерфейса записи и воспроизведения звукового сигнала в операционной системе Microsoft Windows 3.1.1 Основные сведения Звуковые данные хранятся ...
0 комментариев