2016-04-25 13 views
0

Ich versuche herauszufinden, wie Indizes zu einer Form hinzugefügt werden, die bereits alle Scheitelpunkte besitzt. Ich kann durch die Scheitelpunkte sehen, dass ich sie alle habe, wo ich sie brauche, aber ich habe ein merkwürdiges Artefakt, das dadurch verursacht wird, dass die Indizes nicht richtig hinzugefügt werden. Ich bin mir jedoch nicht sicher, wie ich sie richtig hinzufügen soll.Hinzufügen von Indizes zu einem Netz

Surface::Surface() 
{ 
    int size = 200; 
    ofPoint p1(0, 0, 0), p2(0, 0, size), p3(size, 0, size), p4(200, 0, 0); 

    s1 = new Curve(p1, p2); 
    s2 = new Curve(p2, p3); 
    s3 = new Curve(p4, p3); 
    s4 = new Curve(p1, p4); 

    for(double i = 0; i <= size; i++){ 
     for(double j = 0; j <= size; j++){ 
      mesh.addVertex(getPoint(i, j)); 
     } 
    } 

    int width = size, height = size; 
    for (int y = 0; y<=height; y++){ 
     for (int x=0; x<=width; x++){ 
      mesh.addIndex(x+y*width); 
      mesh.addIndex((x+1)+y*width); 
      mesh.addIndex(x+(y+1)*width); 

      mesh.addIndex((x+1)+y*width); 
      mesh.addIndex((x+1)+(y+1)*width); 
      mesh.addIndex(x+(y+1)*width); 
     } 
    } 
} 

Was Eckpunkte zeichnen gibt:

enter image description here

Aber die Indizes verbinden zu viele Punkte, und ich bin nicht sicher, welche davon, wie der Indizes verbunden werden soll. Zeichnen des Drahtmodell:

enter image description here

Vielleicht dieses Problem ist die richtige zu konkaven Formen? Jeder scheint für mehr oder weniger die gleiche Sache zu tun, wenn sie wollen Indizes zu einem Netz hinzuzufügen

Antwort

1

Sie fügen Größe + 1 Ecken in jeder Dimension:

for(double i = 0; i <= size; i++){ 
    for(double j = 0; j <= size; j++){ 
     mesh.addVertex(getPoint(i, j)); 
    } 
} 

Aber dann Indexgröße + 2 Ecken in jedem Dimension wie x und y können gleich groß, und innerhalb der Schleife fügen Sie 1:

int width = size, height = size; 
for (int y = 0; y<=height; y++){ 
    for (int x=0; x<=width; x++){ 
     mesh.addIndex(x+y*width); 
     mesh.addIndex((x+1)+y*width); 
     mesh.addIndex(x+(y+1)*width); 

     mesh.addIndex((x+1)+y*width); 
     mesh.addIndex((x+1)+(y+1)*width); 
     mesh.addIndex(x+(y+1)*width); 
    } 
} 

Diese in garbage Vertices indiziert führen. Um das Problem zu beheben, ändern Sie einfach die Schleifenbedingung in < Breite und < Höhe.

int width = size, height = size; 
for (int y = 0; y<height; y++){ 
    for (int x=0; x<width; x++){ 
     mesh.addIndex(x+y*width); 
     mesh.addIndex((x+1)+y*width); 
     mesh.addIndex(x+(y+1)*width); 

     mesh.addIndex((x+1)+y*width); 
     mesh.addIndex((x+1)+(y+1)*width); 
     mesh.addIndex(x+(y+1)*width); 
    } 
} 

Konzeptuell müssen Sie eine weniger primitive als Vertex erstellen. Die einfachste vorstellbare Form ist, wenn Größe == 1. Sie müssen 2 Ecken, aber nur 1 Quad erstellen.

+0

Es macht jetzt mehr Sinn, aber es fügt immer noch zu viele Indizes hinzu. Es ist wie für die Zeilen, die die Punkte 1 bis 2 zu 3 bis 4 tun sollten, fügt eine letzte Zeile von 4 zu 1 hinzu. Ich habe versucht, die Anzahl der Zeiten für jede Schleife zu verringern, aber es scheint nicht zu helfen. Ohne Änderung, mit Ihrem Code sieht es so aus: http://imgur.com/N8WIRIN – Axel

+0

Ja sorry, ich habe die Antwort bearbeitet. Sie sollten nur die Bedingung Ihrer Schleife zu

+0

Ich dachte mir so etwas aus und ich habe schon etwas Ähnliches wie du bearbeitet, bevor du es getan hast. Und das Ergebnis ist das gleiche. Ich glaube jedoch, dass ich die Indizes nicht in der Reihenfolge hinzufüge, in der ich denke, dass ich sie hinzufüge. Zum Beispiel, wenn ich meine for-Schleifen zu 'y Axel