我有一个带有纹理的球形网格,我定位了一个透视相机以查看里面的内容,因此允许我进行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问题的解决方案。
答案 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。