2015-10-13 16 views
-1

这可能是一个非常基本的问题。但我很难理解。我正在使用Three.js创建一个场景。该相机是如下基于相机在三个js的坐标

var camera = new THREE.PerspectiveCamera(85, window.innerWidth/window.innerHeight, 0.1, 1000); camera.position.z = 5;

任何人都可以请解释什么是基于这些值x和y的范围。 我发现-8> = x> = 8和-4> = Y> = 4。但如何计算这些值?我正在努力获得基础知识。如果你也可以指出一些好的文章,那会很棒。

在此先感谢。

+0

在你的问题中x和y是什么? – Atrahasis

+0

X,Y是场景的坐标。由于我创建了2D场景,所以z保持不变。我发现如果objects.position.x = -8将对象留下。而objects.position.y将它引向右侧。 – user2580925

回答

2

我想问你问的问题是什么是世界空间中x,y坐标的范围,它仍然可以被透视摄像机看到。

在此之前,您必须首先了解现代3D渲染管道在底层做什么。从本质上讲,你可以把它看作是一组矩阵变换,它首先将对象变换到世界空间,然后从世界空间变换到屏幕空间。

其中一个关键因素是将世界空间坐标[x,y,z]转换为“几乎”屏幕空间[x,y,z,w]然后x,y,z为视图投影矩阵除以w得到[x/w,y/w,z/w]。合成坐标系的x = -1作为屏幕的左侧,x = +1作为屏幕的右侧,y = -1作为屏幕的底部,y = +1作为屏幕的顶部。你可能会猜到,透视摄像机负责为你计算该视图投影矩阵(可能,我不使用Three.JS)。矩阵的另一个不错的属性是,你可以找到它的逆。也就是说,视角 - 投影矩阵的逆矩阵占用了“几乎”的屏幕空间并将其转换回世界空间。所以,要回答这个问题,你可以在屏幕的左下方插入[-1,-1,z],并将其转换为视图 - 投影矩阵的逆矩阵,并进行/ w分割,这会给你x,y的世界坐标将使对象出现在屏幕的左下角。

在伪代码,它看起来是这样的:一些试验和错误我发现three.js所实际发生Objects.position.X作为世界坐标后好

vec3.toWorldSpace = function(out, v3, viewProjectionMatrix){ 
    var invViewProj = mat4.inverse(vec3._m, viewProjectionMatrix); 
    var m = invViewProj; 
    vec3.transformByMat(out, v3, m); 
    var w = m[3] * x + m[7] * y + m[11] * z + m[15]; // required for perspective divide 
    if (w !== 0){ 
     var invW = 1.0/w; 
     out[0] *= invW; 
     out[1] *= invW; 
     out[2] *= invW; 
    } 

    return out; 
}; 
+0

感谢WaclawJasper的解释。我知道坐标在[-1,-1,z]到[1,1,z]之间变化,但我试图理解这是如何受到相机设置的影响的。 – user2580925

0

XP的= X /(AR ž黄褐色(角度/ 2))

YP = Y /(Z * TAN(角度/ 2))

所有three.js所大师,请更正我如果我错了。