【问题标题】:Writing a Raytracer, and perspective viewing system not displaying properly?编写 Raytracer,透视查看系统无法正常显示?
【发布时间】:2015-06-14 20:12:27
【问题描述】:

在我正在编写的光线追踪器中,我刚刚尝试实现一个适当的透视查看系统,但是它似乎有问题,我似乎无法弄清楚发生了什么。

例如,在 (-150.0,0.0,0.0)(0.0,0.0,0.0)(-150.0,0.0,0.0) 具有三个球体、绿色、红色和蓝色的场景strong>(150.0,0.0,0.0) 和一个位于 (0.0,0.0,-600.0) 的相机,指向中心球我得到这个图像:

这似乎是对的。

如果我将相机移动到 (0.0, 600.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;
}


}

如果您想查看更多我的代码,请告诉我。

【问题讨论】:

    标签: java raytracing perspectivecamera


    【解决方案1】:

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

    为了使图像的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 平面上的一个点。

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

    【讨论】:

    • 哎呀,我用的是C++,只要在Vector3D前加上new关键字
    猜你喜欢
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2017-10-13
    • 2015-08-24
    • 2017-10-27
    相关资源
    最近更新 更多