From 8f7d77dfa8517966ec7e48cedeac18b7db990b87 Mon Sep 17 00:00:00 2001 From: "sigonasr2, Sig, Sigo" Date: Tue, 2 Nov 2021 15:34:20 +0000 Subject: [PATCH] OBJ File reader implementation. Co-authored-by: sigonasr2 --- src/sig/Panel.java | 8 ++++---- src/sig/SigRenderer.java | 18 +++------------- src/sig/Triangle.java | 2 +- src/sig/utils/FileUtils.java | 35 +++++++++++++++++++++++++++++++ src/sig/utils/OBJReader.java | 40 ++++++++++++++++++++++++++++++++++++ 5 files changed, 83 insertions(+), 20 deletions(-) create mode 100644 src/sig/utils/FileUtils.java create mode 100644 src/sig/utils/OBJReader.java diff --git a/src/sig/Panel.java b/src/sig/Panel.java index 7f0ae21..fa774de 100644 --- a/src/sig/Panel.java +++ b/src/sig/Panel.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); diff --git a/src/sig/SigRenderer.java b/src/sig/SigRenderer.java index fd80c53..b0e3d05 100644 --- a/src/sig/SigRenderer.java +++ b/src/sig/SigRenderer.java @@ -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(); diff --git a/src/sig/Triangle.java b/src/sig/Triangle.java index f86c614..153a552 100644 --- a/src/sig/Triangle.java +++ b/src/sig/Triangle.java @@ -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; diff --git a/src/sig/utils/FileUtils.java b/src/sig/utils/FileUtils.java new file mode 100644 index 0000000..bfa7178 --- /dev/null +++ b/src/sig/utils/FileUtils.java @@ -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 contents= new ArrayList(); + 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()]); + } +} diff --git a/src/sig/utils/OBJReader.java b/src/sig/utils/OBJReader.java new file mode 100644 index 0000000..cab5d2e --- /dev/null +++ b/src/sig/utils/OBJReader.java @@ -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 ReadOBJFile(String f) { + String[] data = FileUtils.readFromFile(f); + List vertices = new ArrayList<>(); + List 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; + } +}