Java 写入光线跟踪器,透视观察系统显示不正确?

Java 写入光线跟踪器,透视观察系统显示不正确?,java,raytracing,perspectivecamera,Java,Raytracing,Perspectivecamera,在我正在写的一个光线跟踪器中,我刚刚尝试实现一个合适的透视观察系统,但是它似乎出了问题,我似乎不知道发生了什么 例如,一个场景有三个球体,分别为绿色、红色和蓝色,位于(-150.0,0.0,0.0),(0.0,0.0,0.0)和(150.0,0.0,0.0),相机位于(0.0,0.0,-600.0),指向中心球体,我得到以下图像: 这似乎是对的 如果我将相机移动到(0.0600.0,-600.0),仍然指向中心球体,我希望得到类似的图像,因为我没有向左或向右移动。然而,这是呈现的内容: 这对

在我正在写的一个光线跟踪器中,我刚刚尝试实现一个合适的透视观察系统,但是它似乎出了问题,我似乎不知道发生了什么

例如,一个场景有三个球体,分别为绿色、红色和蓝色,位于(-150.0,0.0,0.0)(0.0,0.0,0.0)(150.0,0.0,0.0),相机位于(0.0,0.0,-600.0),指向中心球体,我得到以下图像:

这似乎是对的

如果我将相机移动到(0.0600.0,-600.0),仍然指向中心球体,我希望得到类似的图像,因为我没有向左或向右移动。然而,这是呈现的内容:

这对我来说毫无意义

这是我的透视投影类:

public class PerspectiveProjector extends Projector{

public Point3D camera;
public Point3D sceneLocation;
public double distance;
public Vector3D u, v, w;

public PerspectiveProjector(Point3D camera, Point3D sceneLocation, double FOV){
    this.camera = new Point3D(camera);
    this.sceneLocation = new Point3D(sceneLocation);
    this.distance = RayTracer.world.viewPlane.height/2/Math.tan(Math.toRadians(FOV));   

    uvw();
}

private void uvw() {

    w = camera.subtractVector(sceneLocation);
    w.normalise();

    //prob
    u = new Vector3D(0.00424,1.0,0.00764).cross(w);
    u.normalise();

    v = w.cross(u);
    v.normalise();  
}


public Ray createRay(Point2D point) {

    Ray ray = new Ray(new Point3D(camera), u.multiply(point.x).add(v.multiply(point.y).subtract(w.multiply(distance))));

    ray.direction.normalise();

    return ray;
}


}

如果你想看到我的代码,请告诉我。

我真的不明白你在做什么来获得你的u值,所以下面我将如何解决这个问题

为了使图像的X坐标水平,u向量需要位于XY平面,因此z坐标必须为零。要保持X坐标垂直于摄影机方向(在代码中为w),其点积必须为零。这样的向量必须具有以下坐标:

u=矢量3D(w.y,-w.x,0)或

u=Vector3D(-w.y,w.x,0)

这是因为两个向量的点积在代数上必须为零

(x,y,z)*(y,-x,0)=xy+-yx+0z=xy-xy+0=0;因此,(y,-x,0)必须是xy平面上垂直于(x,y,z)的点


替换一行,告诉我它是否工作< /p>哇塞,我使用C++,在矢量3D之前把代码< >新< /Cord>关键字扔掉。