2010-12-29 4 views
0

나는 첫 번째 안드로이드 게임을 만들려고하는데, 나는 리소스 ID를 가져 와서 Context.getResources(). openRawResource()에 의해 리턴 된 InputStream을 사용하는 OBJ 로더를 만들었다.).안드로이드에 대한 내 obj 로더에서 자외선 도와 줌

정점 정보와 얼굴 정보를 읽을 수 있었고 텍스처없이 메쉬를 성공적으로로드 할 수있었습니다.

텍스처가 올바르게 매핑되지 않는 문제를 확인하십시오. 'vt'뒤에 오는 모든 숫자를 배열에 넣고 f의 첫 번째 '/'다음에 오는 인덱스 (즉 'f 1/1 ...')를 사용하여 파일의 정보를 읽습니다.

비록 내가 바이트 버퍼에 모든 것을 넣고 내가 정상적으로이 두 튜토리얼 (jayway 및 nehe 포트)에서 배운 방식대로 진행한다면, 나는 숫자에 대해 무엇을해야하는지 확신 할 수 없다. 그것은 여전히 ​​잘못 될 것입니다.

내 생각에 파일의 'vt'정보가 순서가 맞지 않아서 ('f'데이터에서 '/ x'가 필요함) 어떻게 든 생성하기 전에 순서대로 놓아야합니다. 배열에서 bytebuffer .... 내가 어떻게 해야할지 모르겠다 : (

그래서, 내가 도와 줄 수있는 누군가가 내게 도움을 제공 할 수 있습니까? 나는 거기에 다른 obj 로더가 인터넷에 있지만 나는 알아 이미이 일을했고 나는뿐만 아니라 그하지만 나에 대한 더 나은 학습 경험을 작동하는 방법을 알고

을 Heres는 코드 내가 사용하고 있습니다.

import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.Vector; 

import android.content.Context; 
import android.util.Log; 
import com.snakeinalake.catchthemoney.Mesh.CMeshInfo; 

public class CMeshParserOBJ extends CMeshParser{ 

public CMeshParserOBJ(){ 
    type = "OBJ"; 
} 

@Override 
public CMeshInfo loadMesh(Context context, int FileID){ 
    CMeshInfo ret = new CMeshInfo(type); 

    String buildWord = ""; 
    int data; 
    int found = -1; 

    Vector<Float> vert = new Vector<Float>(); 
    Vector<Float> uv = new Vector<Float>(); 
    Vector<Short> ind = new Vector<Short>(); 
    Vector<Short> map = new Vector<Short>(); 

    InputStream is = context.getResources().openRawResource(FileID); 
    InputStreamReader rd = new InputStreamReader(is); 

    try { 
    data = rd.read(); 
    while(data!=-1){ 
    char c = (char)data; 

    if(found == -1){ 
     if(c == 'v'){ //found vertex data 
     data = rd.read(); 
     if((char)data == ' '){ 
     found = 1; 
     }else if((char)data == 't'){ //found uv map data 
     data = rd.read(); 
     if((char)data == ' '){ 
      found = 3; 
     } 
     }else{ 
     found = -1;   
     } 
     }else if(c == 'f'){ //found index data (faces) 
     data = rd.read(); 
     if((char)data == ' '){ 
     found = 2; 
     }else{ 
     found = -1;   
     } 
     }else{ 
     found = -1;  
     } 
    } 

    if(found == 1){ 
     float x = 0,y = 0,z = 0;  
     for(int repeat = 0; repeat<3; repeat++){ 
     buildWord=""; 
     do{ 
     data = rd.read(); 
     c = (char)data;  
     buildWord+=c; 
     }while((char)data!=' ' && (char)data!='\n'); 
     if(repeat==0) 
     x = Float.parseFloat(buildWord.trim()); 
     else if(repeat==1) 
     y = Float.parseFloat(buildWord.trim()); 
     else if(repeat==2) 
     z = Float.parseFloat(buildWord.trim()); 
     } 
     vert.add(x); 
     vert.add(y); 
     vert.add(z); 
     found = -1; 
    } 

    if(found == 2){ 
     short v1 = 0, v2 = 0, v3 = 0; 
     short map1 = 0, map2 = 0, map3 = 0; 
     boolean uvdata = false; 
     for(int repeat = 0; repeat<3; repeat++){ 
     buildWord=""; 
     do{ 
     data = rd.read(); 
     if(!uvdata && (char)data == '/'){ 
     uvdata = true;   
     }else{ 
     c = (char)data;  
     buildWord+=c; 
     } 
     }while((char)data!=' ' && (char)data!='\n' && (char)data!='/'); 
     if(repeat==0){ 
     v1 = Short.parseShort(buildWord.trim()); 
     }else if(repeat==1){ 
     v2 = Short.parseShort(buildWord.trim()); 
     }else if(repeat==2){ 
     v3 = Short.parseShort(buildWord.trim()); 
     } 

     if(uvdata){ 
     uvdata = false; 
     buildWord = ""; 
     do{ 
     data = rd.read(); 
     c = (char)data;  
     buildWord+=c; 
     if(!uvdata && (char)data == '/'){ 
      uvdata = true;   
     } 
     }while((char)data!=' ' && (char)data!='\n'); 
     if(repeat == 0) 
     map1 = Short.parseShort(buildWord.trim()); 
     else if(repeat == 1) 
     map2 = Short.parseShort(buildWord.trim()); 
     else if(repeat == 2) 
     map3 = Short.parseShort(buildWord.trim()); 
     else{ 
     map1 = 0; map2 = 0; map3 = 0;  
     } 
     } 
     }  
     ind.add(v1); 
     ind.add(v2); 
     ind.add(v3); 

     map.add(map1); 
     map.add(map2); 
     map.add(map3); 
     found = -1; 
    } 
    if(found == 3){ 
     float uvx = 0, uvy = 0;  
     for(int repeat = 0; repeat<2; repeat++){ 
     buildWord=""; 
     do{ 
     data = rd.read(); 
     c = (char)data;  
     buildWord+=c; 
     }while((char)data!=' ' && (char)data!='\n'); 
     if(repeat==0) 
     uvx = Float.parseFloat(buildWord.trim()); 
     else if(repeat==1) 
     uvy = Float.parseFloat(buildWord.trim()); 
     } 
     uv.add(uvx); 
     uv.add(uvy); 
     found = -1; 
    } 

    data = rd.read(); 
    } 
    rd.close(); 

    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 


    ret.vertices = new float[vert.size()]; 
    for(int i=0; i<ret.vertices.length; i++){ 
    ret.vertices[i] = vert.get(i); 
    Log.d("CATCH", Float.toString(ret.vertices[i])); 
    } 

    ret.uvMappings = new short[map.size()]; 
    for(int i=0; i<ret.uvMappings.length; i++){ 
    ret.uvMappings[i] = (short) (map.get(i)-1); 
    Log.d("CATCH", Float.toString(ret.uvMappings[i])); 
    } 

    ret.uvtex = new float[uv.size()]; 
    for(int i=0; i<ret.uvtex.length; i++){ 
    ret.uvtex[i] = uv.get(i); 
    Log.d("CATCH", Float.toString(ret.uvtex[i])); 
    } 

    ret.indices = new short[ind.size()]; 
    for(int i=0; i<ret.indices.length; i++){ 
    ret.indices[i] = (short) (ind.get(i)-1); 
    } 

    ret.MapUVCoordinates(); 
    ret.fillBuffers(); 

    return ret; 
}} 
,536,913,632 10

'ret.MapUVCoordiantes'메서드가 작동하지 않습니다. 직접 시도하기위한 시도였습니다 ... 아무 것도하지 않기 때문에 게시하지 않을 것입니다. 'ret.fullBuffers'메소드가 아래에 있습니다. 배열로부터 바이트 버퍼를 생성합니다.

public void fillBuffers(){ 
    ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); 
    ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2); 
    ByteBuffer ubb = ByteBuffer.allocateDirect(uvtex.length * 4); 

    Log.d("CMeshInfo::fillBuffers", Float.toString(vertices.length * 4)); 
    Log.d("CMeshInfo::fillBuffers", Float.toString((indices.length * 2))); 
    Log.d("CMeshInfo::fillBuffers", Float.toString(uvtex.length * 4)); 


    vbb.order(ByteOrder.nativeOrder()); //Vertices 
    ubb.order(ByteOrder.nativeOrder()); //UV coordinates 
    ibb.order(ByteOrder.nativeOrder()); //Indices 

    vertBuff = vbb.asFloatBuffer(); 
    uvBuff = ubb.asFloatBuffer(); 
    IndBuff = ibb.asShortBuffer(); 

    vertBuff.put(vertices); 
    uvBuff.put(uvtex); 
    IndBuff.put(indices); 

    vertBuff.position(0); 
    uvBuff.position(0); 
    IndBuff.position(0); 
} 

답변

1

정확하게 기억하면 그 수는 꼭지점 배열의 인덱스입니다.

+0

어 주시면 자세히 설명해 주시겠습니까? – AlexRamallo

+0

그래서 v 배열에서 나온 정점 목록이 있고 vt 배열에서 나온 텍스처 좌표 목록이 있습니다. 얼굴 정의는 : f vertex/texture/normal이므로 f 1/1 2/2 3/3이면이면은 정점 및 텍스처 좌표 배열의 처음 세 값으로 구성됩니다. Wikipedia에는 ​​이것에 대한 많은 좋은 정보가 있습니다. http://en.wikipedia.org/wiki/Obj – CaseyB

관련 문제