NetNado
  Найти на сайте:

Учащимся

Учителям



Отчет по лабораторной работе №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


скачать

Другие похожие работы: