Java使用3d投影绘制3d指向2d系统

时间:2017-10-14 22:40:54

标签: java swing 3d 2d projection

我试图按照3D投影上的维基百科页面使用java和AWT和Swing绘制我自己的3d线。 由于呈现而创建的输出文件不包含任何内容。 我做错了什么? 为什么这不会产生一个有点数的图像文件? 我的公式关闭了吗? 我正在关注这个维基百科页面作为我的参考:https://en.wikipedia.org/wiki/3D_projection#Perspective_projection

我有一组使用循环生成的点。 然后我在不使用矩阵的情况下计算3d坐标到2d的位置,就像链接中建议的方法之一一样。

我是否错过了解释某些内容或未实现的内容? 欢迎任何帮助和反馈。

我知道窗户没有任何东西。目前这不是一个优先事项。优先考虑让算法发挥作用。

public class Window {
JFrame f = new JFrame();

public Window() {
    JPanel p = new JPanel();
    render();
    f.add(p);
    f.setSize(500, 500);
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
    Window w = new Window();
}

void render() {
    BufferedImage image = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);
    Graphics g = image.getGraphics();
    g.setColor(Color.red);
    for (int i = 0; i < 10; i++) {
        Vector3 point = new Vector3(1 + i, 2, 1 + i);
        int x = calculateBX(point, new Vector3(0, 0, 0));
        int y = calculateBY(point, new Vector3(1, 1, 1));
        g.drawLine(x, y, x, y);
    }

    try {
        File outputfile = new File("saved.png");
        ImageIO.write(image, "png", outputfile);
    } catch (IOException e) {
        e.printStackTrace();
    }

}

double calculatDX(Vector3 v, Vector3 camera) {
    double cx = Math.cos(0);
    double cy = Math.cos(0);
    double cz = Math.cos(0);

    double sx = Math.sin(0);
    double sy = Math.sin(0);
    double sz = Math.sin(0);

    int x = v.getX() - camera.getX();
    int y = v.getY() - camera.getY();
    int z = v.getZ() - camera.getZ();

    double dx = cy * ((sz) * (y) + (cz) * (x)) - (sy) * (z);
    return dx;
}

double calculatDY(Vector3 v, Vector3 camera) {
    double cx = Math.cos(0);
    double cy = Math.cos(0);
    double cz = Math.cos(0);

    double sx = Math.sin(0);
    double sy = Math.sin(0);
    double sz = Math.sin(0);

    int x = v.getX() - camera.getX();
    int y = v.getY() - camera.getY();
    int z = v.getZ() - camera.getZ();

    double dy = sx * ((cy) * (z) + (sy) * ((sz) * (y) + (cz) * (x))) + (cx) * (cz * (y) - sz * x);
    return dy;
}

double calculatDZ(Vector3 v, Vector3 camera) {
    double cx = Math.cos(0);
    double cy = Math.cos(0);
    double cz = Math.cos(0);

    double sx = Math.sin(0);
    double sy = Math.sin(0);
    double sz = Math.sin(0);

    int x = v.getX() - camera.getX();
    int y = v.getY() - camera.getY();
    int z = v.getZ() - camera.getZ();

    double dz = cx * ((cy) * (z) + (sy) * ((sz) * (y) + (cz) * (x))) - (sx) * (cz * (y) - sz * x);
    return dz;
}

int calculateBX(Vector3 v, Vector3 camera) {
    int ez = camera.getZ();
    int ex = camera.getX();
    double dz = calculatDZ(v, camera);
    double dx = calculatDX(v, camera);

    return (int) ((ez / dz) * dx) - ex;
}

int calculateBY(Vector3 v, Vector3 camera) {
    int ez = camera.getZ();
    int ey = camera.getY();
    double dz = calculatDZ(v, camera);
    double dy = calculatDY(v, camera);

    return (int) ((ez / dz) * dy) - ey;
}
}

矢量类

public class Vector3 {
private int x, y, z;

public Vector3(int x, int y, int z) {
    this.x = x;
    this.y = y;
    this.z = z;
}

public int getX() {
    return x;
}

public int getY() {
    return y;
}

public int getZ() {
    return z;
}
}

0 个答案:

没有答案