Question

Je:

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

Et la fonction qui est censé faire tous les éléments et les arêtes sur 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();          
    }

Mais il ne tire pas tous les bords. Si je change drawElements il dessine un nombre différent d'arêtes. Modification de for(int i=0; i<edges.Count; i++) à for(int i=edges.Count-1; i>=0; i--) montre que esges sont générés correctement, mais ils ne sont pas dessinés.

Images:
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

Quel est le problème avec ça? Comment puis-je tirer tous les bords?

EDIT: Qu'à cela ne tienne, je laissai tomber SharpGL et écrit exactement le même code dans OpenTK. Il fonctionne sans me excelent demandais ce qui était faux. Ce fut un bon appel parce que SharpGL utilise quantité énormément grande de la mémoire.

Était-ce utile?

La solution

Une fois que j'ai eu un problème similaire.

Elle était due à z-buffer. Si vous avez un plan et que vous voulez dessiner que les wireframe de coordonnées se chevauchent et des objets comme ceux surgissent. Il est numériquement le comportement non défini - dessin deux objets sur la même profondeur. Vous ne savez jamais où l'on vient sur le dessus.

Une solution consiste à compenser le wireframe un peu. J'ai remarqué que dans certains logiciels de modélisation 3D. Dans les moteurs de jeu, il est également fréquent de compenser sprites sur la géométrie (marques de balles sur un mur). Une autre pourrait être la désactivation du tampon z et manuellement occlure lignes cachées.

Le cas lorsque vous dessin disable d'éléments peut-être à un autre problème avec z-buffer. Il est délimité de loin et à proximité de plans de découpe. Très probablement, vous dessinez les lignes exactement à la profondeur d'un d'entre eux (je suppose bien un).

EDIT. J'ai lu Votre code un peu. Que je voudrais voir comment vous construire la matrice de projection. Si vous ne touchez pas du tout que (si je me souviens bien) les plans de coupures proches et loin sont à -1,0 et 1,0 respectivement. Mais, je peux me tromper puisque vous dessinez à z = -6,0 ...

L'autre chose, essayez de remplacer:

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

Avec quelque chose le long des lignes de:

gl.Vertex(x1, y1, 0.01f);
gl.Vertex(x2, y2, 0.01f);  
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top