Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛР4

.docx
Скачиваний:
11
Добавлен:
21.06.2021
Размер:
104.51 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

федеральное государственное автономное образовательное учреждение высшего образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

КАФЕДРА № 53 «ИФОРМАЦИОННО-СЕТЕВЫХ ТЕХНОЛОГИЙ»

ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

Ассистент

В.А. Ушаков

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ № 4

ПРОЕКТИВНЫЕ ПРЕОБРАЗОВАНИЯ

по курсу: КОМПЬЮТЕРНАЯ ГРАФИКА

РАБОТУ ВЫПОЛНИЛА

СТУДЕНТКА ГР. №

подпись, дата

инициалы, фамилия

Санкт-Петербург 2021

Цель работы

Изучение проективных преобразований и построение их с помощью языка программирования высокого уровня.

Задание

На любом языке программирования высокого уровня (из числа изученных в ходе освоения ООП 09.03.02), выполнить проективное преобразование трехмерного объекта на плоскость с использованием графического инструментария. Выполнить проективное преобразование по трем осям. Рекомендуется брать такие фигуры, чтобы на разных плоскостях получались разные проекции. Также не рекомендуется брать самые типовые фигуры как шар или параллелепипед.

Листинг с кодом программы

using System;

using Tao.FreeGlut;

using OpenGL;

namespace Graf4

{

class Program

{

private static int width = 1280, height = 720;

private static ShaderProgram program;

private static VBO<Vector3> pyramid, cube;

private static VBO<Vector3> pyramidColor, cubeColor;

private static VBO<uint> pyramidTriangles, cubeQuads;

private static System.Diagnostics.Stopwatch watch;

private static float angle;

static void Main(string[] args)

{

Glut.glutInit();

Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);

Glut.glutInitWindowSize(width, height);

Glut.glutCreateWindow("My pcture");

Glut.glutIdleFunc(OnRenderFrame);

Glut.glutDisplayFunc(OnDisplay);

Glut.glutCloseFunc(OnClose);

Gl.Enable(EnableCap.DepthTest);

program = new ShaderProgram(VertexShader, FragmentShader);

program.Use();

// program["projection_matrix"].SetValue(Matrix4.CreatePerspectiveFieldOfView(0.10f, (float)width / height, 0.1f, 1000f));

// program["view_matrix"].SetValue(Matrix4.LookAt(new Vector3(0, -70, 5), new Vector3(0, 1, 0), new Vector3(0, 1, 0)));

// program["projection_matrix"].SetValue(Matrix4.CreatePerspectiveFieldOfView(0.60f, (float)width / height, 0.1f, 1000f));

//program["view_matrix"].SetValue(Matrix4.LookAt(new Vector3(0, 0, 10), new Vector3(0, 1, 0), new Vector3(0, 1, 0)));

program["projection_matrix"].SetValue(Matrix4.CreatePerspectiveFieldOfView(0.6f, (float)width / height, 0.1f, 1000f));

//program["view_matrix"].SetValue(Matrix4.LookAt(new Vector3(-50, 0, 0), new Vector3(10, 1, 0), new Vector3(0, 1, 0)));

program["view_matrix"].SetValue(Matrix4.LookAt(new Vector3(0, 0, 10), new Vector3(0, 1, 0), new Vector3(0, 1, 0)));

program["projection_matrix"].SetValue(Matrix4.CreatePerspectiveFieldOfView(0.20f, (float)width / height, 0.1f, 1000f));

program["view_matrix"].SetValue(Matrix4.LookAt(new Vector3(-50, 0, 0), new Vector3(10, 1, 0), new Vector3(0, 1, 0)));

pyramid = new VBO<Vector3>(new Vector3[] {

new Vector3(0, 1, 0), new Vector3(-1, -1, 1), new Vector3(1, -1, 1),

new Vector3(0, 1, 0), new Vector3(1, -1, 1), new Vector3(1, -1, -1),

new Vector3(0, 1, 0), new Vector3(1, -1, -1), new Vector3(-1, -1, -1),

new Vector3(0, 1, 0), new Vector3(-1, -1, -1), new Vector3(-1, -1, 1) });

pyramidColor = new VBO<Vector3>(new Vector3[] {

new Vector3(1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 0, 1),

new Vector3(1, 0, 0), new Vector3(0, 0, 1), new Vector3(0, 1, 0),

new Vector3(1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 0, 1),

new Vector3(1, 0, 0), new Vector3(0, 0, 1), new Vector3(0, 1, 0) });

pyramidTriangles = new VBO<uint>(new uint[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }, BufferTarget.ElementArrayBuffer);

cube = new VBO<Vector3>(new Vector3[] {

new Vector3(1, 1, -1), new Vector3(-1, 1, -1), new Vector3(-1, 1, 1), new Vector3(1, 1, 1),

new Vector3(1, -1, 1), new Vector3(-1, -1, 1), new Vector3(-1, -1, -1), new Vector3(1, -1, -1),

new Vector3(1, 1, 1), new Vector3(-1, 1, 1), new Vector3(-1, -1, 1), new Vector3(1, -1, 1),

new Vector3(1, -1, -1), new Vector3(-1, -1, -1), new Vector3(-1, 1, -1), new Vector3(1, 1, -1),

new Vector3(-1, 1, 1), new Vector3(-1, 1, -1), new Vector3(-1, -1, -1), new Vector3(-1, -1, 1),

new Vector3(1, 1, -1), new Vector3(1, 1, 1), new Vector3(1, -1, 1), new Vector3(1, -1, -1) });

cubeColor = new VBO<Vector3>(new Vector3[] {

new Vector3(0, 1, 0), new Vector3(0, 1, 0), new Vector3(0, 1, 0), new Vector3(0, 1, 0),

new Vector3(1, 0.5f, 0), new Vector3(1, 0.5f, 0), new Vector3(1, 0.5f, 0), new Vector3(1, 0.5f, 0),

new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(1, 0, 0),

new Vector3(1, 1, 0), new Vector3(1, 1, 0), new Vector3(1, 1, 0), new Vector3(1, 1, 0),

new Vector3(0, 0, 1), new Vector3(0, 0, 1), new Vector3(0, 0, 1), new Vector3(0, 0, 1),

new Vector3(1, 0, 1), new Vector3(1, 0, 1), new Vector3(1, 0, 1), new Vector3(1, 0, 1) });

cubeQuads = new VBO<uint>(new uint[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }, BufferTarget.ElementArrayBuffer);

watch = System.Diagnostics.Stopwatch.StartNew();

Glut.glutMainLoop();

}

private static void OnClose()

{

pyramid.Dispose();

pyramidColor.Dispose();

pyramidTriangles.Dispose();

cube.Dispose();

cubeColor.Dispose();

cubeQuads.Dispose();

program.DisposeChildren = true;

program.Dispose();

}

private static void OnDisplay()

{

}

private static void OnRenderFrame()

{

Gl.Viewport(0, 0, width, height);

Gl.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

Gl.UseProgram(program);

program["model_matrix"].SetValue(Matrix4.CreateRotationY(angle) * Matrix4.CreateTranslation(new Vector3(-1.5f, 0, 0)));

Gl.BindBufferToShaderAttribute(pyramid, program, "vertexPosition");

Gl.BindBufferToShaderAttribute(pyramidColor, program, "vertexColor");

Gl.BindBuffer(pyramidTriangles);

Gl.DrawElements(BeginMode.Triangles, pyramidTriangles.Count, DrawElementsType.UnsignedInt, IntPtr.Zero);

program["model_matrix"].SetValue(Matrix4.CreateRotationY(angle / 2) * Matrix4.CreateRotationX(angle) * Matrix4.CreateTranslation(new Vector3(1.5f, 0, 0)));

Gl.BindBufferToShaderAttribute(cube, program, "vertexPosition");

Gl.BindBufferToShaderAttribute(cubeColor, program, "vertexColor");

Gl.BindBuffer(cubeQuads);

Gl.DrawElements(BeginMode.Quads, cubeQuads.Count, DrawElementsType.UnsignedInt, IntPtr.Zero);

Glut.glutSwapBuffers();

}

public static string VertexShader = @"

#version 130

in vec3 vertexPosition;

in vec3 vertexColor;

out vec3 color;

uniform mat4 projection_matrix;

uniform mat4 view_matrix;

uniform mat4 model_matrix;

void main(void)

{

color = vertexColor;

gl_Position = projection_matrix * view_matrix * model_matrix * vec4(vertexPosition, 1);

}

";

public static string FragmentShader = @"

#version 130

in vec3 color;

out vec4 fragment;

void main(void)

{

fragment = vec4(color, 1);

}

";

}

}

Экранные формы с результатами работы программы

На рисунках 1 представлены фигуры. На рисунках 2-4 представлены проекции фигур на 3 плоскости.

Рисунок 1 – Фигуры, полученные в результат работы программы

Рисунок 2 – Проекция на ось XOY

Рисунок 3 – Проекция на ось YOZ

Рисунок 4 – Проекция на ось XOZ

Вывод

В ходе выполнения лабораторной работы была создана динамическая 3D-сцена на языке программирования высокого уровня, поддерживающего библиотеку OpenGL. Был реализован переход в полноэкранный режим, включение и выключение освещения, запуск и остановка вращения, а так же управление направлением вращения с клавиатуры.

Соседние файлы в предмете Компьютерная Графика