2012-05-14 3 views
0

내 질문에 대한 답변을 찾을 수있는 날을 찾고있었습니다. 나는 여러 웹 사이트 등을 체크 한 텍스트 북을 보았다. 내 코드가 올바르게 렌더링되어야하는 것을 볼 수있다. 난 내 얼굴을 반복적으로 오류를 찾으려고 노력하고 내 키보드에 던져있다. ( 여기있다. 나는 얼굴 당 3 인덱스를 가질 수 있도록 삼각형으로 설정된 믹서기에서 간단한 .OBJ 큐브가 있습니다. 파서 분석 8 개 총 정점 36 개 지수는. 난 그냥 도와주세요 ... 내 코드는 여기에 더 이상 무엇을 해야할지하지 않습니다! 사전에 감사합니다.OPENGL ES에서 .OBJ 큐브가 올바르게 렌더링되지 않습니다.

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); 
} 

나는 첫 번째 게시물 이후로 이것을 조사 해왔다 ... 내가 생각할 수있는 모든 것을 시도했다. 코드 자체가 그렇게 복잡하지는 않습니다. 제가 잘못하고있는 것을 아는 사람이 있습니까? 부적절하게 반출되는 파일에 문제가있을 수 있습니까?

업데이트 시간. 튜토리얼을 기반으로 작동해야하는 꼭짓점과 인덱스를 수동으로로드했습니다 ... Cube 클래스에 대해 동일한 그리기 설정을 사용했으며 모든면이 완전히 그리는 것과 같은 문제가있었습니다 (그 중 절반 만 보이기 때문에). 나는 알고있다 : 나의 파서는 작동한다; 내 부하가 수동으로 입력 한 값과 일치한다는 의미로 "로딩 중"입니다. 나는 모든 것에 내게 나타나는 것을 시험해 보았다. 나는 프로그래밍을 처음부터 가르치는 데 수개월을 보냈으며 아무에게도 질문하지 않고 지금까지이 프로그램을 만들었다. 나는 정말로 도움을 지금 사용할 수 있었다. 다시 감사한다 모두.

+0

귀하의 질문에 약간의 명료성이 적용될 수 있습니다. 어떤 종류의 문제가 있습니까? 결과는 어떻게 생깁니 까? 또한 큐브가 작동하지 않는 경우, 단일 삼각형의 obj로 시작하여 작업 할 수 있는지 알아 보는 것이 좋습니다. 그렇다면 두 개의 별개의 삼각형 등을 시도하십시오. 얼마나 멀리 얻을 수 있는지보십시오. – Tim

+0

저는 잠시 동안 직사각형과 텍스처로 작업 해 왔습니다. 큐브는 들쭉날쭉하고 무작위로 그립니다. 나는 TRIANGLES TRIANGLE_FAN TRIANGLE_STRIPS를 사용해 보았습니다. Fan은 최선을 다했습니다. 내 문제는 인덱스와 드로잉 방법을 사용하고있는 것 같습니다. 난 .OBJ 파일을 추가하려고했지만 포럼에 newb 그래서 여기 왜 안 모르겠어요. 어쨌든 얼굴은 예를 들어 f 1 2 3f 5 6 8 ... etc –

+0

obj 파일이 있습니다. P –

답변

1

facerling과 facepalming이 끝난 후 나는 (내가 짧은 것을 사용했기 때문에) drawelements 호출에서 UNSIGNED_BYTE를 UNSIGNED_SHORT로 변경해야한다는 것을 깨달았습니다. 수업은 배웠다.

관련 문제