打开一个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;
}
}
也可以使用第三方库 封装以后再导入也行 第三方库
可以看到模型成功导入了 这时我们由于无法移动视角 而看不到模型的位置 因此下一节我们要写摄像机类 调视角