Опубликован: 02.12.2011 | Доступ: свободный | Студентов: 889 / 69 | Оценка: 5.00 / 4.00 | Длительность: 09:26:00
Специальности: Программист
Теги: .net, open source, opengl
Лекция 14:

Создание программы "Лабиринт"

< Лекция 13 || Лекция 14: 123

Расширение возможностей базового приложения

В качестве изображения текстуры для стен можно использовать фрагмент кирпичной стены ( рис. 13.2), а для сферы - изображение поверхности земли ( рис. 13.3).

Изображение фрагмента кирпичной стены

Рис. 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), которая вычисляется для каждой стены лабиринта.

Изображение лабиринта (вариант 2)

Изображение лабиринта (вариант 2)

В листингах 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оздание реалистичных моделей объектов

  1. Усовершенствуйте программу, моделирующую перемещение наблюдателя в лабиринте:
    1. Реализуйте ограничение стенами перемещение наблюдателя в лабиринте.
    2. Создайте программу для редактирования расположения стен в лабиринте. Программа должна сохранять данные о расположении стен лабиринта в текстовом файле. Этот файл должен использоваться программой, моделирующей лабиринт, для формирования стен лабиринта. Различные текстуры для стен могут сохраняться в виде отдельных графических файлов.
    3. Используйте для изображения потолка и пола в лабиринте текстуры на основе различных графических файлов, для одной из стен лабиринта в качестве текстуры используйте изображение какой-либо фотографии.
    4. Реализуйте возможность управления перемещением наблюдателя в лабиринте с помощью мыши.
    5. Добавьте возможность изменения направления наблюдения вниз и вверх с помощью клавиатуры и "мыши".
    6. Создайте двухуровневый лабиринт с переходом с одного уровня на другой по наклонной плоскости.
  2. Реализуйте освещенную динамическую модель какого-либо прибора или машины, например: легкового автомобиля, мотоцикла, вертолета, самолета, космического спутника, лунохода, марсохода и др. На рис. 13.5 приведен пример выполнения задания.
     Пример модели автомобиля

    Рис. 13.5. Пример модели автомобиля
  3. Реализуйте динамическую модель солнечной системы. Отобразите траектории движения планет.
  4. Реализуйте динамическую модель, демонстрирующую движение бильярдного шара после удара кием. Отобразите траекторию движения шара. Реализуйте возможность интерактивного задания положения кия и силы удара.
  5. Реализуйте каркасную модель молекулы этана с возможностью интерактивного изменения её конформации.
< Лекция 13 || Лекция 14: 123
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?

 

Александр Сивков
Александр Сивков
Россия, Екатеринбург
Алиса Алиса
Алиса Алиса
Украина