我想问你问的问题是什么是世界空间中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;
};
在你的问题中x和y是什么? – Atrahasis
X,Y是场景的坐标。由于我创建了2D场景,所以z保持不变。我发现如果objects.position.x = -8将对象留下。而objects.position.y将它引向右侧。 – user2580925