Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 加载.obj文件会产生奇怪的结果_Java_Lwjgl_Loader_.obj - Fatal编程技术网

Java 加载.obj文件会产生奇怪的结果

Java 加载.obj文件会产生奇怪的结果,java,lwjgl,loader,.obj,Java,Lwjgl,Loader,.obj,我正在编写一个Java LWJGL 3D游戏引擎。我决定重写我的mesh类和.obj加载程序。当手动输入数据时,mesh类工作正常,但从.obj文件加载时,它会产生一些奇怪的结果:它应该是一条龙,但像2D一样笨拙。。。某物 public static Mesh loadMesh(String fileName) throws IOException { String splitArray[] = fileName.split("\\."); String ext = splitA

我正在编写一个Java LWJGL 3D游戏引擎。我决定重写我的mesh类和.obj加载程序。当手动输入数据时,mesh类工作正常,但从.obj文件加载时,它会产生一些奇怪的结果:它应该是一条龙,但像2D一样笨拙。。。某物

public static Mesh loadMesh(String fileName) throws IOException
{
    String splitArray[] = fileName.split("\\.");
    String ext = splitArray[splitArray.length-1];

    if(!ext.equals("obj"))
        System.err.println("Error: Engine can only load .obj files, try converting the file: " + fileName);

    ArrayList<Vector3f> vertices = new ArrayList<Vector3f>();
    ArrayList<Integer> vindices = new ArrayList<Integer>();
    ArrayList<Integer> tindices = new ArrayList<Integer>();
    ArrayList<Integer> nindices = new ArrayList<Integer>();
    ArrayList<Vector3f> normals  = new ArrayList<Vector3f>();
    ArrayList<Vector2f> texCoords = new ArrayList<Vector2f>();



    BufferedReader reader = new BufferedReader(new FileReader("./res/models/"+fileName));
    String line = "";

    while((line=reader.readLine())!=null)
    {
        String[] p = line.split(" ");
        if(line.startsWith("v"))
        {
            vertices.add(new Vector3f(Float.valueOf(p[1]),
                                      Float.valueOf(p[2]),
                                      Float.valueOf(p[3])));
        }
        if(line.startsWith("vn"))
        {
            normals.add(new Vector3f(Float.valueOf(p[1]),
                                      Float.valueOf(p[2]),
                                      Float.valueOf(p[3])));
        }
        if(line.startsWith("vt"))
        {
            texCoords.add(new Vector2f(Float.valueOf(p[1]),
                                      Float.valueOf(p[2])));
        }
        if(line.startsWith("f"))
        {
            String[] arg1 = p[1].split("/");
            String[] arg2 = p[2].split("/");
            String[] arg3 = p[3].split("/");
            vindices.add(Integer.parseInt(arg1[0]));
            if(arg1.length>1)
            tindices.add(Integer.parseInt(arg1[1]));
            if(arg1.length>2)
            nindices.add(Integer.parseInt(arg1[3]));

            vindices.add(Integer.parseInt(arg2[0]));
            if(arg1.length>1)
            tindices.add(Integer.parseInt(arg2[1]));
            if(arg2.length>2)
            nindices.add(Integer.parseInt(arg2[3]));

            vindices.add(Integer.parseInt(arg3[0]));
            if(arg1.length>1)
            tindices.add(Integer.parseInt(arg3[1]));
            if(arg3.length>2)
            nindices.add(Integer.parseInt(arg3[3]));
        }   
    }

    float[] vdata = new float[vertices.size() * 3];
    float[] tdata = new float[texCoords.size() * 2];
    float[] ndata = new float[normals.size() * 3];
    for(int i = 0; i < vdata.length; i++)
    {
        vdata[i] = vertices.get(Integer.valueOf(vindices.get(i))).getX();
        vdata[i++] = vertices.get(Integer.valueOf(vindices.get(i))).getY();
        vdata[i++] = vertices.get(Integer.valueOf(vindices.get(i))).getZ();
    }
    for(int i = 0; i < ndata.length; i++)
    {
        ndata[i] = normals.get(Integer.valueOf(nindices.get(i))).getX();
        ndata[i++] = normals.get(Integer.valueOf(nindices.get(i))).getY();
        ndata[i++] = normals.get(Integer.valueOf(nindices.get(i))).getZ();
    }
    for(int i = 0; i < tdata.length; i++)
    {
        tdata[i] = texCoords.get(Integer.valueOf(tindices.get(i))).getX();
        tdata[i++] = texCoords.get(Integer.valueOf(tindices.get(i))).getY();
    }
    return new Mesh(vdata, tdata, ndata);
}

这是我的.obj文件加载器。看不出哪里出了问题…

仔细检查后,发现了一些不错的错误:

vindices.add(Integer.parseInt(arg1[0]));
if(arg1.length>1)
tindices.add(Integer.parseInt(arg1[1]));
if(arg1.length>2)
nindices.add(Integer.parseInt(arg1[3])); // this should be 2 for the normals


每个面只能容纳三个顶点。您的对象是否仅导出为tri,即没有四边形?仅导出三角形,在我更改它之前,它工作得非常好…您完全正确。现在它是3D的,但看起来还是不太对劲。我一定是把索引搞砸了。。。
for(int i = 0; i < vdata.length; i++)
{
    vdata[i] = vertices.get(Integer.valueOf(vindices.get(i))).getX();  //i=0
    vdata[i++] = vertices.get(Integer.valueOf(vindices.get(i))).getY(); //i=0 and counted up afterwards
    vdata[i++] = vertices.get(Integer.valueOf(vindices.get(i))).getZ();//i=1 and counted up afterwards
}
for(int i = 0; i < vdata.length; i+=3)
{
    vdata[i] = vertices.get(Integer.valueOf(vindices.get(i))).getX();
    vdata[i+1] = vertices.get(Integer.valueOf(vindices.get(i))).getY(); 
    vdata[i+2] = vertices.get(Integer.valueOf(vindices.get(i))).getZ();
}