3D проекция разрывается при отрицательном расстоянии от вершиныJAVA

Программисты JAVA общаются здесь
Anonymous
3D проекция разрывается при отрицательном расстоянии от вершины

Сообщение Anonymous »

У меня есть формулы, которые я вызвал для рисования краев простых треугольников и/или квадратов с вращением и изменением положения камеры. Тем не менее, я заметил, что после прохождения вершины, она полностью разбивает и меняет свою позицию (похоже, она отражается в стороне?), Я предполагаю, что это благодаря негативному расстоянию, когда она находится за камерой. Хотя я игнорирую треугольники, которые полностью находятся за камерой, я должен найти положение вершин за камерой, чтобы я мог рисовать ребра, и именно тогда проблемы начинаются.

Код: Выделить всё

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];
и многие другие подобные подходы, однако, я не могу понять это для жизни меня. Я даже пытался ограничить TransformedCoords [2] < /code> до 0,0001, чтобы это никогда не стало негативным, однако я чувствую, что перспектива выглядит фальшивой после этого, или я мог бы просто сходить с ума после многих неудачных попыток. < /P>
Изображение треугольников от 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

Вернуться в «JAVA»