2016-03-19 8 views
1

Ich habe diese Mesh-Klasse, die 3 Arraylisten hat: Ecken, Kanten, Flächen, aber ich kann nicht einen Weg zu ziehen, sie in einem richtigen Weg finden. Ich möchte, dass die Scheitelpunkte und die Kanten auf der Rückseite nicht durch die Gesichter vor meiner Kamera sichtbar sind. Wenn ich einen Würfel habe, möchte ich, dass die Scheitelpunkte, Kanten und Flächen, die der Kamera zugewandt sind, sichtbar sind, der Rest sollte nicht sein.OpenGL ES zeichnet mehr Objekte

Ich weiß nicht, ob dies klar genug ist und ich tue dies nur als eine Übung mehr über OpenGL ES zu lernen.

Wenn es eine andere Art und Weise mit einem Masche mit Scheiteln, Kante und ein Gesicht, als Klassen zu behandeln bitte helfen. Vielen Dank.

Hier ist meine Masche Klassencode:

public class Mesh { 

protected ArrayList<Vertex> vertices; 
protected ArrayList<Edge> edges; 
protected ArrayList<Triangle> triangles; 

public Vector Pos; 
public float rx,ry,rz; 
public float r,g,b,alfa; 
private boolean colorSet; 

private static boolean vertexOn,edgeOn,FaceOn; 

Mesh() 
{ 
    Pos=new Vector(); 
    vertices=new ArrayList<Vertex>(); 
    edges=new ArrayList<Edge>(); 
    triangles=new ArrayList<Triangle>(); 

    r=g=b=0; alfa=1; 
    colorSet=false; 

    vertexOn=true; 
    edgeOn=true; 
    FaceOn=true; 
} 

Mesh(Vector pos) 
{ 
    Pos=pos; 
    vertices=new ArrayList<Vertex>(); 
    edges=new ArrayList<Edge>(); 
    triangles=new ArrayList<Triangle>(); 

    r=g=b=0; alfa=1; 
    colorSet=false; 

    vertexOn=true; 
    edgeOn=true; 
    FaceOn=true; 
} 


public void add(Vertex v) 
{ 
    vertices.add(v); 
} 

public void add(Edge e) 
{ 
    edges.add(e); 
} 

public void add(Triangle t) 
{ 
    triangles.add(t); 
} 

public static void setOn(boolean v,boolean e,boolean f) 
{ 
    vertexOn=v; edgeOn=e; FaceOn=f; 
} 

public void setColor(float r,float g,float b,float alfa) 
{ 
    colorSet=true; 
    this.r=r; this.g=g; this.b=b; this.alfa=alfa; 
} 

public ArrayList<Vertex> getVertices() 
{ 
    return vertices; 
} 

public ArrayList<Edge> getEdges() 
{ 
    return edges; 
} 

public ArrayList<Triangle> getTriangls() 
{ 
    return triangles; 
} 

public void draw(GL10 gl) 
{ 
    gl.glPushMatrix(); 
    gl.glTranslatef(Pos.x,Pos.y,Pos.z); 
    gl.glRotatef(rx,1,0,0); 
    gl.glRotatef(ry,0,1,0); 
    gl.glRotatef(rz,0,0,1); 

    if(colorSet) 
    { 
     if(vertexOn) 
      for(Vertex v: vertices) 
      { 
       v.setcolor(r,g,b,alfa); 
       v.draw(gl); 
      } 

     if(FaceOn) 
      for(Triangle t: triangles) 
      { 
       t.setcolor(r,g,b,alfa); 
       t.draw(gl); 
      } 


     if(edgeOn) 
      for(Edge e: edges) 
      { 
       e.setcolor(r,b,g,alfa); 
       e.draw(gl); 
      } 
    }//if a single color is set for the whole mesh with edges and vertices 
    else 
    { 
     if(vertexOn) 
      for(Vertex v: vertices) 
      { 
       v.draw(gl); 
      } 

     if(FaceOn) 
      for(Triangle t: triangles) 
      { 
       t.draw(gl); 
      } 

     if(edgeOn) 
      for(Edge e: edges) 
      { 
       e.draw(gl); 
      } 
    }//if no color for the whole mesh has been set 

    gl.glPopMatrix(); 
}//Draw 

}//class 

Antwort

1

ich nicht sicher bin ich das Problem verstehen, aber in der Regel, wenn Formen in 3D-Zeichnung sollten Sie einen Tiefenpuffer verwenden. Sie müssen es aktivieren und eine entsprechende Funktion einstellen (einfach das Web ein wenig darauf suchen, es ist ziemlich einfach zu benutzen). Der Tiefenpuffer stellt sicher, dass die Pixel auf der Rückseite nicht über die vorderen gezeichnet werden.

Eine andere Sache, die Sie achten sollten in ist Face Culling. Dies ist nur etwas, das Sie aktivieren und die Reihenfolge im Uhrzeigersinn oder gegen den Uhrzeigersinn einstellen können und an Dreiecken (oder anderen möglichen Flächen) arbeiten. Was es tut, ist, dass es die Oberfläche einfach ignoriert, wenn die Projektion der Oberfläche auf dem Bildschirm anders angeordnet ist als die Reihenfolge, die Sie zum Aussortieren festlegen. Dies wird tatsächlich als Optimierung verwendet, aber im Falle eines einzelnen Würfels kann es auch eine Lösung sein. Stellen Sie nur sicher, dass Sie beim Erzeugen der Formen eine einheitliche Reihenfolge haben.

In der Praxis würden Sie wahrscheinlich wollen beide verwenden. Der Tiefenpuffer, um richtig zu zeichnen und das Culling, um Leistung zu erzielen.

Was mit Maschen und Klassen zu tun gibt es viele Möglichkeiten. In der Regel werden die Teile des Netzes durch gemeinsame Zeichnung gruppiert. Aufgrund der erhöhten Leistung möchten Sie die Zeichenaufrufe (Anzahl der Anrufe glDraw) reduzieren. In diesem Fall würden Sie alle Dreiecke mit einem einzigen Zeichenaufruf zeichnen, der alle Eckdaten auf einmal und eine Anzahl von Dreiecken enthält. Um es ein bisschen interessanter zu machen, könnten Sie tatsächlich einen Vertex-Puffer auf der GPU erstellen, der alle Ihre Vertex-Daten enthält und diesen wiederverwenden, um den Datenverkehr zwischen der CPU und der GPU zu reduzieren. Sie könnten dann einen einzelnen Puffer für das Netz verwenden, das alle zu zeichnenden Daten enthält, und Ihre verschiedenen Teile würden nur die Positionen (Offsets) verschiedener Teile im Puffer halten. Wenn Ihr Würfel beispielsweise aus 36 Scheitelpunkten besteht und Ihr Netz aus 2 Würfeln besteht, dann hätte der erste Würfel die Informationen, um bei Index 0 zu beginnen und 12 Dreiecke zu zeichnen, während der zweite Würfel bei 36*sizeof(Vertex) beginnen und wieder 12 Dreiecke zeichnen würde.