Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки? Спасибо! |
Создание программы "Лабиринт"
Расширение возможностей базового приложения
В качестве изображения текстуры для стен можно использовать фрагмент кирпичной стены ( рис. 13.2), а для сферы - изображение поверхности земли ( рис. 13.3).
Для этого можно использовать фрагменты кода приведённые в листингах 13.15 и 13.16 .
private void Form1_Load(object sender, EventArgs e) { … bmpBrick = new Bitmap("brick.bmp"); bmpEarth = new Bitmap("earth256x128.bmp"); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); }Листинг 13.15. Загрузка изображений текстур в программе на C#
procedure TfrmGL.FormCreate(Sender: TObject); begin … // зарузка изображений текстур LoadTextureFromBMP('BRICK.BMP', texBrick); LoadTextureFromBMP('earth256x128.bmp', texEarth); // параметры масштабирования текстур glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); … end;Листинг 13.16. Загрузка изображений текстур в программе на Object Pascal
Для формирования изображения сферы с текстурой можно использовать пример формирования сферы, приведенный в "Текстура" (листинги 13.17 и 13.18 ).
private void glControl1_Paint(object sender, PaintEventArgs e) { GL.ClearColor(0.5f, 0.5f, 0.75f, 1.0f); // цвет фона // очистка буферов цвета и глубины GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); // поворот изображения GL.LoadIdentity(); GL.Rotate(AngleY, 0.0, 1.0, 0.0); GL.Translate(Pos.X, 0, Pos.Y); GLTexture.LoadTexture(bmpEarth); GL.Enable(EnableCap.Texture2D); GL.Enable(EnableCap.Lighting); GL.PushMatrix(); GL.Rotate(RY, 0.0, 1.0, 0.0); Sphere(1, 20, 20); GL.PopMatrix(); GL.Disable(EnableCap.Lighting); GL.Disable(EnableCap.Texture2D); // стены лабиринта GLTexture.LoadTexture(bmpBrick); GL.Enable(EnableCap.Texture2D); for (int i = 0; i < plan.Length; ++i) { // длина стены double wdl = Math.Sqrt(Math.Pow(coners[plan[i].L].X -coners[plan[i].R].X, 2) + Math.Pow(coners[plan[i].L].Y - coners[plan[i].R].Y, 2)) / 4; GL.Begin(BeginMode.Quads); GL.TexCoord2(0, 0); GL.Vertex3(coners[plan[i].L].X, -hdl, coners[plan[i].L].Y); GL.TexCoord2(0, hdl / 2); GL.Vertex3(coners[plan[i].L].X, hdl, coners[plan[i].L].Y); GL.TexCoord2(wdl, hdl / 2); GL.Vertex3(coners[plan[i].R].X, hdl, coners[plan[i].R].Y); GL.TexCoord2(wdl, 0); GL.Vertex3(coners[plan[i].R].X, -hdl, coners[plan[i].R].Y); GL.End(); } GL.Disable(EnableCap.Texture2D); GL.Flush(); GL.Finish(); glControl1.SwapBuffers(); }Листинг 13.17. Обработчик события Paint компонента GLControl программы Лабиринт на C#
procedure TfrmGL.FormPaint(Sender: TObject); var i: integer; wdl: GLfloat; begin glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // очистка буфера цвета glLoadIdentity; // перемещение наблюдателя glRotatef(AngleY, 0.0, 1.0, 0.0); glTranslatef(Pos.X, 0, Pos.Y); // вращающаяся сфера с текстурой поверхности земли glColor3f(1, 1, 1); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texEarth.Width, texEarth.Height, 0, GL_RGB, GL_UNSIGNED_BYTE, @texEarth.Data[0]); glEnable(GL_TEXTURE_2D); glPushMatrix; glRotatef(RY, 0.0, 1.0, 0.0); sphere(1, 20, 20); glPopMatrix; glDisable(GL_TEXTURE_2D); // стены лабиринта glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texBrick.Width, texBrick.Height, 0, GL_RGB, GL_UNSIGNED_BYTE, @texBrick.Data[0]); glEnable(GL_TEXTURE_2D); for i:=0 to High(plan) do begin // длина стены wdl:=sqrt(sqr(coners[plan[i].l].x-coners[plan[i].r].x) + sqr(coners[plan[i].l].y-coners[plan[i].r].y))/4; glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f(coners[plan[i].l].x, -hdl, coners[plan[i].l].y); glTexCoord2f(0, hdl/2); glVertex3f(coners[plan[i].l].x, hdl, coners[plan[i].l].y); glTexCoord2f(wdl,hdl/2); glVertex3f(coners[plan[i].r].x, hdl, coners[plan[i].r].y); glTexCoord2f(wdl, 0); glVertex3f(coners[plan[i].r].x, -hdl, coners[plan[i].r].y); glEnd; end; glDisable(GL_TEXTURE_2D); glFlush; glFinish; SwapBuffers(DC); end;Листинг 13.18. Обработчик события OnPaint формы программы Лабиринт на Object Pascal
В листингах 13.17 и 13.18 при формировании стен лабиринта добавлено определение координат текстуры для каждой стены с помощью команды TexCoord. Для определения количества повторений изображения фрагмента кирпичной стены используется значение высоты стен, которое одинаково для всех стен и задано константой hdl, и длины стены (переменная wdl), которая вычисляется для каждой стены лабиринта.
В листингах 13.17 и 13.18 для формирования изображения сферы с текстурой поверхности земли используются примеры из "Текстура" . Угол вращения сферы RY меняется в обработчике таймера (листинги 13.19 и 13.20 ).
private void timer1_Tick(object sender, EventArgs e) { RY += 5; glControl1.Invalidate(); }Листинг 13.19. Обработчик события Tick компонента Timer программы Лабиринт на C#
procedure TfrmGL.Timer1Timer(Sender: TObject); begin inc(RY, 5); InvalidateRect(Handle, nil, False); end;Листинг 13.20. Обработчик события OnTimer компонента TTimer программы Лабиринт на Object Pascal
Краткие итоги
Библиотека OpenGL с одинаковой легкостью позволяет создавать различные типы приложений: как трехмерные шутеры, так и различные системы проектирования и моделирования.
Базовые знания библиотеки позволяют создавать приложения различных типов.
При создании графических приложений OpenGL важную роль играет не только умение использовать возможности библиотеки, но и знание таких разделов математики как аналитическая геометрия.
Упражнения. Cоздание реалистичных моделей объектов
- Усовершенствуйте программу, моделирующую перемещение наблюдателя в лабиринте:
- Реализуйте ограничение стенами перемещение наблюдателя в лабиринте.
- Создайте программу для редактирования расположения стен в лабиринте. Программа должна сохранять данные о расположении стен лабиринта в текстовом файле. Этот файл должен использоваться программой, моделирующей лабиринт, для формирования стен лабиринта. Различные текстуры для стен могут сохраняться в виде отдельных графических файлов.
- Используйте для изображения потолка и пола в лабиринте текстуры на основе различных графических файлов, для одной из стен лабиринта в качестве текстуры используйте изображение какой-либо фотографии.
- Реализуйте возможность управления перемещением наблюдателя в лабиринте с помощью мыши.
- Добавьте возможность изменения направления наблюдения вниз и вверх с помощью клавиатуры и "мыши".
- Создайте двухуровневый лабиринт с переходом с одного уровня на другой по наклонной плоскости.
- Реализуйте освещенную динамическую модель какого-либо прибора или машины, например: легкового автомобиля, мотоцикла, вертолета, самолета, космического спутника, лунохода, марсохода и др. На рис. 13.5 приведен пример выполнения задания.
- Реализуйте динамическую модель солнечной системы. Отобразите траектории движения планет.
- Реализуйте динамическую модель, демонстрирующую движение бильярдного шара после удара кием. Отобразите траекторию движения шара. Реализуйте возможность интерактивного задания положения кия и силы удара.
- Реализуйте каркасную модель молекулы этана с возможностью интерактивного изменения её конформации.