3D-Grafik 3D Grafik selber bauen

NicoHatProbleme2

Bekanntes Mitglied
Ich habe letztens versucht, selber eine 3D-Rendering Klasse zu programmieren (Habe mich nicht unglaublich tief mit beschäftigt).
Doch jetzt ist die Pyramide oft so komisch gedreht, wenn ich die Focal Length nicht unglaublich hoch habe. Wie könnte man das ändern?

Java:
public class Matrix {
    //[row][column]
    public double[][] numbers;
    public Matrix(double[][] numbers) {
        this.numbers = numbers;
    }
    public Matrix multiply(Matrix other) {
        if(other.numbers.length != this.numbers[0].length) return null;
        Matrix newMatrix = new Matrix(new double[this.numbers[0].length][other.numbers.length]);
        for(int row = 0; row < this.numbers.length; row++) {
            for(int column = 0; column < this.numbers[row].length; column++) {
                for(int otherColumn = 0; otherColumn < other.numbers[0].length; otherColumn++) {
                    newMatrix.numbers[row][otherColumn]
                            += this.numbers[row][column] * other.numbers[column][otherColumn];
                }
            }
        }
        return newMatrix;
    }

}


Code:
import Tools.Math.Matrix;

public class Vertex {
    public Matrix absolutePosition = new Matrix(new double[1][3]);
    public Matrix position = new Matrix(new double[1][3]);
    public Matrix middle = new Matrix(new double[1][3]);
    private Matrix rotation = new Matrix(new double[1][3]);
    public Vertex(double x, double y, double z, double mx, double my, double mz) {
        position.numbers[0][0] = x;
        position.numbers[0][1] = y;
        position.numbers[0][2] = z;
        middle.numbers[0][0] = mx;
        middle.numbers[0][1] = my;
        middle.numbers[0][2] = mz;
        absolutePosition.numbers[0][0] = x;
        absolutePosition.numbers[0][1] = y;
        absolutePosition.numbers[0][2] = z;
    }
    public void rotate(double xDeg, double yDeg, double zDeg) {
        rotation.numbers[0][0] += xDeg;
        rotation.numbers[0][1] += yDeg;
        rotation.numbers[0][2] += zDeg;
        
        rotateOnXAxis(xDeg);
        rotateOnYAxis(yDeg);
        rotateOnZAxis(zDeg);
        
    }
    public void rotateOnXAxis(double deg) {
        Matrix yAndZ = getRotationOnAxis(position.numbers[0][1], position.numbers[0][2]);
        yAndZ = yAndZ.multiply(getRotationMatrix(deg));
        position.numbers[0][1] = yAndZ.numbers[0][0];
        position.numbers[0][2] = yAndZ.numbers[0][1];
    }
    public void rotateOnYAxis(double deg) {
        Matrix xAndZ = getRotationOnAxis(position.numbers[0][0], position.numbers[0][2]);
        xAndZ = xAndZ.multiply(getRotationMatrix(deg));
        position.numbers[0][0] = xAndZ.numbers[0][0];
        position.numbers[0][2] = xAndZ.numbers[0][1];
    }
    public void rotateOnZAxis(double deg) {
        Matrix xAndY = getRotationOnAxis(position.numbers[0][0], position.numbers[0][1]);
        xAndY = xAndY.multiply(getRotationMatrix(deg));
        position.numbers[0][0] = xAndY.numbers[0][0];
        position.numbers[0][1] = xAndY.numbers[0][1];
    }
    private Matrix getRotationOnAxis(double firstPos, double secondPos) {
        Matrix rotationOnAxisMatrix = new Matrix(new double[1][2]);
        rotationOnAxisMatrix.numbers[0][0] = firstPos;
        rotationOnAxisMatrix.numbers[0][1] = secondPos;
        
        return rotationOnAxisMatrix;
    }
    private Matrix getRotationMatrix(double theta) {
        Matrix rotationMatrix = new Matrix(new double[2][2]);
        rotationMatrix.numbers[0][0] = Math.cos(theta);
        rotationMatrix.numbers[0][1] = -Math.sin(theta);
        rotationMatrix.numbers[1][0] = Math.sin(theta);
        rotationMatrix.numbers[1][1] = Math.cos(theta);
        return rotationMatrix;
    }
    public double getProjectedX(double focalLength) {
        double projectedX = translate(position.numbers[0][0] + middle.numbers[0][0], focalLength);
        System.out.println("x:" + projectedX);
        return projectedX;
    }
    public double getProjectedY(double focalLength) {
        double projectedY = translate(position.numbers[0][1] + middle.numbers[0][1], focalLength);
        
        return projectedY;
    }
    private double translate(double xOrY, double focalLength) {
        return (focalLength*xOrY)/(focalLength+position.numbers[0][2] + middle.numbers[0][2]);
    }

}


Code:
public class Edge {
    Vertex one, two;
    public Edge(Vertex one, Vertex two) {
        this.one = one;
        this.two = two;
    }

}


Code:
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.List;

public class Wireframe {
    List<Vertex> vertexes;
    List<Edge> edges;
    private Matrix pos;
    public Wireframe() {
        this(0, 0, 0);
    }
    public Wireframe(double x, double y, double z) {
         vertexes = new ArrayList<>();
         edges = new ArrayList<>();
         pos = new Matrix(new double[][] {{x, y, z}});
          
    }
    public void setPos(double x, double y, double z) {
        pos.numbers[0][0] = x;
        pos.numbers[0][1] = y;
        pos.numbers[0][2] = z;
        for(Vertex g: vertexes) {
            g.middle.numbers[0][0] = x;
            g.middle.numbers[0][0] = y;
            g.middle.numbers[0][0] = z;
        }
    }
    public void move(double x, double y, double z) {
        pos.numbers[0][0] += x;
        pos.numbers[0][1] += y;
        pos.numbers[0][2] += z;
        for(Vertex g: vertexes) {
            g.middle.numbers[0][0] += x;
            g.middle.numbers[0][1] += y;
            g.middle.numbers[0][2] += z;
        }
    }
    public void add(Edge add) {
        edges.add(add);
        if(!vertexes.contains(add.one))
            vertexes.add(add.one);
        if(!vertexes.contains(add.two))
        vertexes.add(add.two);
    }
    public void draw(Graphics2D g2d, double focalLength) {
        for(Edge g: edges) {
            Line2D line = new Line2D.Double(g.one.getProjectedX(focalLength), g.one.getProjectedY(focalLength),
                    g.two.getProjectedX(focalLength), g.two.getProjectedY(focalLength));
            g2d.draw(line);
        }
    }
    public void turn(double xDeg, double yDeg, double zDeg) {
        for(Vertex g: vertexes) {
            g.rotate(Math.toRadians(xDeg), Math.toRadians(yDeg), Math.toRadians(zDeg));
        }
    }

}
Code:
import java.awt.Color;
import java.awt.Graphics2D;

import Tools.Game.GameWindow;

public class Test extends GameWindow {
    Vertex a, b, c, d, e;
    Edge ab, ac, bd, cd;
    Edge ae, be, ce, de;
    
    Wireframe frame;
    
    public Test(int width, int hight, String name) {
        super(width, hight, name);
        setResizable(true);
        init();
    }

    public static void main(String[] args) {
        Test test = new Test(1000, 700, "test");
        
        Thread mainThread = new Thread(test);
        mainThread.start();
    }

    @Override
    public void update(double dt) {
        frame.move(0, 0, dt*1000);
        frame.turn(0, dt*100, 0);
        draw((Graphics2D) this.getGraphics());
    }

    @Override
    public void init() {
        frame = new Wireframe();
        System.out.println(getWidth());
        //**
        a = new Vertex(-100, -100, 0, 500, 500, 500);
        b = new Vertex(100, -100, 0, 500, 500, 500);
        c = new Vertex(-100, 100, 0, 500, 500, 500);
        d = new Vertex(100, 100, 0, 500, 500, 500);
        e = new Vertex(0, 0, -100, 500, 500, 500);
        //**/
        
        ab = new Edge(a, b);
        ac = new Edge(a, c);
        bd = new Edge(b, d);
        cd = new Edge(c, d);
        
        ae = new Edge(a, e);
        be = new Edge(b, e);
        ce = new Edge(c, e);
        de = new Edge(d, e);
        
        frame.add(ab);
        frame.add(ac);
        frame.add(bd);
        frame.add(cd);
        frame.add(ae);
        frame.add(be);
        frame.add(ce);
        frame.add(de);
        
        frame.turn(90, 0, 0);
        
    }

    @Override
    public void changeScene(int scene) {
        
    }

    @Override
    public void draw(Graphics2D g2d) {
        if(dbi == null) {
            dbi = createImage(getWidth(), getHeight());
            dbg = dbi.getGraphics();
        }
        renderOffScreen((Graphics2D) dbg);
        
        
        g2d.drawImage(dbi, 0, 0, getWidth(), getHeight(), null);
    }

    @Override
    public void renderOffScreen(Graphics2D g2d) {
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, getWidth(), getHeight());
        
        g2d.setColor(Color.BLACK);
        frame.draw(g2d, 100);
    }

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I 2D-Grafik Vektor-Grafik über die Zwischenablage nach Adobe Illustrator transferieren Allgemeine Java-Themen 8
N 3d Grafik Kamera Allgemeine Java-Themen 2
N 3D Grafik erstellt Allgemeine Java-Themen 5
I Wie Vektor-Grafik in die Zwischenablage kopieren? Allgemeine Java-Themen 2
P Probleme mit Grafik (Java) Allgemeine Java-Themen 6
E 2D-Grafik nicht-rechteckige Grafik anzeigen Allgemeine Java-Themen 3
Maxim6394 Grafik zu Mausklick-Koordinate bewegen Allgemeine Java-Themen 18
vladimir Welche API für Grafik und Drag&Drop Allgemeine Java-Themen 3
R Texterkennung - Text aus einem/r Bild/Grafik auslesen Allgemeine Java-Themen 2
N grafik rotieren und zentrieren Allgemeine Java-Themen 4
L Grafik lesen Allgemeine Java-Themen 2
S 3D Grafik Library? Allgemeine Java-Themen 5
hdi Auslesen der Farbwerte einer Grafik-Datei Allgemeine Java-Themen 4
B Grafik erzeugen in java Allgemeine Java-Themen 2
G Messen in einer Grafik Allgemeine Java-Themen 7
W Java verursacht Grafik-Fehler? Allgemeine Java-Themen 3
P Grafik Bibliothek Allgemeine Java-Themen 4
S Konverter Postscript -> Grafik gesucht Allgemeine Java-Themen 2
C Grafik Editor in Java Allgemeine Java-Themen 2
P dxf-Daten aus Grafik erstellen Allgemeine Java-Themen 3
NoahPillich Navigations-App und Wegfindung selber programmieren - Erfahrungen, Ideen, Anregungen Allgemeine Java-Themen 6
volcanos JavaFX-Programme nur in NetBeans selber ausführbar ! command_line: NoClassDefFoundError Allgemeine Java-Themen 39
B hard wrap selber programmieren Allgemeine Java-Themen 9
S Klickbare Stacktraces selber erzeugen..? Allgemeine Java-Themen 9
L Einfache Navigations-App schnell selber Programmieren? Bitte um Ideen und Anregungen. Allgemeine Java-Themen 17
S Java-Task-Management-Tool für Windows und Mac selber programmieren Allgemeine Java-Themen 4
E POI-InputStream selber wählen Allgemeine Java-Themen 2
E selber Klassen kompilieren/ prüfen Allgemeine Java-Themen 5
W sql Query abspeichern selber variabele hilfe...? Allgemeine Java-Themen 16
reibi Eclipse PlugIn selber programmieren Allgemeine Java-Themen 3
T einen SVN- oder QVCS-Client selber programmieren Allgemeine Java-Themen 2
T HashMap#get neues Objekt, selber Inhalt Allgemeine Java-Themen 12
M MP3 Datei selber parsen/werte auslesen Allgemeine Java-Themen 13
X JRE selber hosten - legal? Allgemeine Java-Themen 3
I Listener/Event selber machen. Allgemeine Java-Themen 4
N 2 Interfaces mit Methoden selber Signatur implementieren Allgemeine Java-Themen 5
B Java selber lernen Allgemeine Java-Themen 2
B Sehr großen Graph mit Verbindungen bauen und minimieren? Allgemeine Java-Themen 35
B Millionen bit lange zahl bauen? Allgemeine Java-Themen 7
B Simpler Eventlistener für Tastaturtaste bauen? Allgemeine Java-Themen 13
J Builder Klasse mit Lombok bauen Allgemeine Java-Themen 2
N JSONArray bauen Allgemeine Java-Themen 4
perlenfischer1984 Lombok Builder soll andere Klasse bauen Allgemeine Java-Themen 4
C Windows RCP Application unter Linux bauen lassen Allgemeine Java-Themen 3
R Zählvariable in String bauen Allgemeine Java-Themen 2
B einen color-chooser bauen, ähnliche Farben vermeiden Allgemeine Java-Themen 5
O JSON String bauen aus Liste Allgemeine Java-Themen 2
B k-d Tree in Java bauen Allgemeine Java-Themen 2
M Konstruktoraufruf dynamisch auswerten und SQL bauen Allgemeine Java-Themen 10
B In Anwendung jar file bauen Allgemeine Java-Themen 2
G Messenger bauen Allgemeine Java-Themen 4
M PlugIn für Klasse bauen Allgemeine Java-Themen 6
O grafisches Programm "bauen" Allgemeine Java-Themen 15
T Objekte eindeutig zerlegen und wieder zusammen bauen? Allgemeine Java-Themen 6
P Ansatz?: EncoderWrapper Klasse bauen? Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben