• Martes 19 de Marzo de 2024, 03:28

Autor Tema:  Visualizacion 3D lenta.  (Leído 1909 veces)

ArquiTEC

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Visualizacion 3D lenta.
« en: Jueves 6 de Noviembre de 2008, 12:50 »
0
Hola a Todos.

Estoy intentando generar una herramienta de CAD, usando OpenGL y Visual C#. He conseguido crear un espacio 3D interactivo (es decir, he creado botones para Orbitar, Zoom y PAn), pero me surge un problema. Indico que se visualizen los tipicos objetos TEAPOT ( teteras) y cuando estos llegan a una cantidad que supera las 10 unidades, la visualizacion empieza a volverse lenta y a trompicones. Considero que quedan muy lejos de ser muchos objectos para que mi ordenador tenga problemas. Alguien sabe a que es debido.

Mil gracias.

BlackWind

  • Miembro activo
  • **
  • Mensajes: 89
    • Ver Perfil
Re: Visualizacion 3D lenta.
« Respuesta #1 en: Sábado 8 de Noviembre de 2008, 03:40 »
0
Cita de: "ArquiTEC"
Hola a Todos.

Estoy intentando generar una herramienta de CAD, usando OpenGL y Visual C#. He conseguido crear un espacio 3D interactivo (es decir, he creado botones para Orbitar, Zoom y PAn), pero me surge un problema. Indico que se visualizen los tipicos objetos TEAPOT ( teteras) y cuando estos llegan a una cantidad que supera las 10 unidades, la visualizacion empieza a volverse lenta y a trompicones. Considero que quedan muy lejos de ser muchos objectos para que mi ordenador tenga problemas. Alguien sabe a que es debido.

Mil gracias.


lo mas seguro es que los estes mandando a dibujar muchas veces por frame. Mas de los que tu crees.

Si pones tu codigo quizas seria mas facil.

Por cierto, si usas C#, quizas te convenga mucho mas utilizar DirectX. Mas especificamente SlimDX si es que XNA no te gusta.
http://slimdx.mdxinfo.com/wiki/index.ph ... =Main_Page

saludos,

ArquiTEC

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Visualizacion 3D lenta.
« Respuesta #2 en: Sábado 8 de Noviembre de 2008, 13:15 »
0
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.