Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package jraphics;
- import java.awt.*;
- import java.lang.management.ManagementFactory;
- import java.util.ArrayList;
- import java.util.Arrays;
- import javax.swing.*;
- public class Jraphics extends JPanel{
- static Mesh meshCube;
- static Mat4x4 matProj;
- static Jraphics panel;
- static long delta = 0;
- public static void main(String[] args) {
- final long startTime = System.nanoTime();
- JFrame.setDefaultLookAndFeelDecorated(true);
- JFrame frame = new JFrame("Graphics");
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- frame.setBackground(Color.white);
- frame.setSize(200,200);
- panel = new Jraphics();
- frame.add(panel);
- frame.setVisible(true);
- meshCube = new Mesh();
- meshCube.tris.add(new Triangle(new Vector3(0.0,0.0,0.0), new Vector3(0.0,1.0,0.0), new Vector3(1.0,1.0,0.0)));
- meshCube.tris.add(new Triangle(new Vector3(0.0,0.0,0.0), new Vector3(1.0,1.0,0.0), new Vector3(1.0,0.0,0.0)));
- meshCube.tris.add(new Triangle(new Vector3(1.0,0.0,0.0), new Vector3(1.0,1.0,0.0), new Vector3(1.0,1.0,1.0)));
- meshCube.tris.add(new Triangle(new Vector3(1.0,0.0,0.0), new Vector3(1.0,1.0,1.0), new Vector3(1.0,0.0,1.0)));
- meshCube.tris.add(new Triangle(new Vector3(1.0,0.0,1.0), new Vector3(1.0,1.0,1.0), new Vector3(0.0,1.0,1.0)));
- meshCube.tris.add(new Triangle(new Vector3(1.0,0.0,1.0), new Vector3(0.0,1.0,1.0), new Vector3(0.0,0.0,1.0)));
- meshCube.tris.add(new Triangle(new Vector3(0.0,0.0,1.0), new Vector3(0.0,1.0,1.0), new Vector3(0.0,1.0,0.0)));
- meshCube.tris.add(new Triangle(new Vector3(0.0,0.0,1.0), new Vector3(0.0,1.0,0.0), new Vector3(0.0,0.0,0.0)));
- meshCube.tris.add(new Triangle(new Vector3(0.0,1.0,0.0), new Vector3(0.0,1.0,1.0), new Vector3(1.0,1.0,1.0)));
- meshCube.tris.add(new Triangle(new Vector3(0.0,1.0,0.0), new Vector3(1.0,1.0,1.0), new Vector3(1.0,1.0,0.0)));
- meshCube.tris.add(new Triangle(new Vector3(1.0,0.0,1.0), new Vector3(0.0,0.0,1.0), new Vector3(0.0,0.0,0.0)));
- meshCube.tris.add(new Triangle(new Vector3(1.0,0.0,1.0), new Vector3(0.0,0.0,0.0), new Vector3(1.0,0.0,0.0)));
- double fNear = 0.1;
- double fFar = 1000.0;
- double fFov = 90.0;
- double fAspectRatio = (double)panel.getSize().height / (double)panel.getSize().width;
- double fFovRad = 1.0 / Math.tan(fFov * 0.5 / 180.0 * 3.14159);
- matProj = new Mat4x4();
- matProj.m[0][0] = fAspectRatio * fFovRad;
- matProj.m[1][1] = fFovRad;
- matProj.m[2][2] = fFar / (fFar - fNear);
- matProj.m[3][2] = (-fFar * fNear) / (fFar - fNear);
- matProj.m[2][3] = 1.0;
- matProj.m[3][3] = 0;
- while(true) {
- if(System.nanoTime() % 100000000 == 0) {
- frame.repaint();
- }
- long cTime = System.nanoTime();
- delta = cTime - delta;
- }
- }
- @Override
- public void paintComponent(Graphics g) {
- g.setColor(Color.BLACK);
- Mat4x4 matRotZ = new Mat4x4();
- Mat4x4 matRotX = new Mat4x4();
- long fTheta = delta;
- matRotZ.m[0][0] = Math.cos(fTheta);
- matRotZ.m[0][1] = Math.sin(fTheta);
- matRotZ.m[1][0] = - Math.sin(fTheta);
- matRotZ.m[1][1] = Math.cos(fTheta);
- matRotZ.m[2][2] = 1;
- matRotZ.m[3][3] = 1;
- matRotX.m[0][0] = 1;
- matRotX.m[0][1] = Math.cos(fTheta * 0.5);
- matRotX.m[1][0] = Math.sin(fTheta * 0.5);
- matRotX.m[1][1] = - Math.sin(fTheta * 0.5);
- matRotX.m[2][2] = Math.cos(fTheta * 0.5);
- matRotX.m[3][3] = 1;
- for(Triangle tri : meshCube.tris) {
- Triangle triProjected = new Triangle(new Vector3(0,0,0), new Vector3(0,0,0), new Vector3(0,0,0));
- Triangle triRotatedZ = new Triangle(new Vector3(0,0,0), new Vector3(0,0,0), new Vector3(0,0,0));
- Triangle triRotatedZX = new Triangle(new Vector3(0,0,0), new Vector3(0,0,0), new Vector3(0,0,0));
- triRotatedZ.p.set(0, MultiplyMatrixVector(tri.p.get(0), matRotZ));
- triRotatedZ.p.set(1, MultiplyMatrixVector(tri.p.get(1), matRotZ));
- triRotatedZ.p.set(2, MultiplyMatrixVector(tri.p.get(2), matRotZ));
- triRotatedZX.p.set(0, MultiplyMatrixVector(triRotatedZ.p.get(0), matRotX));
- triRotatedZX.p.set(1, MultiplyMatrixVector(triRotatedZ.p.get(1), matRotX));
- triRotatedZX.p.set(2, MultiplyMatrixVector(triRotatedZ.p.get(2), matRotX));
- Triangle triTranslated = new Triangle(triRotatedZX.p.get(0), triRotatedZX.p.get(1), triRotatedZX.p.get(2));
- triTranslated.p.get(0).z = triRotatedZX.p.get(0).z + 3.0;
- triTranslated.p.get(1).z = triRotatedZX.p.get(1).z + 3.0;
- triTranslated.p.get(2).z = triRotatedZX.p.get(2).z + 3.0;
- triProjected.p.set(0, MultiplyMatrixVector(triTranslated.p.get(0), matProj));
- triProjected.p.set(1, MultiplyMatrixVector(triTranslated.p.get(1), matProj));
- triProjected.p.set(2, MultiplyMatrixVector(triTranslated.p.get(2), matProj));
- triProjected.p.get(0).x += 1;
- triProjected.p.get(0).y += 1;
- triProjected.p.get(1).x += 1;
- triProjected.p.get(1).y += 1;
- triProjected.p.get(2).x += 1;
- triProjected.p.get(2).y += 1;
- triProjected.p.get(0).x *= 0.5 * (double) panel.getSize().width;
- triProjected.p.get(0).y *= 0.5 * (double) panel.getSize().height;
- triProjected.p.get(1).x *= 0.5 * (double) panel.getSize().width;
- triProjected.p.get(1).y *= 0.5 * (double) panel.getSize().height;
- triProjected.p.get(2).x *= 0.5 * (double) panel.getSize().width;
- triProjected.p.get(2).y *= 0.5 * (double) panel.getSize().height;
- int[] xPoints = {(int)triProjected.p.get(0).x, (int)triProjected.p.get(1).x, (int)triProjected.p.get(2).x};
- int[] yPoints = {(int)triProjected.p.get(0).y, (int)triProjected.p.get(1).y, (int)triProjected.p.get(2).y};
- g.drawPolygon(xPoints, yPoints, 3);
- }
- }
- public static Vector3 MultiplyMatrixVector(Vector3 i, Mat4x4 m) {
- Vector3 o = new Vector3(i.x,i.y,i.z);
- o.x = i.x * m.m[0][0] + i.y * m.m[1][0] + i.z * m.m[2][0] + m.m[3][0];
- o.y = i.x * m.m[0][1] + i.y * m.m[1][1] + i.z * m.m[2][1] + m.m[3][1];
- o.z = i.x * m.m[0][2] + i.y * m.m[1][2] + i.z * m.m[2][2] + m.m[3][2];
- double w = i.x * m.m[0][3] + i.y * m.m[1][3] + i.z * m.m[2][3] + m.m[3][3];
- if(w != 0) {
- o.x /= w; o.y /= w; o.z/= w;
- }
- return o;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement