在正交相机的场景中,如何将2D屏幕位置(例如鼠标位置)转换为3D世界位置?我发现的所有解决方案都使用raycaster。但是我需要不使用的raycaster,因为在该位置上可能没有要拾取的物体。
以下示例适用于透视相机(对于正交相机,我需要类似的解决方案):
function from2Dto3D( canvas, camera, screenX, screenY )
{
// canvas: canvas object
// camera: camara object
// screenX, screenY: the 2d screen position
// normalize the 2D position:
var vector = new THREE.Vector3();
vector.set(
( screenX / canvas.width ) * 2 - 1,
- ( screenY / canvas.height ) * 2 + 1,
0.5
);
vector.unproject( camera );
// 3D y position is 0:
var groundY = 0;
var dir = vector.sub( camera.position ).normalize();
var distance = (groundY - camera.position.y) / dir.y;
var vec3 = camera.position.clone().add( dir.multiplyScalar( distance ) );
// return: a vector3 with the 3d position:
return vec3;
}