OBJ File reader implementation.

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
sigonasr2, Sig, Sigo 2021-11-02 15:34:20 +00:00
parent baec7c6f38
commit 8f7d77dfa8
5 changed files with 83 additions and 20 deletions

View File

@ -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);

View File

@ -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();

View File

@ -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;

View File

@ -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()]);
}
}

View File

@ -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;
}
}