2016-03-19 173 views
1

私は3つのArrayLists:vertices、edges、facesを持つこのメッシュクラスを持っていますが、正しい方法で描画する方法が見つかりません。私はカメラの前にある顔を通して、背中の頂点と端が見えないようにします。私が立方体を持っているかのように、私はカメラに向いている頂点、辺、面が目に見えるようにしたい、残りはそうではないはずです。OpenGL複数のオブジェクトを描画する

これは十分明確ではないのですが、私はこれをOpenGL ESの詳細を学ぶ練習としてやっています。

クラスとして頂点、エッジ、および面を使用してメッシュを処理する別の方法があれば、助けてください。ありがとう。私は問題を理解するが、一般的に3Dで図形を描画するときに深度バッファを使用する必要があることを確認していない

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 

答えて

1

は、ここに私のメッシュクラスコードです。それを有効にして適切な機能を設定する必要があります(ちょっとウェブを検索するだけで、使い方は簡単です)。デプスバッファは、背面のピクセルが前面のピクセルに描画されないようにします。

あなたが調べなければならない別のものは、顔のカリングです。これは、時計方向または反時計方向に順序を設定して有効にし、三角形(または他の可能なサーフェス)で動作するようなものです。それがしていることは、サーフェスの画面上の投影が別々に注文された後に、取り消されるように設定されている場合、単にサーフェスを無視するということです。これは実際には最適化として使用されますが、単一のキューブの場合は解決策にもなります。シェイプを生成するときに一貫した順序があることを確認してください。

実際には、おそらく両方を使用したいと思うでしょう。正確に描画する深度バッファと、パフォーマンスを得るための間抜き。

メッシュとクラスを扱うには、さまざまな方法があります。通常、実行されるのは、メッシュの部分が共通の図面によってグループ化されていることです。パフォーマンスが向上したため、ドローコール(glDrawコールの数)を減らすことができます。あなたの場合、一度にすべての頂点データと数多くの三角形を与える単一の描画呼び出しですべての三角形を描画します。少し面白くするために、実際に頂点データを保持しているGPU上に頂点バッファを作成し、それを再利用してCPUとGPU間のデータトラフィックを減らすことができます。描画するすべてのデータを持つメッシュに単一のバッファを使用することができ、異なる部分はバッファ内の異なる部分の位置(オフセット)だけを保持します。たとえば、キュ​​ーブが36個の頂点で構成され、メッシュが2個のキューブで構成される場合、最初のキューブはインデックス0から始まり12個の三角形を描画し、2番目のキューブは36*sizeof(Vertex)で始まり12個の三角形を描画します。

関連する問題