У меня есть формулы, которые я вызвал для рисования краев простых треугольников и/или квадратов с вращением и изменением положения камеры. Тем не менее, я заметил, что после прохождения вершины, она полностью разбивает и меняет свою позицию (похоже, она отражается в стороне?), Я предполагаю, что это благодаря негативному расстоянию, когда она находится за камерой. Хотя я игнорирую треугольники, которые полностью находятся за камерой, я должен найти положение вершин за камерой, чтобы я мог нарисовать края, и именно тогда проблемы начинаются.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(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]);
//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;
//y is unchanged as the rotation is only side to side for now
}
}
< /code>
Код для класса сцены: < /p>
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 playerClass player;
public playerCamera cam;
public double playerX=0;
public double playerZ=0;
public double playerY=0;
public int sizer3D = 30;
public vertex3D[] tri = {new vertex3D(5,0,-5),new vertex3D(-5,0,5),new vertex3D(5,0,5)};
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;
this.player=gp.player;
meshes.add(tri);
meshesAmount=meshes.size();
cam=new playerCamera(player.kL,player.mL,0,2,0,fov, rotation,player);
}
public void update(){
cam.update();
}
public int scrW=1920;
public int scrH=1080;
public void draw(Graphics2D g2d) throws InterruptedException {
for (int i=0;i
Я пробовал много вещей, например, < /p>
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];
< /code>
и многие другие подобные подходы, однако, я не могу понять это для жизни меня. Я даже пытался ограничить трансформированные коорды [2] до 0,0001, чтобы это никогда не стало негативным, однако я чувствую, что перспектива выглядит фальшивой после этого, или я мог бы просто сходить с ума после многих неудачных попыток.
Подробнее здесь: https://stackoverflow.com/questions/797 ... rom-vertex