2013-07-15 3 views
0

Я хочу загрузить OBJ-модели в OpenGL. Но у меня возникли проблемы с получением данных о модели, когда я прочитал файл, я получаю эту ошибку:java.lang.NumberFormatException: пустая строка - OBJ Model Loader

Exception in thread "main" java.lang.NumberFormatException: empty String 
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1011) 
    at java.lang.Float.valueOf(Float.java:417) 
    at game.trippylizard.OBJLoader.loadModel(OBJLoader.java:18) 
    at game.trippylizard.MainScreen.<init>(MainScreen.java:39) 
    at game.trippylizard.MainScreen.main(MainScreen.java:71) 

Это код в моем классе OBJLoader:

public class OBJLoader { 
    public static Model loadModel(File f) throws FileNotFoundException, IOException { 
     BufferedReader reader = new BufferedReader(new FileReader(f)); 
     Model m = new Model(); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      if (line.startsWith("v ")) { 
       float x = Float.valueOf(line.split(" ")[1]); //Error is here 
       float y = Float.valueOf(line.split(" ")[2]); 
       float z = Float.valueOf(line.split(" ")[3]); 
       m.vertices.add(new Vector3f(x,y,z)); 
      } else if (line.startsWith("vn ")) { 
       float x = Float.valueOf(line.split(" ")[1]); 
       float y = Float.valueOf(line.split(" ")[2]); 
       float z = Float.valueOf(line.split(" ")[3]); 
       m.normals.add(new Vector3f(x,y,z)); 
      } else if (line.startsWith("f ")) { 
       Vector3f vertexIndices = new Vector3f(
         Float.valueOf(line.split(" ")[1].split("/")[0]), 
         Float.valueOf(line.split(" ")[2].split("/")[0]), 
         Float.valueOf(line.split(" ")[3].split("/")[0]) 
       ); 

       Vector3f normalIndices = new Vector3f(
         Float.valueOf(line.split(" ")[1].split("/")[2]), 
         Float.valueOf(line.split(" ")[2].split("/")[2]), 
         Float.valueOf(line.split(" ")[3].split("/")[2]) 
       ); 

       m.faces.add(new Face(vertexIndices, normalIndices)); 
      } 
     } 
     reader.close(); 
     return m; 
    } 
} 

Может кто-то сказать мне как это исправить?

P.S. Я новичок в регулярном выражении и такого рода форматировании.

+0

Просьба предоставить образец вашего входа. Возможно, ваш вход не является допустимым поплавком или неправильно проанализирован. – ChristopherS

+0

Пожалуйста, укажите строку 18 в вашем коде класса OBJLoader. –

ответ

1

Кажется, что ваши строки определения вершин модели содержат больше одного места после директивы «v». Вы ожидаете, что это:

"v -1.0 1.0 1.0" 

но модель содержит следующее:

"v -1.0 1.0 1.0" 

так что ваш код не справиться с такой ситуацией.

Попробуйте разобрать, как это:

String arr[] = line.substring(2).trim().split(" "); 

    float x = Float.parseFloat(arr[0]); 
    float y = Float.parseFloat(arr[1]); 
    float z = Float.parseFloat(arr[2]); 
    m.vertices.add(new Vector3f(x,y,z)); 
Смежные вопросы