2012-05-14 116 views
0

我一直在尋找幾天來找到我的問題的答案。我已經通過教科書查看了幾個網站等...從我能看到我的代碼應該正確渲染。我已經把我的臉扔在我的鍵盤上反覆試圖找到錯誤:(。 在這裏。我有一個簡單的.OBJ立方體從攪拌機已被設置爲三角形,所以我有3個指數,每面。我有一個解析器解析在總共8個頂點和36個指數。我只是不知道該怎麼再這裏做的是我的代碼...請幫助! 在此先感謝。.OBJ立方體在OPENGL中不能正確渲染ES

enter code here 

this is the .OBJ file 
# Blender v2.62 (sub 0) OBJ File: '' 
# www.blender.org 
mtllib tcubetest.mtl 
o Cube 
v 1.000000 -1.000000 -1.000000 
v 1.000000 -1.000000 1.000000 
v -1.000000 -1.000000 1.000000 
v -1.000000 -1.000000 -1.000000 
v 1.000000 1.000000 -0.999999 
v 0.999999 1.000000 1.000001 
v -1.000000 1.000000 1.000000 
v -1.000000 1.000000 -1.000000 
usemtl Material 
s off 

f 5 1 4 
f 5 4 8 
f 3 7 8 
f 3 8 4 
f 2 6 3 
f 6 7 3 
f 1 5 2 
f 5 6 2 
f 5 8 6 
f 8 7 6 
f 1 2 3 
f 1 3 4 

這是正在做解析。

enter code here 
Context context; 
public ArrayList<Float> v = new ArrayList<Float>(); 
public ArrayList<Short> f = new ArrayList<Short>(); 

Parser(Context context) { 
    this.context = context; 
    BufferedReader reader = null; 
    String line = null; 

    try { // try to open file 
     reader = new BufferedReader(new InputStreamReader(context 
       .getResources().getAssets().open("tcubetest.obj"))); 
    } catch (IOException e) { 

    } 

    try { 
     while ((line = reader.readLine()) != null) { 

      if (line.startsWith("v")) { 
       processVLine(line); 
      } else if (line.startsWith("f")) { 
       processFLine(line); 
      } 
     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

private void processVLine(String line) { 
    String[] tokens = line.split("[ ]+"); // split the line at the spaces 
    int c = tokens.length; 
    for (int i = 1; i < c; i++) { // add the vertex to the vertex array 
     v.add(Float.valueOf(tokens[i])); 
    } 
} 

private void processFLine(String line) { 
    String[] tokens = line.split("[ ]+"); 
    int c = tokens.length; 

    if (tokens[1].matches("[0-9]+")) {// f: v 
     //if (c == 4) { 
      for (int i = 1; i < c; i++) { 
       Short s = Short.valueOf(tokens[i]); 
       s--; 
       f.add(s); 
      } 

      } 
     } 
//THIS IS THE CUBE CLASS 

public class Cube { 
FloatBuffer vertBuff; 
ShortBuffer faceBuff; 
float[] verts; 
short[] faces; 

Cube(ArrayList<Float> vertices, ArrayList<Short> facesa) { 
    verts = new float[vertices.size()]; 
    faces = new short[facesa.size()]; 
    for (int index = 0; index < verts.length; index++) { 
     verts[index] = vertices.get(index); 
    } 

    for (int index = 0; index < faces.length; index++) { 
     faces[index] = facesa.get(index); 
    } 

    ByteBuffer vbb = ByteBuffer.allocateDirect(verts.length * 4); 
    vbb.order(ByteOrder.nativeOrder()); 

    vertBuff = vbb.asFloatBuffer(); 
    vertBuff.put(verts); 
    vertBuff.position(0); 

    vbb = ByteBuffer.allocateDirect(faces.length * 4); 
    vbb.order(ByteOrder.nativeOrder()); 

    faceBuff = vbb.asShortBuffer(); 
    faceBuff.put(faces); 
    faceBuff.position(0); 
} 

public void draw(GL10 gl) { 

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertBuff); 

    gl.glColor4f(1.0f, 0.0f, 0.0f, .2f); 

    gl.glDrawElements(GL10.GL_TRIANGLES, faces.length, 
      GL10.GL_UNSIGNED_BYTE, faceBuff); 

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 

} 

} 用於製作用於繪製陣列的陣列

enter code here 
public void makeArray(float ver[], short fac[]){ 
    finals = new float[fac.length]; 

    for(int index = 0; index < fac.length; index++){ 
     finals[index] = ver[fac[index]]; 
    } 
    ByteBuffer vbb = ByteBuffer.allocateDirect(finals.length *4); 
    vbb.order(ByteOrder.nativeOrder()); 

    vertBuff = vbb.asFloatBuffer(); 
    vertBuff.put(finals); 
    vertBuff.position(0); 
} 

自從第一篇文章以來,我一直在關注這個問題......嘗試我能想到的任何事情。代碼本身並不複雜,是不是有人知道我做錯了什麼?該文件導出不當可能是問題嗎?

好的更新時間。我手動加載的頂點和索引,應該基於教程工作...使用相同的繪圖設置的立方體類,它有相同的問題,並不是所有的面完全繪製(只有大約一半看起來),所以這就是我知道:我的解析器有效;我的加載是「工作」,我的意思是它符合手動輸入的值;我已經嘗試了在我看來是一切的東西。我花了幾個月的時間教自己編程從頭開始,到目前爲止沒有向任何人提出任何問題。儘管我現在真的可以使用這個幫助,但是再次感謝大家。

+0

您的問題可以使用一些清晰。你有什麼樣的問題,結果是什麼樣的?另外,如果一個立方體不能正常工作,我建議從一個三角形的對象開始,然後看看你是否能夠正常工作。如果是這樣,然後嘗試兩個不同的三角形等。看看你能得到多遠。 – Tim

+0

我一直在使用矩形和紋理一段時間。立方體隨機畫出鋸齒狀。我曾嘗試使用TRIANGLES TRIANGLE_FAN TRIANGLE_STRIPS風扇已經做得最好。我猜我的問題是我正在使用的索引和繪圖方法。我試圖添加.OBJ文件,但我是論壇的新手,所以我不知道爲什麼它不在這裏。無論如何面孔是三個例如f 1 2 3f 5 6 8 ...等 –

+0

那麼有obj文件:P –

回答

1

經過大量的facerolling和facepalming後,我意識到我需要在drawelements調用中將UNSIGNED_BYTE更改爲UNSIGNED_SHORT(因爲我使用的是短文)。學過的知識。