Indagamos en el mundo online para de este modo darte la respuesta para tu duda, en caso de dudas deja tu inquietud y te contestaremos porque estamos para servirte.
Solución:
Terminé escribiendo un nuevo analizador, se puede usar así para construir FloatBuffers para usar en su Renderer:
ObjLoader objLoader = new ObjLoader(context, "Mug.obj");
numFaces = objLoader.numFaces;
// Initialize the buffers.
positions = ByteBuffer.allocateDirect(objLoader.positions.length * mBytesPerFloat)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
positions.put(objLoader.positions).position(0);
normals = ByteBuffer.allocateDirect(objLoader.normals.length * mBytesPerFloat)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
normals.put(objLoader.normals).position(0);
textureCoordinates = ByteBuffer.allocateDirect(objLoader.textureCoordinates.length * mBytesPerFloat)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
textureCoordinates.put(objLoader.textureCoordinates).position(0);
y aquí está el analizador:
public final class ObjLoader
public final int numFaces;
public final float[] normals;
public final float[] textureCoordinates;
public final float[] positions;
public ObjLoader(Context context, String file)
Vector vertices = new Vector<>();
Vector normals = new Vector<>();
Vector textures = new Vector<>();
Vector faces = new Vector<>();
BufferedReader reader = null;
try
InputStreamReader in = new InputStreamReader(context.getAssets().open(file));
reader = new BufferedReader(in);
// read file until EOF
String line;
while ((line = reader.readLine()) != null)
String[] parts = line.split(" ");
switch (parts[0])
case "v":
// vertices
vertices.add(Float.valueOf(parts[1]));
vertices.add(Float.valueOf(parts[2]));
vertices.add(Float.valueOf(parts[3]));
break;
case "vt":
// textures
textures.add(Float.valueOf(parts[1]));
textures.add(Float.valueOf(parts[2]));
break;
case "vn":
// normals
normals.add(Float.valueOf(parts[1]));
normals.add(Float.valueOf(parts[2]));
normals.add(Float.valueOf(parts[3]));
break;
case "f":
// faces: vertex/texture/normal
faces.add(parts[1]);
faces.add(parts[2]);
faces.add(parts[3]);
break;
catch (IOException e)
// cannot load or read file
finally
if (reader != null)
try
reader.close();
catch (IOException e)
//log the exception
numFaces = faces.size();
this.normals = new float[numFaces * 3];
textureCoordinates = new float[numFaces * 2];
positions = new float[numFaces * 3];
int positionIndex = 0;
int normalIndex = 0;
int textureIndex = 0;
for (String face : faces)
String[] parts = face.split("/");
int index = 3 * (Short.valueOf(parts[0]) - 1);
positions[positionIndex++] = vertices.get(index++);
positions[positionIndex++] = vertices.get(index++);
positions[positionIndex++] = vertices.get(index);
index = 2 * (Short.valueOf(parts[1]) - 1);
textureCoordinates[normalIndex++] = textures.get(index++);
// NOTE: Bitmap gets y-inverted
textureCoordinates[normalIndex++] = 1 - textures.get(index);
index = 3 * (Short.valueOf(parts[2]) - 1);
this.normals[textureIndex++] = normals.get(index++);
this.normals[textureIndex++] = normals.get(index++);
this.normals[textureIndex++] = normals.get(index);
Prueba con este proyecto que me encontró en Github. https://github.com/WenlinMao/android-3d-model-viewer
Esta es una demostración de OpenGL ES 2.0. Es una aplicación de Android con un motor 3D que puede cargar archivos Wavefront OBJ, STL, DAE y glTF. La aplicación se basa en el proyecto de andresoviedo que se puede encontrar aquí con una función adicional de carga y renderizado en formato glTF.
El propósito de esta aplicación es aprender y compartir cómo dibujar usando OpenGLES y Android. Como esta es mi primera aplicación para Android, es muy probable que haya errores; pero intentaré seguir mejorando la aplicación y agregando más funciones.
¡Este proyecto es de código abierto y contiene clases que pueden resolver su problema!
Finalizando este artículo puedes encontrar las notas de otros usuarios, tú igualmente eres capaz mostrar el tuyo si te apetece.