ЛР4
.docxМИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
КАФЕДРА № 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. Был реализован переход в полноэкранный режим, включение и выключение освещения, запуск и остановка вращения, а так же управление направлением вращения с клавиатуры.