可见区域的位置

时间:2016-09-05 13:07:16

标签: javascript three.js

我有一个带有纹理的球形网格,我定位了一个透视相机以查看里面的内容,因此允许我进行360度视图。

this.camera = new THREE.PerspectiveCamera(this.fov, $(this.element).width() / $(this.element).height(), 0.1, 1000);
this.camera.setLens(this.fov);
this.mesh = new THREE.Mesh( new THREE.SphereGeometry( 500, 80, 50 ), new THREE.MeshBasicMaterial( { map: this.texture } ) );
this.mesh.scale.x = -1;
this.camera.lookAt(new THREE.Vector3(cx, cy, cz));
this.renderer.render( this.scene, this.camera );

我想知道如何计算观察者当前看到的网格中的视图区域和位置,这是一种可见的平面区域。

通过可视区域,我的意思是用户可以在当前状态下看到浏览器中的图像纹理,(0,0)(x,y)(400,500)(width,height)种类,如果用户移动鼠标,我会得到(50,0)(x,y)(400,500)(width,height), 如果用户放大(50,40)(x,y)(300,400)(width,height) .. 对于宽度和高度,我已经看过使用相机fov的公式但是我找不到x,y问题的解决方案。

1 个答案:

答案 0 :(得分:1)

此代码应该可以根据相机外观矢量的x,y,z坐标获取纹理中的u,v坐标:

    var u, v;

    // V coordinate
    if (x == 0 && z == 0)
    {
        if (y > 0)
            v = 1;
        else
            if (y < 0) v = -1;
    }
    else
    {
        v = 0.5 + Math.atan( y / Math.sqrt(x*x + z*z) ) / Math.PI;
    }

    // U coordinate
    if (z == 0)
    {
        if (x < 0)
            u = 0.5;
        if (x > 0)
            u = 0;
    }
    else
    {
        u = 0.25 - Math.atan(x/z) / (2 * Math.PI);
        if (z < 0) u += 0.5;
    }

如果您需要纹理中的精确像素位置,只需将u和v分别乘以纹理的宽度和高度。

请注意,当x和z都等于零时,未定义u。