МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
«ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
Кафедра ЗІ
З В І Т
До лабораторної роботи №4
з курсу: «Програмування комп’ютерної графіки»
на тему: «Тривимірні побудови. Буфер глибини. Видові параметри. Паралельна і перспективна проекції»
Варіант №3
Львів – 2016
Мета роботи: з'ясувати особливості тривимірного моделювання, побудови об'ємних зображень як проекцій на екранній плоскості; дати поняття про параметри вигляду.
Завдання:
Завдання 1. Побудуйте зображення трьох плоских фігур в просторі (відповідно до варіанту). Оцініть отриманий результат: чи правильно замальовані фігури, якщо немає - поясніть чому.
Завдання 2. Встановіть режим перевірки буфера глибини в програмі до завдання 1. Порівняєте отриманий результат з попереднім.
Завдання 3. Встановіть видові параметри відповідно до варіанту і паралельну проекцію; побудуйте зображення куба з координатами вершин, рівними по модулю 1 (куб замальовується за допомогою 6 квадратів). Оцінити результат.
Завдання 4. Встановіть перспективну проекцію і побудуйте каркасне зображення куба
Завдання 5. Поверніть осі координат відповідно до варіанту і побудуйте зображення куба. Оцінити результат. Чому частки куба відсічені? Змініть видові параметри так, щоб куб замальовувався без відсікань. Змініть код програми так, щоб кожна грань куба замальовувалася своїм кольором.
Завдання 6. Напишіть програму, в якій зображення куба змінюється при натисненні клавіш (відповідно до варіанту).
Варіант 3
Фігури
(задані вершинами)
Параметри вигляду
Поворот осей
До завдання 6
Трикутник:
(1, 1, 0) (1, 0, 1) (0, 1, 1)
Чотирикутник:
(0.8, 0.7, 1) (-0.8, 0.7, 1)
(-0.8, -0.7, -0.8) (0.8, -0.7, -0.8)
Трикутник:
(0, 0.5, -0.5) (-0.5, 0, -0.5) (0.5, 0, 0.5)
-0.85, 0.85
-0.7, 0.7
6, 12
Навколо OX:
-25
Навколо OY:
60
Куб повертається при натисненні на деяку клавішу на заданий кут
Текст програми:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Tao.FreeGlut;
using Tao.OpenGl;
namespace Lab_4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
AnT.InitializeContexts();
}
private void AnT_Load(object sender, EventArgs e)
{
//ініціалізація
Glut.glutInit();
Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
// очистка вікна
Gl.glClearColor(255, 255, 255, 1);
// установка порта виводу у відповідності з розмірами елемента
Gl.glViewport(0, 0, AnT.Width, AnT.Height);
// Проекція
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
Glu.gluPerspective(100.0f, (float)AnT.Width / (float)AnT.Height, 0.8f, 1000.0f);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();
// настройка параметрів візуалізації
//
}
private void button1_Click(object sender, EventArgs e)
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glLoadIdentity();
Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL);
AnT.Invalidate();
Gl.glTranslatef(-0.5f, 0.0f, -3.5f);
Gl.glBegin(Gl.GL_TRIANGLES);
Gl.glColor3f(1.0f, 0, 0.0f);
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glColor3f(0.0f, 1.0f, 0.0f);
Gl.glVertex3f(-1.0f, 0.0f, -1.0f);
Gl.glColor3f(0.0f, 0, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glEnd();
Gl.glColor3f(0.0f, 1.0f, 1.0f); //cyan
Gl.glBegin(Gl.GL_TRIANGLES);
Gl.glVertex3f(-0.7f, -0.7f, 0);
Gl.glVertex3f(-0.7f, 0.7f, 0);
Gl.glVertex3f(0.7f, 0, 0);
Gl.glEnd();
Gl.glColor3f(0.0f, 0.0f, 0.0f); //black
Gl.glBegin(Gl.GL_TRIANGLES);
Gl.glVertex3f(0, 0, -0.9f);
Gl.glVertex3f(-1, -0.8f, 0.5f);
Gl.glVertex3f(1, 1, 1);
Gl.glEnd();
Gl.glFlush();
}
private void button2_Click(object sender, EventArgs e)
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL);
Gl.glLoadIdentity();
AnT.Invalidate();
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glTranslatef(-0.5f, 0.0f, -3.5f);
Gl.glBegin(Gl.GL_TRIANGLES);
Gl.glColor3f(1.0f, 0, 0.0f);
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glColor3f(0.0f, 1.0f, 0.0f);
Gl.glVertex3f(-1.0f, 0.0f, -1.0f);
Gl.glColor3f(0.0f, 0, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glEnd();
Gl.glColor3f(0.0f, 1.0f, 1.0f); //cyan
Gl.glBegin(Gl.GL_TRIANGLES);
Gl.glVertex3f(-0.7f, -0.7f, 0);
Gl.glVertex3f(-0.7f, 0.7f, 0);
Gl.glVertex3f(0.7f, 0, 0);
Gl.glEnd();
Gl.glColor3f(0.0f, 0.0f, 0.0f); //black
Gl.glBegin(Gl.GL_TRIANGLES);
Gl.glVertex3f(0, 0, -0.9f);
Gl.glVertex3f(-1, -0.8f, 0.5f);
Gl.glVertex3f(1, 1, 1);
Gl.glEnd();
Gl.glFlush();
Gl.glDisable(Gl.GL_DEPTH_TEST);
}
private void button3_Click(object sender, EventArgs e)
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glLoadIdentity();
Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL);
AnT.Invalidate();
Gl.glOrtho(-0.8f, 0.8f, -0.9f, 0.9f, 3, 8);
Gl.glTranslatef(-4.5f, 0.0f, 6.5f);
Gl.glBegin(Gl.GL_TRIANGLES);
Gl.glColor3f(1.0f, 0, 0.0f);
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glColor3f(0.0f, 1.0f, 0.0f);
Gl.glVertex3f(-1.0f, 0.0f, -1.0f);
Gl.glColor3f(0.0f, 0, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glEnd();
Gl.glColor3f(0.0f, 1.0f, 1.0f); //cyan
Gl.glBegin(Gl.GL_TRIANGLES);
Gl.glVertex3f(-0.7f, -0.7f, 0);
Gl.glVertex3f(-0.7f, 0.7f, 0);
Gl.glVertex3f(0.7f, 0, 0);
Gl.glEnd();
Gl.glColor3f(0.0f, 0.0f, 0.0f); //black
Gl.glBegin(Gl.GL_TRIANGLES);
Gl.glVertex3f(0, 0, -0.9f);
Gl.glVertex3f(-1, -0.8f, 0.5f);
Gl.glVertex3f(1, 1, 1);
Gl.glEnd();
Gl.glTranslatef(4.5f, 0.0f, -4.5f);
Gl.glBegin(Gl.GL_QUADS);
Gl.glColor3f(0.0f, 0.0f, 0.0f); //black
Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glColor3f(1.0f, 0.0f, 1.0f); //magenta
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glColor3f(1.0f, 0.0f, 0.0f); //red
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glColor3f(0.0f, 1.0f, 1.0f); //cyan
Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glColor3f(0.0f, 1.0f, 0.0f); //green
Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glColor3f(1.0f, 1.0f, 0.0f); //yellow
Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glEnd();
Gl.glFlush();
}
private void button4_Click(object sender, EventArgs e)
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glLoadIdentity();
Gl.glColor3f(1.0f, 0, 0);
Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL);
Gl.glLoadIdentity();
Gl.glFrustum(-0.8f, 0.8f, -0.8f, 0.9f, 3, 6);
Gl.glRotatef(-15.0f, 1.0f, 0.0f, 0.0f); //поворот щодо осі X
Gl.glRotatef(65.0f, 0.0f, 1.0f, 0.0f); //поворот щодо осі Y
Gl.glBegin(Gl.GL_QUADS);
Gl.glColor3f(0.0f, 0.0f, 0.0f); //black
Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glColor3f(1.0f, 0.0f, 1.0f); //magenta
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glColor3f(1.0f, 0.0f, 0.0f); //red
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glColor3f(0.0f, 1.0f, 1.0f); //cyan
Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glColor3f(0.0f, 1.0f, 0.0f); //green
Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glColor3f(1.0f, 1.0f, 0.0f); //yellow
Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glEnd();
Gl.glFlush();
AnT.Invalidate();
}
private void button5_Click(object sender, EventArgs e)
{
//cube
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glLoadIdentity();
AnT.Invalidate();
Gl.glFrustum(-0.8f, 0.8f, -0.9f, 0.9f, 3, 8);
Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_LINE);
Gl.glLineWidth(3);
Gl.glBegin(Gl.GL_QUADS);
Gl.glColor3f(0.0f, 0.0f, 0.0f); //black
Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glColor3f(1.0f, 0.0f, 1.0f); //magenta
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glColor3f(1.0f, 0.0f, 0.0f); //red
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glColor3f(0.0f, 1.0f, 1.0f); //cyan
Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glColor3f(0.0f, 1.0f, 0.0f); //green
Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glColor3f(1.0f, 1.0f, 0.0f); //yellow
Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glEnd();
Gl.glFlush();
}
private void button6_Click(object sender, EventArgs e)
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
AnT.Invalidate();
}
private void button7_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.P)
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glLoadIdentity();
Gl.glColor3f(1.0f, 0, 0);
Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL);
Gl.glLoadIdentity();
Gl.glFrustum(-0.8f, 0.8f, -0.9f, 0.9f, 3, 8);
Gl.glRotatef(-15.0f, 1.0f, 0.0f, 0.0f); //поворот щодо осі X
Gl.glRotatef(65.0f, 0.0f, 1.0f, 0.0f); //поворот щодо осі Y
Gl.glScalef(0.5f,0.5f,0.5f);
Gl.glBegin(Gl.GL_QUADS);
Gl.glColor3f(0.0f, 0.0f, 0.0f); //black
Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glColor3f(1.0f, 0.0f, 1.0f); //magenta
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glColor3f(1.0f, 0.0f, 0.0f); //red
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glColor3f(0.0f, 1.0f, 1.0f); //cyan
Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glColor3f(0.0f, 1.0f, 0.0f); //green
Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glColor3f(1.0f, 1.0f, 0.0f); //yellow
Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glEnd();
Gl.glFlush();
AnT.Invalidate();
}
else if (e.KeyCode == Keys.M)
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glLoadIdentity();
Gl.glColor3f(1.0f, 0, 0);
Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL);
Gl.glLoadIdentity();
Gl.glFrustum(-0.8f, 0.8f, -0.9f, 0.9f, 3, 8);
Gl.glRotatef(-15.0f, 1.0f, 0.0f, 0.0f); //поворот щодо осі X
Gl.glRotatef(65.0f, 0.0f, 1.0f, 0.0f); //поворот щодо осі Y
Gl.glBegin(Gl.GL_QUADS);
Gl.glColor3f(0.0f, 0.0f, 0.0f); //black
Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glColor3f(1.0f, 0.0f, 1.0f); //magenta
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glColor3f(1.0f, 0.0f, 0.0f); //red
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glColor3f(0.0f, 1.0f, 1.0f); //cyan
Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glColor3f(0.0f, 1.0f, 0.0f); //green
Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glColor3f(1.0f, 1.0f, 0.0f); //yellow
Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glEnd();
Gl.glFlush();
AnT.Invalidate();
}
else if (e.KeyCode == Keys.K)
{
button4.PerformClick();
}
}
}
}
Результат виконання програми
/
Висновок:
В ході виконання даної лабораторної роботи я навчився використовувати елементи бібліотеки OpenGl для побудови об’ємних зображення.