Помогите новичку с Tao Framework и list объектов
Добрый день, хочу реализовать с помощью OpenGL (Tao Framework) программу которая б создавала атомы в пространстве по указанным координатам (как бы кристаллическую решетку) и можно было манипулировать этими объектами (вращать, передвигать), также надо это сделать компонентом, чтоб можно было просто в другие проекты вставлять, и все это нужно для моего универа. Суть проблемы в том, что вроде все правильно, а работает с глюками. Создает атомы, по координатам, вращает, но через несколько поворотов/созданий, исчезают все атомы кроме первого созданного атома, я пока не понимаю почему так происходит. Работаю без таймера, графика рисуется и обновляется по событию (к примеру кнопки вращения или добавления нового атома).
Вот код, не могу понять своей ошибки =(
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
// для работы с библиотекой OpenGL
using Tao.OpenGl;
// для работы с библиотекой FreeGLUT
using Tao.FreeGlut;
// для работы с элементом управления SimpleOpenGLControl
using Tao.Platform.Windows;
namespace WindowsFormsControlLibrary1
{
public partial class UserControl1 : UserControl
{
Atom[] SomeAtom = new Atom[9999];
public int AtomNum = 0;
public double rotX = 0; //повороты
public double rotY = 0;
public double rotZ = 0;
public double rot = 0;
class Atom
{
private int AtomID; // идентификатор/номер Атома
private double X = 0;
private double Y = 0;
private double Z = 0;
private string Color = "red";
public int ID // метод присовения ИД
{
get { return AtomID; }
set { AtomID = value; }
}
public double x
{
get { return X; }
set { X = value; }
}
public double y
{
get { return Y; }
set { Y = value; }
}
public double z
{
get { return Z; }
set { Z = value; }
}
public string color
{
get { return Color; }
set { Color = value; }
}
}
public UserControl1()
{
InitializeComponent();
GraphicsWindow.InitializeContexts(); //Инициализация OpenGL
}
private void DrawMatrix(int x)
{
float quad_size = 1;
// две последовательно линий после пересечения создадут "матрицу" чтобы мы могли понимать где находится центр
Gl.glBegin(Gl.GL_LINES);
Gl.glColor3f(0.0f, 0.0f, 0.0f);
Gl.glVertex3d(0, 0, 0 - (x / 2));
Gl.glVertex3d(0, 0, quad_size * (x / 2));
Gl.glVertex3d(0 - (x / 2), 0, 0);
Gl.glVertex3d(quad_size * (x / 2), 0, 0);
Gl.glColor3f(0.7f, 0.7f, 0.7f);
for (int ax = -(x / 2); ax < (x / 2)+1; ax++)
{
Gl.glVertex3d(quad_size * ax, 0, 0 - (x / 2));
Gl.glVertex3d(quad_size * ax, 0, quad_size * (x / 2));
}
for (int bx = -(x / 2); bx < (x / 2)+1; bx++)
{
Gl.glVertex3d(0 - (x / 2), 0, quad_size * bx);
Gl.glVertex3d(quad_size * (x / 2), 0, quad_size * bx);
}
Gl.glEnd();
}
private void Visualization()
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glLoadIdentity();
Gl.glPushMatrix();
Gl.glTranslated(0, 0, -12);
Gl.glRotated(45+rotX, 1, 0, 0);
Gl.glRotated(rotY, 0, 1, 0);
Gl.glRotated(rotZ, 0, 0, 1);
DrawMatrix(10);
Gl.glColor3f(1.0f, 0, 0);
for (int i = 0; i <= AtomNum; i++)
{
try
{
Gl.glPushMatrix();
Gl.glTranslated(SomeAtom[i].x, SomeAtom[i].y, SomeAtom[i].z);
Gl.glRotated(rot, 1, 1, 0);
// рисуем сферу с помощью библиотеки FreeGLUT
Glut.glutWireSphere(0.5, 8, 8);
Gl.glPopMatrix();
}
catch
{
//MessageBox.Show("Ошибка!");
}
}
Gl.glPopMatrix();
Gl.glFlush();
GraphicsWindow.Invalidate();
}
private void UserControl1_Load(object sender, EventArgs e)
{
// инициализация Glut
Glut.glutInit();
Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
// очитка окна
Gl.glClearColor(255, 255, 255, 1);
// установка порта вывода в соотвествии с размерами элемента anT
Gl.glViewport(0, 0, GraphicsWindow.Width, GraphicsWindow.Height);
// настройка проекции
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
Glu.gluPerspective(45, (float)GraphicsWindow.Width / (float)GraphicsWindow.Height, 0.1, 200);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glEnable(Gl.GL_LIGHTING);
Gl.glEnable(Gl.GL_LIGHT0);
// настройка параметров OpenGL для визуализации
Gl.glEnable(Gl.GL_DEPTH_TEST);
SomeAtom[0] = new Atom(); //чтоб самим не рисовать уже в программе, изначально создадим квадрат из атомов
SomeAtom[0].x = -2.0f;
SomeAtom[0].y = 0.0f;
SomeAtom[0].z = -2.0f;
AtomNum++;
SomeAtom[1] = new Atom();
SomeAtom[1].x = 2.0f;
SomeAtom[1].y = 0.0f;
SomeAtom[1].z = -2.0f;
AtomNum++;
SomeAtom[2] = new Atom();
SomeAtom[2].x = -2.0f;
SomeAtom[2].y = 0.0f;
SomeAtom[2].z = 2.0f;
AtomNum++;
SomeAtom[3] = new Atom();
SomeAtom[3].x = 2.0f;
SomeAtom[3].y = 0.0f;
SomeAtom[3].z = 2.0f;
AtomNum++;
Visualization();
}
private void button2_Click(object sender, EventArgs e)
{
SomeAtom[AtomNum] = new Atom();
SomeAtom[AtomNum].x = Convert.ToDouble(numericUpDown1.Value);
SomeAtom[AtomNum].y = Convert.ToDouble(numericUpDown2.Value);
SomeAtom[AtomNum].z = Convert.ToDouble(numericUpDown3.Value);
AtomNum++;
Visualization();
}
private void button3_Click(object sender, EventArgs e)
{
rotX += 5;
Visualization();
label4.Text = Convert.ToString(rotX);
}
private void button4_Click(object sender, EventArgs e)
{
rotX -= 5;
Visualization();
}
}
}