Pregunta

Tengo:

float[,] nodesN = null; //indexes:
                        //number of node;
                        //value index 0->x, 1->y, 2->temperature
int[,] elements = null; //indexes:
                        //indexof element (triangle)
                        //1, 2, 3 - vertexes (from nodesN)
List<Pair> edges = null; //Pair is a class containing two int values which are
                         //indexes of nodesN

Y la función que se supone que hacer todos los elementos y bordes en SharpGL.OpenGLCtrl

    private void openGLCtrl1_Load(object sender, EventArgs e)
    {
        gl = this.glCtrl.OpenGL;
        gl.ClearColor(this.BackColor.R / 255.0f,
            this.BackColor.G / 255.0f,
            this.BackColor.B / 255.0f, 1.0f);
        gl.Clear(OpenGL.COLOR_BUFFER_BIT | OpenGL.DEPTH_BUFFER_BIT);
    }

    private void openGLControl1_OpenGLDraw(object sender, PaintEventArgs e)
    {
        gl.Clear(OpenGL.COLOR_BUFFER_BIT | OpenGL.DEPTH_BUFFER_BIT);
        gl.LoadIdentity();
        gl.Translate(0.0f, 0.0f, -6.0f);

        if (!draw) return;

        bool drawElements = false;

        if (drawElements)
        {
            gl.Begin(OpenGL.TRIANGLES);

            for (int i = 0; i < elementNo; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    float x, y, t;
                    x = nodesN[elements[i, j], 0];
                    y = nodesN[elements[i, j], 1];
                    t = nodesN[elements[i, j], 2];

                    gl.Color(t, 0.0f, 1.0f - t);
                    gl.Vertex(x, y, 0.0f);
                }
            }

            gl.End();
        }

        gl.Color(0f, 0f, 0f);            

        gl.Begin(OpenGL.LINES);

        //for(int i=edges.Count-1; i>=0; i--)
        for(int i=0; i<edges.Count; i++)
        {               

            float x1, y1, x2, y2;
            x1 = nodesN[edges[i].First, 0];
            y1 = nodesN[edges[i].First, 1];

            x2 = nodesN[edges[i].Second, 0];
            y2 = nodesN[edges[i].Second, 1];

            gl.Vertex(x1, y1, 0.0f);
            gl.Vertex(x2, y2, 0.0f);                
        }   

        gl.End();          
    }

Pero no saca todos los bordes. Si cambio drawElements dibuja diferente número de aristas. Cambiando for(int i=0; i<edges.Count; i++) a espectáculos for(int i=edges.Count-1; i>=0; i--) que esges se generan correctamente, pero que no sean utilizados.

Imágenes:
for(int i=0; i<edges.Count; i++)
drawElements=false
http://img225.imageshack.us/img225/9295/noup.jpg

for(int i=edges.Count-1; i>=0; i--)
drawElements=false
http://img828.imageshack.us/img828/9595/nodown.jpg

for(int i=0; i<edges.Count; i++)
drawElements=true
http://img64.imageshack.us/img64/4929/withup.jpg

for(int i=edges.Count-1; i>=0; i--)
drawElements=true
http://img833.imageshack.us/img833/9167/withdown.jpg

¿Qué hay de malo en esto? ¿Cómo puedo dibujar todas las aristas?

EDIT:
No importa, me cayó SharpGL y escribí exactamente el mismo código en OpenTK. Funciona excelente sin que yo preguntaba cuál era el problema. Esta fue una llamada bueno porque SharpGL utiliza enormemente gran cantidad de memoria.

¿Fue útil?

Solución

Una vez que tuve un problema muy similar.

Fue debido a z-buffer. Si usted tiene un avión y que desea dibujar la estructura metálica de las coordenadas se superponen y artefactos como los que surgen. Se numéricamente el comportamiento indefinido - dibujo dos objetos en la misma profundidad. Nunca se sabe lo que se viene en la parte superior.

Una solución es para compensar el alambre un poco. Me di cuenta de que en algunos paquetes de modelado en 3D. En los motores de juego también es común para contrarrestar los sprites en la geometría (marcas de bala en una pared). Otro podría ser incapacitantes la memoria intermedia z y manualmente líneas ocluir ocultos.

El caso en el que el dibujo de elementos desactivar podría ser otro problema con z-buffer. Está delimitada por lejos y de cerca planos de recorte. Lo más probable es que dibuja las líneas exactamente a la profundidad de uno de ellos (mi conjetura es lejos uno).

Editar. He leído su código un poco. Uno que me gustaría ver es la forma de construir la matriz de proyección. Si no toca en absoluto que (si no recuerdo mal) los planos cercanos y lejanos de recorte están en el -1,0 y 1,0 respectivamente. Sin embargo, puedo estar equivocado, ya Usted dibuja en z = -6.0 ...

La otra cosa, intente reemplazar:

gl.Vertex(x1, y1, 0.0f);
gl.Vertex(x2, y2, 0.0f);  

Con algo en la línea de:

gl.Vertex(x1, y1, 0.01f);
gl.Vertex(x2, y2, 0.01f);  
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top