2014-02-23 3 views
1

.obj 파일 판독기에 문제가 있습니다.LWJGL의 .obj 파일을 읽지 못했습니다.

# Blender3D v249 OBJ File: untitled.blend 
# www.blender3d.org 
mtllib cube.mtl 
v 1.000000 -1.000000 -1.000000 
v 1.000000 -1.000000 1.000000 
v -1.000000 -1.000000 1.000000 
v -1.000000 -1.000000 -1.000000 
v 1.000000 1.000000 -1.000000 
v 0.999999 1.000000 1.000001 
v -1.000000 1.000000 1.000000 
v -1.000000 1.000000 -1.000000 
vt 0.748573 0.750412 
vt 0.749279 0.501284 
vt 0.999110 0.501077 
vt 0.999455 0.750380 
vt 0.250471 0.500702 
vt 0.249682 0.749677 
vt 0.001085 0.750380 
vt 0.001517 0.499994 
vt 0.499422 0.500239 
vt 0.500149 0.750166 
vt 0.748355 0.998230 
vt 0.500193 0.998728 
vt 0.498993 0.250415 
vt 0.748953 0.250920 
vn 0.000000 0.000000 -1.000000 
vn -1.000000 -0.000000 -0.000000 
vn -0.000000 -0.000000 1.000000 
vn -0.000001 0.000000 1.000000 
vn 1.000000 -0.000000 0.000000 
vn 1.000000 0.000000 0.000001 
vn 0.000000 1.000000 -0.000000 
vn -0.000000 -1.000000 0.000000 
usemtl Material_ray.png 
s off 
f 5/1/1 1/2/1 4/3/1 
f 5/1/1 4/3/1 8/4/1 
f 3/5/2 7/6/2 8/7/2 
f 3/5/2 8/7/2 4/8/2 
f 2/9/3 6/10/3 3/5/3 
f 6/10/4 7/6/4 3/5/4 
f 1/2/5 5/1/5 2/9/5 
f 5/1/6 6/10/6 2/9/6 
f 5/1/7 8/11/7 6/10/7 
f 8/11/7 7/12/7 6/10/7 
f 1/2/8 2/9/8 3/13/8 
f 1/2/8 3/13/8 4/14/8 

모델 로더 클래스 : :이 .OBJ 파일은 다음과 같습니다

package com.crystalcode.lwjgl; 

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 

import org.lwjgl.util.vector.Vector3f; 

public class Model 
{ 
    private ArrayList <Vector3f> vertexList; 
    private ArrayList <Vector3f> textureList; 
    private ArrayList <Vector3f> normalList; 

    public Model(String obj) 
    { 
     vertexList = new ArrayList<>(); 
     textureList = new ArrayList<>(); 
     normalList = new ArrayList<>(); 

     try 
     {   
      BufferedReader bufferedReader = new BufferedReader(new FileReader(obj)); 
      String line = ""; 

      while ((line = bufferedReader.readLine()) != null) 
      { 
       if (line.startsWith("f ")) 
       { 
        // Split the line 
         String[] values = line.split(" "); 

        // Parse the vertex indices 
         float v1 = Float.parseFloat(values[1].split("/")[0]); 
         float v2 = Float.parseFloat(values[2].split("/")[0]); 
         float v3 = Float.parseFloat(values[3].split("/")[0]); 

         Vector3f vertex = new Vector3f(v1, v2, v3); 
         vertexList.add(vertex); 

        // Parse the texture indices 
         float vt1 = Float.parseFloat(values[1].split("/")[1]); 
         float vt2 = Float.parseFloat(values[2].split("/")[1]); 
         float vt3 = Float.parseFloat(values[3].split("/")[1]); 

         Vector3f texture = new Vector3f(vt1, vt2, vt3); 
         textureList.add(texture); 

        // Parse the normal indices 
         float vn1 = Float.parseFloat(values[1].split("/")[2]); 
         float vn2 = Float.parseFloat(values[2].split("/")[2]); 
         float vn3 = Float.parseFloat(values[3].split("/")[2]); 

         Vector3f normal = new Vector3f(vn1, vn2, vn3); 
         normalList.add(normal); 

        // Debug 
         System.out.println ("Vertex: " + vertex.toString() + "\t\tTexture: " + texture.toString() + "\tNormal: " + normal.toString()); 

       } 
      } 
     } catch (FileNotFoundException e) 
     { 
      e.printStackTrace(); 
     } catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public float[] getVertex() 
    {  
     int counter = 0; 

     float[] vertexArray; 
     vertexArray = new float[vertexList.size() * 3]; 

     for (Vector3f vertex : vertexList) 
     { 
      vertexArray[counter + 0] = vertex.x; 
      vertexArray[counter + 1] = vertex.y; 
      vertexArray[counter + 2] = vertex.z; 

      counter += 3; 
     } 

     return vertexArray; 
    } 

    public float[] getColor() 
    {  
     int counter = 0; 

     float[] colorArray; 
     colorArray = new float[vertexList.size() * 3]; 

     for (Vector3f vertex : vertexList) 
     { 
      colorArray[counter + 0] = (float) Math.random(); 
      colorArray[counter + 1] = (float) Math.random(); 
      colorArray[counter + 2] = (float) Math.random(); 

      counter += 3; 
     } 

     return colorArray; 
    } 
} 

얼굴은 다음과 같이 읽어됩니다

Vertex: Vector3f[5.0, 1.0, 4.0]  Texture: Vector3f[1.0, 2.0, 3.0] Normal: Vector3f[1.0, 1.0, 1.0] 
Vertex: Vector3f[5.0, 4.0, 8.0]  Texture: Vector3f[1.0, 3.0, 4.0] Normal: Vector3f[1.0, 1.0, 1.0] 
Vertex: Vector3f[3.0, 7.0, 8.0]  Texture: Vector3f[5.0, 6.0, 7.0] Normal: Vector3f[2.0, 2.0, 2.0] 
Vertex: Vector3f[3.0, 8.0, 4.0]  Texture: Vector3f[5.0, 7.0, 8.0] Normal: Vector3f[2.0, 2.0, 2.0] 
Vertex: Vector3f[2.0, 6.0, 3.0]  Texture: Vector3f[9.0, 10.0, 5.0] Normal: Vector3f[3.0, 3.0, 3.0] 
Vertex: Vector3f[6.0, 7.0, 3.0]  Texture: Vector3f[10.0, 6.0, 5.0] Normal: Vector3f[4.0, 4.0, 4.0] 
Vertex: Vector3f[1.0, 5.0, 2.0]  Texture: Vector3f[2.0, 1.0, 9.0] Normal: Vector3f[5.0, 5.0, 5.0] 
Vertex: Vector3f[5.0, 6.0, 2.0]  Texture: Vector3f[1.0, 10.0, 9.0] Normal: Vector3f[6.0, 6.0, 6.0] 
Vertex: Vector3f[5.0, 8.0, 6.0]  Texture: Vector3f[1.0, 11.0, 10.0] Normal: Vector3f[7.0, 7.0, 7.0] 
Vertex: Vector3f[8.0, 7.0, 6.0]  Texture: Vector3f[11.0, 12.0, 10.0] Normal: Vector3f[7.0, 7.0, 7.0] 
Vertex: Vector3f[1.0, 2.0, 3.0]  Texture: Vector3f[2.0, 9.0, 13.0] Normal: Vector3f[8.0, 8.0, 8.0] 
Vertex: Vector3f[1.0, 3.0, 4.0]  Texture: Vector3f[2.0, 13.0, 14.0] Normal: Vector3f[8.0, 8.0, 8.0] 

그러나 경우 I VBO를 렌더링하면 다음과 같이 보입니다.

텍스처가 무시되고 쿼드가 임의의 색상으로 채워집니다.

무엇이 잘못 되었나요?

+0

코드가 없으면 말할 수 없지만 텍스처 좌표가 잘못 보입니다. [0 - 1] 범위에 있어야합니다. –

답변

0

코드에 따라 정점 색상이 Math.random()을 사용하여 getColor()에 생성 된 것 같습니다. 다른 코드에서도 이미지 텍스처를 업로드하고 있습니까?

0

아, 이제 알겠습니다. 텍스처 좌표 의 인덱스를 좌표로 사용하고 있습니다. specs of the OBJ file format을 살펴 봐야합니다. 면은 정점, 법선 및 텍스처 좌표를 함께 연결하여 만듭니다.

관련 문제