我想尝试绘制 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
我尽量减少了代码,希望能找到错误。谢谢你的建议。