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.setSize(1920,1080);
gamePanel.startThread();
f.setVisible(true);
}
}
< /code>
код для геймпанели.package def_pack;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.io.IOException;
import javax.swing.JPanel;
public class GamePanel extends JPanel implements Runnable{
public Thread thr;
public scene s;
GamePanel() throws IOException{
s = new scene();
}
@Override
public void run() {

while (true) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {e.printStackTrace();}
try {
update();
repaint();
} catch (IOException e) {e.printStackTrace();}
}
}

public void update() throws IOException {
s.update();
}
public void paintComponent(Graphics g) {
Graphics2D g2d= (Graphics2D)g;
g2d.clearRect(0, 0, 1920, 1080);
try {
s.draw(g2d);
} catch (InterruptedException e) {e.printStackTrace();}
}
public void startThread() {
thr = new Thread(this);
thr.start();
}
}
< /code>
код для класса Vertex3d: < /p>
package def_pack;
public class vertex3D {
public double x,y,z;
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(double camX, double camY, double camZ) {
// get relative coordinates
this.transformedCoords[0]=this.x-camX;
this.transformedCoords[1]=this.y-camY;
this.transformedCoords[2]=this.z-camZ;
}
}
< /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 double camX=0;
public double camY=0;
public double camZ=0;
public vertex3D[] testQuad = {new vertex3D(-3,-2,2),new vertex3D(-3,-2,4),new vertex3D(-3,3,4),new vertex3D(-3,3,2)};
public int meshesAmount;
public ArrayList meshes = new ArrayList();
public Rectangle screen = new Rectangle(0,0,1920,1080);
public int scrW=1920;
public int scrH=1080;
public int sizer=300;
scene() throws IOException {
meshes.add(testQuad);
meshesAmount=meshes.size();
}
public void update(){
camZ+=0.001;
for (int i=0;i
newX*=-1;
newY*=-1;
< /code>
или < /p>
meshes.get(i)[j].transformedCoords[2]=-meshes.get(i)[j].transformedCoords[2];
и многие другие подобные подходы, однако, я не могу понять это для жизни меня. Я даже пытался ограничить TransformedCoords [2] до 0,0001, чтобы это никогда не стало негативным, однако я чувствую, что перспектива выглядит фальшивой после этого, или я мог бы просто сходить с ума после многих неудачных попыток.
Изображение Quad от начала Quad, -> Ближай дистанцию 0 для ближайшего к Quad Quad Quad.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... tex-vertex

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