Hallo
Ich habe einen komischen Bug beim Laden von .obj Dateien.
Der Bug wirkt sich nicht darauf aus, wie es angezeigt wird.
Es handelt sich um ein Objekt mit 8 Punkten
# Blender v2.74 (sub 0) OBJ File: ''
# www.blender.org
mtllib barren.mtl
o Cube_Cube.001
v -0.311052 0.217910 0.798047
v -0.456289 -0.014817 0.925725
v -0.456289 -0.014817 -0.925042
v 0.312115 0.217910 0.798047
v 0.456697 -0.014817 0.925725
v 0.313673 0.218541 -0.798578
v 0.456697 -0.014817 -0.925042
v -0.311052 0.217910 -0.797382
vn 0.848400 -0.529400 -0.000000
vn 0.000000 -0.481000 -0.876700
vn -0.852900 -0.522100 -0.001000
vn 0.000000 -0.480900 0.876800
vn 0.000000 1.000000 0.000000
vn 0.000600 -1.000000 -0.000200
vn 0.000000 -1.000000 -0.000000
vn 0.000500 -1.000000 -0.000200
vn -0.849400 -0.527700 -0.000000
vn 0.002200 -0.475400 0.879700
vn 0.001000 -1.000000 -0.000400
usemtl None
s 1
f 1//1 2//1 3//1
f 1//2 4//2 5//2
f 4//3 6//3 7//3
f 8//4 3//4 7//4
f 2//5 5//5 7//5
f 4//6 1//7 8//8
f 8//1 1//1 3//1
f 2//2 1//2 5//2
f 5//9 4//9 7//9
f 6//10 8//10 7//10
f 3//5 2//5 7//5
f 6//11 4//6 8//8
Aber wenn ich das Objekt lade und die Punkte ausgebe sind es 28 Punkte und es gibt welche, die in der .obj Datei nicht existieren:
-0.311052 0.11791 0.798047
-0.456289 -0.114817 0.925725
-0.456289 -0.114817 -0.925042
-0.311052 0.11791 0.798047
0.312115 0.11791 0.798047
0.456697 -0.114817 0.925725
0.312115 0.11791 0.798047
0.313673 0.118541 -0.798578
0.456697 -0.114817 -0.925042
-0.311052 0.11791 -0.797382
-0.456289 -0.114817 -0.925042
0.456697 -0.114817 -0.925042
-0.456289 -0.114817 0.925725
0.456697 -0.114817 0.925725
0.456697 -0.114817 -0.925042
0.312115 0.11791 0.798047
-0.311052 0.11791 0.798047
-0.311052 0.11791 -0.797382
-0.311052 0.11791 -0.797382
-0.456289 -0.114817 0.925725
0.456697 -0.114817 0.925725
0.312115 0.11791 0.798047
0.456697 -0.114817 -0.925042
0.313673 0.118541 -0.798578
-0.311052 0.11791 -0.797382
0.456697 -0.114817 -0.925042
-0.456289 -0.114817 -0.925042
0.313673 0.118541 -0.798578
Zum laden verwende ich den Code, der dem ein oder anderen schon aus “Indexberechnung bei einer “Schale”” bekannt sein könnte.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class OBJReader {
private static final Charset CHARSET = Charset.forName("US-ASCII");
private final List<Integer> indices = new ArrayList<Integer>();
private int index = 0;
List<Float> vertex = new ArrayList<Float>();
List<Float> texCoords = new ArrayList<Float>();
List<Float> normals = new ArrayList<Float>();
public OBJReader(final InputStream is) {
parse(is);
}
public final List<Integer> getIndices() {
return Collections.unmodifiableList(indices);
}
private void parse(final InputStream is) {
final List<Float> v = new ArrayList<Float>();
final List<Float> vt = new ArrayList<Float>();
final List<Float> vn = new ArrayList<Float>();
final Map<String, Integer> f = new HashMap<String, Integer>();
try (final BufferedReader br = new BufferedReader(new InputStreamReader(is, CHARSET))) {
String line;
while ((line = br.readLine()) != null) {
if (line.contains("#"))
line = line.substring(0, line.indexOf("#"));
line = line.trim();
if (line.length() > 0) {
final String[] values = line.split(" ");
switch (values[0]) {
case "v":
parseV(v, values);
break;
case "vt":
parseVT(vt, values);
break;
case "vn":
parseVN(vn, values);
break;
case "f":
parseF(v, vt, vn, f, values);
break;
default:
break;
}
}
}
} catch (final IOException e) {
throw new RuntimeException(e);
}
}
private void parseV(final List<Float> v, final String[] values) throws IOException {
if (3 != values.length - 1)
throw new IOException("unsupported file format (v dimension)");
for (int i = 1; i <= 3; i++)
v.add(Float.valueOf(values**));
}
private void parseVT(final List<Float> vt, final String[] values) throws IOException {
if (2 != values.length - 1)
throw new IOException("unsupported file format (vt dimension)");
for (int i = 1; i <= 2; i++)
vt.add(Float.valueOf(values**));
}
private void parseVN(final List<Float> vn, final String[] values) throws IOException {
if (3 != values.length - 1)
throw new IOException("unsupported file format (vn dimension)");
for (int i = 1; i <= 3; i++)
vn.add(Float.valueOf(values**));
}
private void parseF(final List<Float> v, final List<Float> vt, final List<Float> vn, final Map<String, Integer> f, final String[] values) throws IOException {
if (3 != values.length - 1)
throw new IOException("unsupported file format (only triangle faces supported)");
for (int i = 1; i <= 3; i++) {
if (!f.containsKey(values**))
parseF(v, vt, vn, f, values**);
indices.add(f.get(values**));
}
}
private void parseF(final List<Float> v, final List<Float> vt, final List<Float> vn, final Map<String, Integer> f, final String value) throws IOException {
final String[] values = value.split("/");
if (3 != values.length)
throw new IOException("unsupported file format (face components)");
final int vID = Integer.valueOf(values[0]) - 1;
for (int i = 0; i < 3; i++)
vertex.add(v.get(vID * 3 + i));
if(values[1].length() > 0){
final int vtID = Integer.valueOf(values[1]) - 1;
for (int i = 0; i < 2; i++)
texCoords.add(vt.get(vtID * 2 + i));
}
final int vnID = Integer.valueOf(values[2]) - 1;
for (int i = 0; i < 3; i++)
normals.add(vn.get(vnID * 3 + i));
f.put(value, index++);
}
}