OBJ File reader implementation.

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
origin
sigonasr2, Sig, Sigo 3 years ago
parent baec7c6f38
commit 8f7d77dfa8
  1. 8
      src/sig/Panel.java
  2. 18
      src/sig/SigRenderer.java
  3. 2
      src/sig/Triangle.java
  4. 35
      src/sig/utils/FileUtils.java
  5. 40
      src/sig/utils/OBJReader.java

@ -115,9 +115,9 @@ public class Panel extends JPanel implements Runnable {
triTranslated = (Triangle)triRotatedZX.clone();
triTranslated.A.z=triRotatedZX.A.z+3f;
triTranslated.B.z=triRotatedZX.B.z+3f;
triTranslated.C.z=triRotatedZX.C.z+3f;
triTranslated.A.z=triRotatedZX.A.z+6f;
triTranslated.B.z=triRotatedZX.B.z+6f;
triTranslated.C.z=triRotatedZX.C.z+6f;
Vector3f normal=new Vector3f(),line1=new Vector3f(),line2=new Vector3f();
line1.x=triTranslated.B.x-triTranslated.A.x;
@ -142,7 +142,7 @@ public class Panel extends JPanel implements Runnable {
l = (float)Math.sqrt(lightDir.x*lightDir.x+lightDir.y*lightDir.y+lightDir.z*lightDir.z);
lightDir.x/=l; lightDir.y/=l; lightDir.z/=l;
float dp = normal.x*lightDir.x+normal.y*lightDir.y+normal.z*lightDir.z;
float dp = Math.abs(normal.x*lightDir.x+normal.y*lightDir.y+normal.z*lightDir.z);
Matrix.MultiplyMatrixVector(triTranslated.A, triProjected.A, SigRenderer.matProj);
Matrix.MultiplyMatrixVector(triTranslated.B, triProjected.B, SigRenderer.matProj);

@ -6,10 +6,12 @@ import javax.vecmath.Tuple3d;
import javax.vecmath.Vector3f;
import sig.utils.DrawUtils;
import sig.utils.OBJReader;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.File;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
@ -57,21 +59,7 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene
}
SigRenderer(JFrame f) {
cube = new Mesh(Arrays.asList(
new Triangle[]{
new Triangle(new Vector3f(),new Vector3f(0,1,0),new Vector3f(1,1,0)),
new Triangle(new Vector3f(),new Vector3f(1,1,0),new Vector3f(1,0,0)),
new Triangle(new Vector3f(1,0,0),new Vector3f(1,1,0),new Vector3f(1,1,1)),
new Triangle(new Vector3f(1,0,0),new Vector3f(1,1,1),new Vector3f(1,0,1)),
new Triangle(new Vector3f(1,0,1),new Vector3f(1,1,1),new Vector3f(0,1,1)),
new Triangle(new Vector3f(1,0,1),new Vector3f(0,1,1),new Vector3f(0,0,1)),
new Triangle(new Vector3f(0,0,1),new Vector3f(0,1,1),new Vector3f(0,1,0)),
new Triangle(new Vector3f(0,0,1),new Vector3f(0,1,0),new Vector3f(0,0,0)),
new Triangle(new Vector3f(0,1,0),new Vector3f(0,1,1),new Vector3f(1,1,1)),
new Triangle(new Vector3f(0,1,0),new Vector3f(1,1,1),new Vector3f(1,1,0)),
new Triangle(new Vector3f(1,0,1),new Vector3f(0,0,1),new Vector3f(0,0,0)),
new Triangle(new Vector3f(1,0,1),new Vector3f(0,0,0),new Vector3f(1,0,0)),
}));
cube = new Mesh(OBJReader.ReadOBJFile("teapot.obj"));
Panel p = new Panel();

@ -5,7 +5,7 @@ import java.awt.Color;
public class Triangle {
Vector3f A,B,C;
Color col = Color.WHITE;
Triangle(Vector3f A,Vector3f B,Vector3f C) {
public Triangle(Vector3f A,Vector3f B,Vector3f C) {
this.A=A;
this.B=B;
this.C=C;

@ -0,0 +1,35 @@
package sig.utils;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class FileUtils {
public static String[] readFromFile(String filename) {
File file = new File(filename);
//System.out.println(file.getAbsolutePath());
List<String> contents= new ArrayList<String>();
if (file.exists()) {
try(
FileReader fw = new FileReader(filename);
BufferedReader bw = new BufferedReader(fw);)
{
String readline = bw.readLine();
do {
if (readline!=null) {
//System.out.println(readline);
contents.add(readline);
readline = bw.readLine();
}} while (readline!=null);
fw.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return contents.toArray(new String[contents.size()]);
}
}

@ -0,0 +1,40 @@
package sig.utils;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import javax.vecmath.Vector3f;
import sig.Triangle;
public class OBJReader {
public static List<Triangle> ReadOBJFile(String f) {
String[] data = FileUtils.readFromFile(f);
List<float[]> vertices = new ArrayList<>();
List<Triangle> tris = new ArrayList<>();
for (String s : data) {
String[] split = s.split(Pattern.quote(" "));
if (split[0].equalsIgnoreCase("v")) {
vertices.add(new float[]{Float.parseFloat(split[1]),Float.parseFloat(split[2]),Float.parseFloat(split[3])});
} else
if (split[0].equalsIgnoreCase("f")) {
tris.add(new Triangle(
new Vector3f(
vertices.get(Integer.parseInt(split[1])-1)[0],
vertices.get(Integer.parseInt(split[1])-1)[1],
vertices.get(Integer.parseInt(split[1])-1)[2]),
new Vector3f(
vertices.get(Integer.parseInt(split[2])-1)[0],
vertices.get(Integer.parseInt(split[2])-1)[1],
vertices.get(Integer.parseInt(split[2])-1)[2]),
new Vector3f(
vertices.get(Integer.parseInt(split[3])-1)[0],
vertices.get(Integer.parseInt(split[3])-1)[1],
vertices.get(Integer.parseInt(split[3])-1)[2])));
}
}
return tris;
}
}
Loading…
Cancel
Save