我参考了这篇SO帖子,它解释了如何将一个三维空间中的点转换为显示器上实际像素位置的方法。这是该函数的代码,为方便复制。
function toScreenPosition(obj, camera)
{
var vector = new THREE.Vector3();
var widthHalf = 0.5*renderer.context.canvas.width;
var heightHalf = 0.5*renderer.context.canvas.height;
obj.updateMatrixWorld();
vector.setFromMatrixPosition(obj.matrixWorld);
vector.project(camera);
vector.x = ( vector.x * widthHalf ) + widthHalf;
vector.y = - ( vector.y * heightHalf ) + heightHalf;
return {
x: vector.x,
y: vector.y
};
};
我注意到使用
vector.project(camera)
投影后,vector.z
实际上不是0。对于我的特定设置,vector.z
约为0.8(这并不意味着对于一般问题有多大影响)。那么,我应该如何解释
vector.z
?它实际上代表什么?
x
和y
一样进行转换,而且由于显示器没有深度,这将是一个无用的表示。场景被广泛使用。因此,在这个函数中,vector.z
将是 WebGL 剪辑空间中camera
和obj
之间的“距离”。有关更具体的数学细节,我找到了一个很酷的页面,解释了 WebGL 剪辑空间和投影,链接在这里:https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_model_view_projection - WAFFO