编写Raytracer,透视查看系统无法正常显示?

时间:2015-04-09 12:45:33

标签: 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),指向中心球体我得到这个图像:

enter image description here

这似乎是正确的。

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

enter image description here 这对我没有任何意义。

这是我的观点porjector类:

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;
}


}

如果您想再查看我的代码,请告诉我们。

1 个答案:

答案 0 :(得分:0)

我真的不明白你在做什么来获得你的价值,所以这就是我如何解决这个问题。

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

u = Vector3D(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)必须是垂直于(x,y,z)的xy平面上的一个点。

替换那一行并告诉我它是否有效