Отчет по лабораторной работе №6 по дисциплине компьютерная графика
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ
ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Институт кибернетики
Кафедра информатики и проектирования систем
Отчет по лабораторной работе №6
по дисциплине КОМПЬЮТЕРНАЯ ГРАФИКА
Вариант 16
Разработчик:
студент группы 8в83
Сафронов Б.А.
Согласовано:
доцент
Демин А. Ю.
Томск 2011
Библиотека OpenGL
Задание:
Разработайте программу, отображающую конус минус цилиндр (центральные оси фигур совпадают, радиусы - нет). Предусмотрите возможность поворота тела вокруг основных осей.
Код программы:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
// для работы с библиотекой OpenGL
using Tao.OpenGl;
// для работы с библиотекой FreeGLUT
using Tao.FreeGlut;
// для работы с элементом управления SimpleOpenGLControl
using Tao.Platform.Windows;
namespace OpenGL
{
public partial class Form1 : Form
{
float[] pos;
float[] dir;
public Form1()
{
InitializeComponent();
AnT.InitializeContexts();
}
private void Form1_Load(object sender, EventArgs e)
{
// инициализация Glut
pos = new float[] {0,5,-15,1};
dir = new float[] { 0, 0, -1 };
Gl.glEnable(Gl.GL_DEPTH_TEST);
Glut.glutInit();
Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH | Glut.GLUT_STENCIL);
// очитка окна
Gl.glClearColor(0, 0, 0, 1);
// установка порта вывода в соотвествии с размерами элемента anT
Gl.glViewport(0, 0, AnT.Width, AnT.Height);
Gl.glEnable(Gl.GL_STENCIL_TEST);
// настройка проекции
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
Glu.gluPerspective(45, (float)AnT.Width / (float)AnT.Height, 0.1, 200);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, pos);
// настройка параметров OpenGL для визуализации
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glLightModeli(Gl.GL_LIGHT_MODEL_TWO_SIDE, Gl.GL_TRUE);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glEnable(Gl.GL_LIGHTING);
Gl.glEnable(Gl.GL_LIGHT0);
Gl.glEnable(Gl.GL_COLOR_MATERIAL);
Gl.glEnable(Gl.GL_NORMALIZE);
AnT.StencilBits = 8;
}
public void draw() {
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT | Gl.GL_STENCIL_BUFFER_BIT);
Gl.glEnable(Gl.GL_LIGHTING);
Gl.glEnable(Gl.GL_LIGHT0);
Gl.glColor3f(1.0f, 0, 0);
Gl.glEnable(Gl.GL_COLOR_MATERIAL);
Gl.glPushMatrix();
Gl.glTranslated(0, 0, -3);
Gl.glRotated(angleX, 1, 0, 0);
Gl.glRotated(angleY, 0, 1, 0);
Gl.glRotated(angleZ, 0, 0, 1);
float[] ambient = new float[] { 0.5f, 0.5f, 0.5f, 1 };
int qq = 20;
//конус
Gl.glColor3f(1, 1, 1);
Gl.glBegin(Gl.GL_TRIANGLE_FAN);
Gl.glVertex3f(0F, -0.5F, 0F);
for (int i = 0; i < qq + 1; i++)
{
Gl.glVertex3f((float)(0.5 * Math.Cos(2 * Math.PI * i / qq)), -0.5F, (float)(0.5 * Math.Sin(2 * Math.PI * i / qq)));
}
Gl.glEnd();
Gl.glBegin(Gl.GL_TRIANGLE_FAN);
Gl.glVertex3f(0, 0.5F, 0);
for (int i = 0; i < qq + 1; i++)
Gl.glVertex3f((float)(0.5 * Math.Cos(2 * Math.PI * i / qq)), -0.5F, (float)(0.5 * Math.Sin(2 * Math.PI * i / qq)));
Gl.glEnd();
// цилиндр
Gl.glColor3f(0, 0, 0);
Gl.glBegin(Gl.GL_TRIANGLE_FAN);
Gl.glVertex3f(0, -0.2F, 0);
for (int i = 0; i < qq + 1; i++)
{
Gl.glVertex3f((float)(0.5 * Math.Cos(2 * Math.PI * i / qq)), -0.2F, (float)(0.5 * Math.Sin(2 * Math.PI * i / qq)));
}
Gl.glEnd();
Gl.glBegin(Gl.GL_TRIANGLE_FAN);
Gl.glVertex3f(0, 0.2F, 0);
for (int i = 0; i < qq + 1; i++)
{
Gl.glVertex3f((float)(0.5 * Math.Cos(2 * Math.PI * i / qq)), 0.2F, (float)(0.5 * Math.Sin(2 * Math.PI * i / qq)));
}
Gl.glEnd();
Gl.glBegin(Gl.GL_QUAD_STRIP);
for (int i = 0; i < qq + 1; i++)
{
Gl.glVertex3f((float)(0.5 * Math.Cos(2 * Math.PI * i / qq)), -0.2F, (float)(0.5 * Math.Sin(2 * Math.PI * i / qq)));
Gl.glVertex3f((float)(0.5 * Math.Cos(2 * Math.PI * i / qq)), 0.2F, (float)(0.5 * Math.Sin(2 * Math.PI * i / qq)));
}
Gl.glEnd();
Gl.glPopMatrix();
Gl.glFlush();
//Glut.glutSwapBuffers();
AnT.Invalidate();
}
float angleX = 0;
float angleY = 0;
float angleZ = 0;
private void button1_Click(object sender, EventArgs e)
{
angleX -= 30;
draw();
}
private void button2_Click(object sender, EventArgs e)
{
angleX += 30;
draw();
}
private void button3_Click(object sender, EventArgs e)
{
angleY -= 30;
draw();
}
private void button4_Click(object sender, EventArgs e)
{ angleY += 30;
draw();
}
private void button5_Click(object sender, EventArgs e)
{
angleZ -= 30;
draw();
}
private void button6_Click(object sender, EventArgs e)
{
angleZ += 30;
draw();
}
public bool issh = false;
private void button7_Click(object sender, EventArgs e)
{
if (issh)
{
issh = false;
}
else {
issh = true;
}
draw();
}
}
}
Результат работы программы:
Рисунок - Скриншот работы программы
Вывод:
В результате проделанной работы были реализованы алгоритмы, производящие все виды преобразований в пространстве, такие как перенос по осям OX, OY, OZ, отражение относительно плоскостей, масштабирование независимо по осям, поворот на заданные углы относительно произвольной точки, указываемой в ходе выполнения программы. При реализации использовалась подпрограмма перемножения матриц, для осуществления поворота, масштабирования и отражения фигуры. Каждая матрица предназначена для определенного вида преобразований. Для преобразования трехмерного изображения в двумерное, использовались матрицы перевода в различные виды проекций (перспективная одноточечная или Кавалье).
страница 1
скачать
Другие похожие работы: