Использование спецификации Open GL при построении трехмерного представления

OpenGL (Open Graphics Library) — спецификация, определяющая платформонезависимый (независимый от языка программирования) программный интерфейс для написания приложений, использующих двумерную и трёхмерную компьютерную графику. Включает более 300 функций для рисования сложных трёхмерных сцен из простых примитивов. Используется при создании компьютерных игр, САПР, виртуальной реальности, визуализации в научных исследованиях. На платформе Windows конкурирует с Direct3D.

Для разработки будем использовать пакет SharpGL. WinForms, скаченный из nuget.org (nuget  — менеджер пакетов для .Net. Данный галерея пакетов является центральным репозиторием пакетов, которой используют все авторы и потребители).

Добавим SharpGl к компонентам .Net Framework. Добавим DLL SharpGL  к проекту.

Нарисуем треугольник, с красным, зеленым и синим цветом по углам треугольника. Добавим 6 кнопок с координатами (X, Y, Z) для увеличения или уменьшения координат (рисунок 9).

 

 

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

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;

 

namespace openGL_example

{

public partial class Form1 : Form

{

private float axis_rotate_X;

private float axis_rotate_Y;

private float axis_rotate_Z;

public Form1()

{

InitializeComponent();

this.axis_rotate_X = 0;

this.axis_rotate_Y = 0;

this.axis_rotate_Z = 0;

}

 

private void button1_Click(object sender, EventArgs e)

{

this.axis_rotate_X = this.axis_rotate_X + 5f;

}

 

private void button2_Click(object sender, EventArgs e)

{

this.axis_rotate_Y = this.axis_rotate_Y + 5f;

}

 

private void button3_Click(object sender, EventArgs e)

{

this.axis_rotate_Z = this.axis_rotate_Z + 5f;

}

 

private void button4_Click(object sender, EventArgs e)

{

this.axis_rotate_X = this.axis_rotate_X -5f;

}

 

private void button5_Click(object sender, EventArgs e)

{

this.axis_rotate_Y = this.axis_rotate_Y — 5f;

}

 

private void button6_Click(object sender, EventArgs e)

{

this.axis_rotate_Z = this.axis_rotate_Z — 5f;

}

 

private void button7_Click(object sender, EventArgs e)

{

}

 

private void button8_Click(object sender, EventArgs e)

{

}

 

private void openGLControl1_OpenGLDraw(object sender, SharpGL.RenderEventArgs args)

{

SharpGL.OpenGL gl = this.openGLControl1.OpenGL;

gl.Clear(SharpGL.OpenGL.GL_COLOR_BUFFER_BIT | SharpGL.OpenGL.GL_DEPTH_BUFFER_BIT);  // Очистка скрина

gl.LoadIdentity();    // сброс

gl.Translate(0.0f, 0.0f, -6.0f);  // переместить влево

gl.Rotate(axis_rotate_X, 1.0f, 0.0f, 0.0f);

gl.Rotate(axis_rotate_Y, 0.0f, 1.0f, 0.0f);

gl.Rotate(axis_rotate_Z, 0.0f, 0.0f, 1.0f);

gl.Begin(SharpGL.OpenGL.GL_TRIANGLES); // начать рисовать пирамиду

gl.Color(1.0f, 0.0f, 0.0f);   //красный

gl.Vertex(0.0f, 1.0f, 0.0f); // центр пирамиды

gl.Color(0.0f, 1.0f, 0.0f); //Зеленый

gl.Vertex(-1.0f, -1.0f, 1.0f);  // левая сторона пирамиды

gl.Color(0.0f, 0.0f, 1.0f);  // Синий

gl.Vertex(1.0f, -1.0f, 1.0f);  // права сторона пирамиды

gl.Color(1.0f, 0.0f, 0.0f);   //красный

gl.Vertex(0.0f, 1.0f, 0.0f); // центр пирамиды

gl.Color(0.0f, 0.0f, 1.0f); //Зеленый

gl.Vertex(1.0f, -1.0f, 1.0f);  // левая сторона пирамиды

gl.Color(0.0f, 1.0f, 0.0f);  // Синий

gl.Vertex(1.0f, -1.0f, -1.0f);  // права сторона пирамиды

gl.Color(1.0f, 0.0f, 0.0f);   //красный

gl.Vertex(0.0f, 1.0f, 0.0f); // центр пирамиды

gl.Color(0.0f, 1.0f, 0.0f); //Зеленый

gl.Vertex(1.0f, -1.0f, -1.0f);  // левая сторона пирамиды

gl.Color(0.0f, 0.0f, 1.0f);  // Синий

gl.Vertex(-1.0f, -1.0f, -1.0f);  // права сторона пирамиды

gl.Color(1.0f, 0.0f, 0.0f);   //красный

gl.Vertex(0.0f, 1.0f, 0.0f); // центр пирамиды

gl.Color(0.0f, 0.0f, 1.0f); //Зеленый

gl.Vertex(-1.0f, -1.0f, -1.0f);  // левая сторона пирамиды

gl.Color(0.0f, 1.0f, 0.0f);  // Синий

gl.Vertex(-1.0f, -1.0f, 1.0f);  // права сторона пирамиды

gl.End();

gl.LoadIdentity();

}

private void openGLControl1_Load(object sender, EventArgs e)

{

}}

}

Результат работы программы представлен ниже

При нажатии на кнопку соответствующей координате – наш треугольник смешается относительной ей.

Учебный проект. Разработчик: Цирков Г.А.