|
Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки? Спасибо! |
Создание программы "Лабиринт"
Расширение возможностей базового приложения
В качестве изображения текстуры для стен можно использовать фрагмент кирпичной стены ( рис. 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 приведен пример выполнения задания.
- Реализуйте динамическую модель солнечной системы. Отобразите траектории движения планет.
- Реализуйте динамическую модель, демонстрирующую движение бильярдного шара после удара кием. Отобразите траекторию движения шара. Реализуйте возможность интерактивного задания положения кия и силы удара.
- Реализуйте каркасную модель молекулы этана с возможностью интерактивного изменения её конформации.



