Os paso la parte del codigo que redibuja, por ejemplo cuando se realiza un ZOOM.
METODOS EN LA CLASE FORMULARIO
private void view_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left) //Si estamos apretando el boton izquierdo del raton
{
if (IconoZoom.Checked) //Y el icono Zoom es el que esta activado
{
if ((e.Y - PixelY) < 0 && Dist > 0.1F) Dist /= 1.03F; //La variable Dist es la distancia entre la posicion de la camara y el target.
else if ((e.Y - PixelY) > 0) Dist *= 1.03F;
PixelY = e.Y;
CalcularComponentes(); //Esta funcion recalcula las nuevas coordenadas de la posicion de la camara basandose en el nuevo valor de Dist.
glDraw( ); //Aqui llamo al metodo para redibujar.
}
}
public void glDraw(int a) //Metodo para dibujar, y esta como metodo del Formulario, asi se puede acceder a los objetos (teteras)
{
GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
GL.glMatrixMode(GL.GL_MODELVIEW);
GL.glLoadIdentity();
GL.gluLookAt(XCAM, YCAM, ZCAM, XC, YC, ZC, XPERV, YPERV, CosB); //Todos estos valores se han recalculado en la funcion CalcularComponentes
//Este apartado (que sigue dibuja una cuadricula como base visual)
GL.glBegin(GL.GL_LINES);
GL.glColor3f(0.0f, 0.0f, 0.0f);
GL.glVertex3f(0, 1.0f, 0.0f);
GL.glVertex3f(0, -1.0f, 0.0f);
GL.glVertex3f(-1.0f, 0.0f, 0.0f);
GL.glVertex3f(1.0f, 0.0f, 0.0f);
GL.glColor3f(0.55f, 0.55f, 0.55f);
for (float b = 0.1F; b <= 1.1F; b += 0.1F)
GL.glEnd();
GL.glPushMatrix();
foreach (Barra TeteraTemp in Teteras) //Este bucle recorre la coleccion dinamica de teteras para visualizarlas
{
BarraTetera.glDrawTeteraa();
}
GL.glPopMatrix();
view.SwapBuffers();
}
METODOS EN LA CLASE OPENGL
protected override void InitGLContext()
{
GL.glClearColor(0.21f, 0.21f, 0.21f, 1.0f);
GL.glEnable(GL.GL_DEPTH_TEST);
GL.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
GL.glShadeModel(GL.GL_SMOOTH);
GL.glEnable(GL.GL_LIGHTING);
GL.glEnable(GL.GL_COLOR_MATERIAL);
GL.glColorMaterial(GL.GL_FRONT, GL.GL_AMBIENT_AND_DIFFUSE);
float[] LlumAmbient ={ 0.40f, 0.40f, 0.40f, 1.0f };
float[] LlumDiffuse ={ 0.58f, 0.58f, 0.58f, 1.0f };
GL.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, LlumAmbient);
GL.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, LlumDiffuse);
GL.glEnable(GL.GL_LIGHT0);
}
public void SwapBuffers() //Realizo este metodo para poder acceder desde el formulario a la funcion propia SwapBuffer la cual esta declarada private.
{
this.SwapBuffer();
}
CLASE TETERA
Esta clase de momento dibuja teteras, pero sera la base para poder en su dia crear todo tipo de objetos.
public class Tetera: Object
{
public double X, Y, Z; //Coordenadas de la tetera
public Tetera(double X1, double Y1, double Z1, uint SelB) //CONSTRUCTOR
{
X = X1; Y = Y1; Z = Z1;
}
public void glDrawTetera()
{
GL.glPopMatrix(); GL.glPushMatrix();
GL.glTranslated(X, Y, 0);
GL.glRotated(90, 1, 0, 0);
GL.glutSolidTeapot(0.1);
}
}
Comentaros que he intendado generar 12 teteras sin recurrir al bucle que recorre la coleccion dinamica. Eso es, lo he realizado directamente en el metodo GlDraw, pero tambien el grafico sufre lentitud. Por lo que descarte que fuera la coleccion. Repasando apuntes y libros existe unas funciones como GlFlush que permiten gestionar los graficos, pero que no acabo de entender. Aqui como podeis ver solo se llama al metodo SwapBuffer, y no se si la cosa va por aqui. Gracias por vuestra ayuda.