Я знаю, что это не совсем тот вопрос, который вы задавали, поскольку вы хотите использовать libobj, но я считаю, что гораздо лучше научиться делать что-то самому, чем использовать готовую библиотеку.Я на самом деле только что закончил реализацию простого читателя .obj для моей программы.Я опубликую это здесь, чтобы вы начали.
Обратите внимание, что он содержит некоторый код, который специфичен для моей реализации (например, как я обрабатываю свои буферы вершин и т. Д.), И он по-прежнему обрабатывает только объектные файлы с одним объектом в нем. Но, надеюсь, это поможет вам выбрать правильный путь.
Кроме того, я следовал учебнику, который нашел в Интернете (не могу вспомнить, какой), поэтому я не могу взять на себя всю ответственность за это.
private class Face{
public int[] v;
public int[] vt;
public int[] vn;
public Face(){
v = new int[3];
vt = new int[3];
vn = new int[3];
for(int i = 0; i < 3; i++){
v[i] = vt[i] = vn[i] = -1;
}
}
}
public void readObjFile(String fileName){
Reader r;
try{
r = new FileReader(fileName);
BufferedReader reader = new BufferedReader(r);
String line = null;
int lineNo = 0;
float[] floatTemp = new float[3];
int[] intTemp = new int[3];
ArrayList<Face> faces = new ArrayList<Face>();
ArrayList<Vector3> v = new ArrayList<Vector3>();
ArrayList<Vector2> vt = new ArrayList<Vector2>();
ArrayList<Vector3> vn = new ArrayList<Vector3>();
while((line = reader.readLine()) != null){
++lineNo;
String[] elements = line.split("\\s+");
if(elements.length > 0){
if(elements[0].equals("v")){
if(elements.length < 4){
System.out.println("Something is wrong with the obj loading");
}
else{
//mVertexBuffer.addVertex(new Vector3(Float.parseFloat(elements[1]), Float.parseFloat(elements[2]),Float.parseFloat(elements[3])));
v.add(new Vector3(Float.parseFloat(elements[1]), Float.parseFloat(elements[2]),Float.parseFloat(elements[3])));
}
}
else if(elements[0].equals("vt")){
if(elements.length < 3){
System.out.println("Something is wrong with the obj loading");
}
else{
//mVertexBuffer.addTextureCoord(new Vector2(Float.parseFloat(elements[1]), Float.parseFloat(elements[2])));
vt.add(new Vector2(Float.parseFloat(elements[1]), 1.0f - Float.parseFloat(elements[2])));
}
}
else if(elements[0].equals("vn"))
{
if(elements.length < 4){
System.out.println("Something is wrong with the obj loading");
}
else{
//mVertexBuffer.addVertex(new Vector3(Float.parseFloat(elements[1]), Float.parseFloat(elements[2]),Float.parseFloat(elements[3])));
vn.add(new Vector3(Float.parseFloat(elements[1]), Float.parseFloat(elements[2]),Float.parseFloat(elements[3])));
}
}
else if(elements[0].equals("f")){
if(elements.length != 4){
System.out.println("Something is wrong with the obj loading");
}
else{
//if(mIndexBuffer == null){
// mIndexBuffer = new IndexBuffer(mGl);
//}
Face newFace = new Face();
for (int i = 1; i < 4; i++) {
String seg = elements[i];
if(seg.indexOf("/") > 0)
{
String[] faceOrder = seg.split("/");
if (faceOrder.length > 0) {
//mIndexBuffer.addIndex(Integer.valueOf(faceOrder[0]) - 1);
newFace.v[i - 1] = Integer.valueOf(faceOrder[0]) - 1;
}
if (faceOrder.length > 1) {
if(faceOrder[1].length() > 0){
//f.uvIndices.add(Integer.valueOf(faceOrder[1]));
newFace.vt[i - 1] = Integer.valueOf(faceOrder[1]) - 1;
}
}
if (faceOrder.length > 2) {
//f.normalIndices.add(Integer.valueOf(faceOrder[2]));
newFace.vn[i - 1] = Integer.valueOf(faceOrder[2]) - 1;
}
}
else
{
if (seg.length() > 0) {
//mIndexBuffer.addIndex(Integer.valueOf(seg) - 1);
newFace.v[i - 1] = Integer.valueOf(seg) - 1;
}
}
}
faces.add(newFace);
}
}
}
}
// Now do post process
for(int i = 0; i < faces.size(); i++){
mVertexBuffer.addVertex(v.get(faces.get(i).v[0]));
mVertexBuffer.addVertex(v.get(faces.get(i).v[1]));
mVertexBuffer.addVertex(v.get(faces.get(i).v[2]));
if(vt.size() > 0){
mVertexBuffer.addTextureCoord(vt.get(faces.get(i).vt[0]));
mVertexBuffer.addTextureCoord(vt.get(faces.get(i).vt[1]));
mVertexBuffer.addTextureCoord(vt.get(faces.get(i).vt[2]));
}
}
}
catch(IOException e){
e.printStackTrace();
}
}