Код: Выделить всё
package def_pack;
import java.io.IOException;
import javax.swing.JFrame;
public class Main {
public static void main(String[] args) throws IOException {
JFrame f = new JFrame("3D Test");
f.setSize(1920, 1080);
f.setResizable(false);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GamePanel gamePanel = new GamePanel();
f.add(gamePanel);
gamePanel.startGameThread();
gamePanel.setSize(1920,1080);
f.setVisible(true);
}
}
< /code>
код для геймпанели.package def_pack;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.io.IOException;
import javax.swing.JPanel;
public class GamePanel extends JPanel implements Runnable{
scene scene;
public mouselisten mL;
public keylisten kL;
@Override
public void run() {
this.setBackground(Color.white);
this.setFocusable(true);
this.requestFocus();
this.requestFocusInWindow();
kL = new keylisten();
mL = new mouselisten();
this.addMouseMotionListener(mL);
this.addKeyListener(kL);
try {
scene = new scene(this);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
int fps = 60;
double drawInterval = 1000000000/fps;
double delta = 0;
long lastTime = System.nanoTime();
while (true) {
long currentTime = System.nanoTime();
delta += (currentTime - lastTime) / drawInterval;
lastTime = currentTime;
if (delta >= 1) {
try {
update();
} catch (IOException e) {
e.printStackTrace();
}
repaint();
delta-= 1;
}
}
}
GamePanel(){
}
Thread gameThread;
public void startGameThread() throws IOException {
gameThread = new Thread(this);
gameThread.start();
}
public void update() throws IOException {
scene.update();
}
public void paintComponent(Graphics g) {
Graphics2D g2d= (Graphics2D)g;
g2d.clearRect(0, 0, 1920, 1080);
super.paintComponent(g);
try {
scene.draw(g2d);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
< /code>
код для класса KeyListen: < /p>
package def_pack;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class keylisten implements KeyListener{
public boolean[] keysHeld = {false,false,false,false};
keylisten(){
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode()==87) {
keysHeld[0]=true;
}
if (e.getKeyCode()==65) {
keysHeld[1]=true;
}
if (e.getKeyCode()==83) {
keysHeld[2]=true;
}
if (e.getKeyCode()==68) {
keysHeld[3]=true;
}
//w, a, s, d
}
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode()==87) {
keysHeld[0]=false;
}
if (e.getKeyCode()==65) {
keysHeld[1]=false;
}
if (e.getKeyCode()==83) {
keysHeld[2]=false;
}
if (e.getKeyCode()==68) {
keysHeld[3]=false;
}
}
}
< / Code>
код для класса Moruselist: < / p>
package def_pack;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
public class mouselisten implements MouseMotionListener{
public int mX;
public int mY;
@Override
public void mouseDragged(MouseEvent e) {
this.mX=e.getX();
this.mY=e.getY();
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
this.mX=e.getX();
this.mY=e.getY();
}
mouselisten(){
this.mX=0;
this.mY=0;
}
}
< /code>
код для класса Vertex3d: < /p>
package def_pack;
public class vertex3D {
public double x,y,z,d3D;
public double[] transformedCoords= {0,0,0};
vertex3D(double x, double y, double z){
this.x=x;
this.y=-y;
this.z=z;
}
public void update(playerCamera player) {
//find relative coordinates
this.transformedCoords[0]=(this.x-player.x);
this.transformedCoords[1]=(this.y-player.y);
this.transformedCoords[2]=this.z-player.z;
//find hypotenuse/distance
double r=Math.sqrt(this.transformedCoords[0]*this.transformedCoords[0]+this.transformedCoords[2]*this.transformedCoords[2]);
d3D = Math.sqrt(this.transformedCoords[0]*this.transformedCoords[0]+this.transformedCoords[2]*this.transformedCoords[2]+this.transformedCoords[1]*this.transformedCoords[1]);
//add camera rotation and rotation from origin to vertex
double th=(Math.atan2(this.transformedCoords[2],this.transformedCoords[0])+Math.toRadians(player.rotation));
//trigonometry
this.transformedCoords[2]=Math.sin(th)*r;
this.transformedCoords[0]=Math.cos(th)*r;
}
}
< /code>
Код для класса сцены: < /p>
package def_pack;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.Rectangle;
import java.awt.geom.Area;
import java.io.IOException;
import java.util.ArrayList;
public class scene {
public GamePanel gp;
public playerCamera cam;
public double playerX=0;
public double playerZ=0;
public double playerY=0;
public vertex3D[] tri1 = {new vertex3D(4,4,8),new vertex3D(8,0,8),new vertex3D(4,0,8)};
public vertex3D[] tri2 = {new vertex3D(8,0,8),new vertex3D(4,4,8),new vertex3D(8,4,8)};
public vertex3D[] testQuad = {new vertex3D(0,0,8),new vertex3D(4,0,8),new vertex3D(4,4,8),new vertex3D(0,4,8)};
public int meshesAmount;
public ArrayList meshes = new ArrayList();
public Rectangle screen = new Rectangle(0,0,1920,1080);
public int fov=300;
public double rotation=0;
scene(GamePanel gp) throws IOException {
this.gp=gp;
meshes.add(tri1);
meshes.add(tri2);
meshes.add(testQuad);
meshesAmount=meshes.size();
cam=new playerCamera(gp.kL,gp.mL,0,2,0,fov, rotation);
}
public void update(){
cam.update();
for (int i=0;i
if (behindCam[j]) {
meshes.get(i)[j].transformedCoords[2]=-1/meshes.get(i)[j].transformedCoords[0];
}
< /code>
или < /p>
newX*=-1;
newY*=-1;
< /code>
или < /p>
meshes.get(i)[j].transformedCoords[2]=-meshes.get(i)[j].transformedCoords[2];
Изображение треугольников от Afar,
afar < /Pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr; Close < /p>
и после одной из вершин позади меня (половина квадрата позади камеры).
половина квадрата позади камеры < /p>
Подробнее здесь: https://stackoverflow.com/questions/797 ... rom-vertex