Skip to content

Latest commit

 

History

History
148 lines (110 loc) · 4.19 KB

23.obj文件资源管理器.md

File metadata and controls

148 lines (110 loc) · 4.19 KB

GameEngine Java 3D V2.0

23.obj文件资源管理器

打开一个OBJ文件 发现里面也是这样 无法是以v开头的点的三维矢量 与以f开头的点的连接顺序

小提示

"v"表示顶点(vertex)

"f"表示面(face),连接点的顺序

"vt 1.000000 0.000000"这句"vt"代表点的贴图坐标。

"vn 0.000000 0.000000 -1.000000"这句"vn"代表点的法线。 "s off"表示关闭光滑组。

"usemtl initialShadingGroup"表示使用的材质。

"f 7/13/21"在面的数据中多了贴图坐标uv点和法线的索引号,索引号分别用左斜线(/)隔开。

格式:"f 顶点索引/uv点索引/法线索引"。

"g pCube1"表示组

更多阅读: obj文件详解

添加mesh loader

public class ResourceLoader {
    /*
    * 着色器加载
    * */
    public static String loadShader(String fileName)
    {
        StringBuilder shaderSource = new StringBuilder();
        BufferedReader shaderReader = null;

        try
        {
            shaderReader = new BufferedReader(new FileReader("src/main/resources/shaders/" + fileName));
            String line;

            while((line = shaderReader.readLine()) != null)
            {
                shaderSource.append(line).append("\n");
            }

            shaderReader.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
            System.exit(1);
        }


        return shaderSource.toString();
    }

    /*
    * 通过加载obj文件 生成网格类
    * */
    public static Mesh loadMesh(String fileName)
    {
        String[] splitArray = fileName.split("\\.");
        String ext = splitArray[splitArray.length - 1];

        if(!ext.equals("obj"))
        {
            System.err.println("Error: 该文件格式无法导入Mesh: " + ext);
            new Exception().printStackTrace();
            System.exit(1);
        }

        ArrayList<Vertex> vertices = new ArrayList<Vertex>();
        ArrayList<Integer> indices = new ArrayList<Integer>();

        BufferedReader meshReader = null;

        try
        {
            meshReader = new BufferedReader(new FileReader("src/main/resources/models/" + fileName));
            String line;

            while((line = meshReader.readLine()) != null)
            {
                String[] tokens = line.split(" ");
                tokens = Util.removeEmptyStrings(tokens);

                if(tokens.length == 0 || tokens[0].equals("#"))
                    continue;
                else if(tokens[0].equals("v"))
                {
                    vertices.add(new Vertex(new Vector3f(Float.valueOf(tokens[1]),
                            Float.valueOf(tokens[2]),
                            Float.valueOf(tokens[3]))));
                }
                else if(tokens[0].equals("f"))
                {
                    indices.add(Integer.parseInt(tokens[1].split("/")[0]) - 1);
                    indices.add(Integer.parseInt(tokens[2].split("/")[0]) - 1);
                    indices.add(Integer.parseInt(tokens[3].split("/")[0]) - 1);

                    if(tokens.length > 4)
                    {
                        indices.add(Integer.parseInt(tokens[1].split("/")[0]) - 1);
                        indices.add(Integer.parseInt(tokens[3].split("/")[0]) - 1);
                        indices.add(Integer.parseInt(tokens[4].split("/")[0]) - 1);
                    }
                }
            }

            meshReader.close();

            Mesh res = new Mesh();
            Vertex[] vertexData = new Vertex[vertices.size()];
            vertices.toArray(vertexData);

            Integer[] indexData = new Integer[indices.size()];
            indices.toArray(indexData);

            res.addVertices(vertexData, Util.toIntArray(indexData));

            return res;
        }
        catch(Exception e)
        {
            e.printStackTrace();
            System.exit(1);
        }

        return null;
    }
}

也可以使用第三方库 封装以后再导入也行 第三方库

可以看到模型成功导入了 这时我们由于无法移动视角 而看不到模型的位置 因此下一节我们要写摄像机类 调视角