在给定相机的情况下,在xy平面上找到画布的topleft坐标

时间:2013-07-04 22:42:13

标签: three.js

我认为这是获得xyplane的好方法(如果这是错误的或有更好的方法,请告诉我):

    xyplane = new THREE.Plane().setFromCoplanarPoints(
        new THREE.Vector3(0, 0, 0),
        new THREE.Vector3(10, 15, 0),
        new THREE.Vector3(100, -90, 0),
    );

我有一个碰巧在(0, 0, 1000)看着原点的相机。我可以在我的查看端口的左上方找到一个坐标:

    projector = new THREE.Projector();
    topleft = new THREE.Vector3(-1, 1, 0);
    through = projector.unprojectVector(topleft, camera);

through然后是THREE.Vector3 {x: -31.425217496422327, y: 22.169468302342334, z: 900.0000201165681},它完美地位于画布的顶部。但是,我想找到z = 0的等效点。我尝试用光线做到这一点;但是,我失败了。

    ray = new THREE.Ray(camera.position, through);
    point = ray.intersectPlane(xyplane);

point然后是{x: 34.91690754890442, y: -24.632742007573448, z: 0},它甚至都不接近。我误解了一些基本的东西。在我试图解决这个问题时,我会研究Coordinates of intersection between Ray and Plane和其他人。也许有人可以用简单的语言解释。

1 个答案:

答案 0 :(得分:0)

是的,感谢@WestLangley的评论。 through变量不是Ray构造函数的正确第二个参数。我们需要一个方向的单位向量。使用相机位置和through点,我们可以获得方向向量:

    direction = through.sub(camera.position).normalize();

然后其余的按预期工作:

    ray = new THREE.Ray(camera.position, direction);
    p = ray.intersectPlane(xyplane);