2011-01-08 7 views
1

ich habe:SharpGL: Es können nicht alle Linien aus Liste ziehen

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 ziehen nicht alle Kanten. Wenn ich drawElements ändere, zeichnet es unterschiedliche Anzahl von Kanten. Das Ändern von for(int i=0; i<edges.Count; i++) zu for(int i=edges.Count-1; i>=0; i--) zeigt, dass esges korrekt generiert werden, aber sie werden 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=truehttp://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 mit diesem ist falsch? Wie kann ich alle Kanten zeichnen?

EDIT:
Es macht nichts, ließ ich SharpGL und schrieb genau den gleichen Code in OpenTK. Es funktioniert hervorragend, ohne dass ich mich frage, was falsch ist. Das war ein guter Ruf, denn SharpGL verbraucht enorm viel Speicher.

Antwort

2

Einmal hatte ich ein sehr ähnliches Problem.

Es war wegen Z-Puffer. Wenn Sie ein Flugzeug haben und dessen Drahtgitter zeichnen möchten, überschneiden sich die Koordinaten und Artefakte wie diese entstehen. Es ist ein numerisch nicht definiertes Verhalten - Zeichnen von zwei Objekten in der gleichen Tiefe. Du weißt nie, welches an der Spitze kommt.

Eine Lösung besteht darin, das Drahtgitter etwas zu versetzen. Das habe ich in einigen 3D-Modellierungspaketen bemerkt. In Game-Engines ist es auch üblich, Sprites auf Geometrie zu verteilen (Schüsse auf einer Wand). Ein anderer könnte den Z-Puffer deaktivieren und verdeckte Linien manuell verdecken.

Der Fall, wenn Sie das Zeichnen von Elementen deaktivieren, kann zu einem anderen Problem mit Z-Puffer führen. Es ist begrenzt von weit und in der Nähe von Clipping-Ebenen. Höchstwahrscheinlich zeichnen Sie die Linien genau in der Tiefe eines von ihnen (meine Vermutung ist weit eins).

BEARBEITEN. Ich habe Deinen Code ein wenig gelesen. Ich würde gerne sehen, wie Sie die Projektionsmatrix konstruieren. Wenn Sie es überhaupt nicht berührten (wenn ich mich richtig erinnere), liegen die Schnittebene für nah und fern bei -1,0 bzw. 1,0. Aber ich könnte falsch liegen, da Sie bei z = -6.0 zeichnen ...

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); 
+0

Nice shot, aber ich würde überrascht sein ... Warum sollte der Fehler erscheinen auch ohne das Rechteck im Hintergrund? Und mit dem Rechteck, bei Tiefen-Test auf LEQUAL gesetzt, warum würde eine konsistente lineare Interpolation von nur Nullen irgendetwas anderes als 0 in der Z-Koordinate ergeben? – Kos

+0

Manchmal entstehen numerische Fehler aufgrund numerischer Instabilität von Algorithmen. Da OpenGL T & L-Pipeline viele Transformationen enthält, bevor etwas den Farbpuffer trifft, gibt es viel zu tun. Und ich bin sicher, OpenGL verwendet keine fortlaufenden Brüche oder irgendwelche numerisch superstabilen Geräte, da es leistungsorientiert ist. Sie wissen, etwas in der Linie: 0,2 + 0,6 = 0,8000007. – Rekin

+0

Könnten Sie auch Initiativcode einbeziehen? Der eine enthält Projektionsmatrix. – Rekin

Verwandte Themen