나는 첫 번째 안드로이드 게임을 만들려고하는데, 나는 리소스 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);
}
어 주시면 자세히 설명해 주시겠습니까? – AlexRamallo
그래서 v 배열에서 나온 정점 목록이 있고 vt 배열에서 나온 텍스처 좌표 목록이 있습니다. 얼굴 정의는 : f vertex/texture/normal이므로 f 1/1 2/2 3/3이면이면은 정점 및 텍스처 좌표 배열의 처음 세 값으로 구성됩니다. Wikipedia에는 이것에 대한 많은 좋은 정보가 있습니다. http://en.wikipedia.org/wiki/Obj – CaseyB