Frage

ich habe:

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

Und Funktion, die angeblich tun alle Elemente und Kanten auf 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();          
    }

Aber es ist nicht alle Kanten ziehen. Wenn ich drawElements ändern zieht es unterschiedliche Anzahl von Kanten. Ändern for(int i=0; i<edges.Count; i++) zu for(int i=edges.Count-1; i>=0; i--) zeigt, dass esges korrekt erzeugt werden, aber sie sind nicht gezeichnet.

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

Was ist daran falsch? Wie kann ich alle Kanten ziehen?

EDIT:
Macht nichts, ich fiel SharpGL und schrieb genau den gleichen Code in OpenTK. Es funktioniert ausgezeichnet, ohne mich zu fragen, was falsch war. Das war ein guter Ruf, weil SharpGL enorm große Menge an Speicher verwendet.

War es hilfreich?

Lösung

Sobald ich ein sehr ähnliches Problem hatte.

Es war wegen Z-Puffer. Wenn Sie eine Ebene und wollen, dass es das Drahtgitter ziehen, als die Koordinaten überlappen und Artefakte, wie sie entstehen. Es ist numerisch Verhalten nicht definiert - zwei Objekte auf der gleichen Tiefe zeichnen. Man kann nie wissen, was man an der Spitze kommt.

Eine Lösung ist das Drahtgitter ein wenig zu kompensieren. Ich bemerkte, dass in einigen 3D-Modellierung Pakete. In Game-Engines ist es auch für Offset-Sprites auf Geometrie (gunshot Markierungen an einer Wand) üblich. Ein anderer könnte die Z-Puffer werden zu deaktivieren und manuell verschließen verdeckte Linien.

Der Fall, wenn Sie deaktivieren Zeichnung von Elementen zu einer neuen Ausgabe mit Z-Puffer sein könnte. Es wird von nah und fern Zuschneideebenen begrenzt. Wahrscheinlich Sie die Linien genau in der Tiefe von einem von ihnen ziehen (meine Vermutung weit ist).

EDIT. Ich las Ihren Code ein bisschen. Ein Ich mag würde, um zu sehen, wie Sie die Projektionsmatrix konstruieren. Wenn Sie rührten es nicht an allen als (wenn ich mich richtig erinnere) die nahen und fernen Zuschneideebenen sind bei -1,0 bzw. 1,0. Aber ich könnte falsch sein, da Sie bei z ziehen = -6,0 ...

Die andere Sache, versuchen Sie ersetzen:

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

Mit etwas entlang der Linien von:

gl.Vertex(x1, y1, 0.01f);
gl.Vertex(x2, y2, 0.01f);  
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top