如何使简单的 3D 对象在数学上看起来正确?

问题描述 投票:0回答:0

我想尝试绘制 3D 对象,例如立方体等,并且效果很好。问题是,右侧和左侧的立方体在大小和外观上都不同,尽管它们看起来应该是一样的。第二个问题是,当我在 camera 后面绘制时,立方体不断出现故障。 代码:

import javax.swing.JFrame;
public class GameFrame extends JFrame{
  public GameFrame(){
    this.add(new GamePanel());
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
    this.setResizable(false);
    this.pack();
    this.setLocationRelativeTo(null);
    }
  public static void main(String[] args) {
  new GameFrame();  
  } // end of main
} // end of class GameFrame



public class DimensionPoint {
  int x,y,z = 0;
  public DimensionPoint(int x, int y, int z){
    this.x = x;
    this.y = y;
    this.z = z;
    }
  public int getXprojected(int length){
    return length == -z ? x*length/(length+z+1) : x*length/(length+z);       //Temporary, because you can't divide by zero
    }
  public int getYprojected(int length){
    return length == -z ? x*length/(length+z+1): y*length/(length+z);
    }
  public int getZ(){
    return z;
    }
} // end of class Point



import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class GamePanel extends JPanel implements ActionListener{
  static final int width = 800;
  static final int height = 800;                                                                                                                     
  DimensionPoint[] cube = new DimensionPoint[8];
  int pos = 75;
  public GamePanel(){
    this.setPreferredSize(new Dimension(width,height));
    this.setBackground(Color.gray);
    this.setFocusable(true);
    setCube(100,400,10,200,cube);
    }
  
  public void paintComponent(Graphics g){
    super.paintComponent(g);
    draw(g);
    }
  public void draw(Graphics g){
      g.setColor(Color.black);
      if (cube[5].getZ() > -pos+9) { // This is also only temporary. When you change the size of the cube, it sometimes still glitches out, or dissapears before leaving the screen
        drawCube(g,cube);
        }
    }
  public void setCube(int anfangX, int anfangY, int anfangZ,int size, DimensionPoint[] p){
    p[0] = new DimensionPoint(anfangX,anfangY-size,anfangZ);
    p[1] = new DimensionPoint(anfangX,anfangY,anfangZ);
    p[2] = new DimensionPoint(anfangX+size,anfangY-size,anfangZ);                                
    p[3] = new DimensionPoint(anfangX+size,anfangY,anfangZ);                                   
    p[4] = new DimensionPoint(anfangX,anfangY-size,anfangZ+size/10);
    p[5] = new DimensionPoint(anfangX,anfangY,anfangZ+size/10);
    p[6] = new DimensionPoint(anfangX+size,anfangY-size,anfangZ+size/10);
    p[7] = new DimensionPoint(anfangX+size,anfangY,anfangZ+size/10);
    }
  public void drawCube(Graphics g,DimensionPoint[] p){
      g.drawLine(p[0].getXprojected(pos),p[0].getYprojected(pos),p[1].getXprojected(pos),p[1].getYprojected(pos));
      g.drawLine(p[0].getXprojected(pos),p[0].getYprojected(pos),p[2].getXprojected(pos),p[2].getYprojected(pos));
      g.drawLine(p[0].getXprojected(pos),p[0].getYprojected(pos),p[4].getXprojected(pos),p[4].getYprojected(pos));
      g.drawLine(p[1].getXprojected(pos),p[1].getYprojected(pos),p[3].getXprojected(pos),p[3].getYprojected(pos));
      g.drawLine(p[1].getXprojected(pos),p[1].getYprojected(pos),p[5].getXprojected(pos),p[5].getYprojected(pos));
      g.drawLine(p[2].getXprojected(pos),p[2].getYprojected(pos),p[6].getXprojected(pos),p[6].getYprojected(pos));
      g.drawLine(p[2].getXprojected(pos),p[2].getYprojected(pos),p[3].getXprojected(pos),p[3].getYprojected(pos));
      g.drawLine(p[3].getXprojected(pos),p[3].getYprojected(pos),p[7].getXprojected(pos),p[7].getYprojected(pos));
      g.drawLine(p[4].getXprojected(pos),p[4].getYprojected(pos),p[5].getXprojected(pos),p[5].getYprojected(pos));
      g.drawLine(p[4].getXprojected(pos),p[4].getYprojected(pos),p[6].getXprojected(pos),p[6].getYprojected(pos));
      g.drawLine(p[7].getXprojected(pos),p[7].getYprojected(pos),p[6].getXprojected(pos),p[6].getYprojected(pos));
      g.drawLine(p[7].getXprojected(pos),p[7].getYprojected(pos),p[5].getXprojected(pos),p[5].getYprojected(pos));
    }
  @Override
  public void actionPerformed(ActionEvent e){ }
} // end of class GamePanel

我尽量减少了代码,希望能找到错误。谢谢你的建议。

java 3d
© www.soinside.com 2019 - 2024. All rights reserved.