Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Three.js Raycaster与具有负近平面的正交摄影机一起使用?_Three.js_Raycasting_Orthographic - Fatal编程技术网

如何将Three.js Raycaster与具有负近平面的正交摄影机一起使用?

如何将Three.js Raycaster与具有负近平面的正交摄影机一起使用?,three.js,raycasting,orthographic,Three.js,Raycasting,Orthographic,我正在three.js中开发一个应用程序,其中有一个正交摄影机,初始化如下: const orthographicCamera = new THREE.OrthographicCamera( -1, 1, -1, 1, -1000, 1000) 这是近平面参数(-1000)的非常规用法,表示必须将其设置为大于等于0的值。将“近平面”(near plane)参数设置为-1000允许我在不剪裁对象的情况下渲染场景中z坐标>=0的对象,但它似乎也破坏了threejs光线投射器,因为z坐标>=0的网格

我正在three.js中开发一个应用程序,其中有一个正交摄影机,初始化如下:

const orthographicCamera = new THREE.OrthographicCamera( -1, 1, -1, 1, -1000, 1000)
这是近平面参数(-1000)的非常规用法,表示必须将其设置为大于等于0的值。将“近平面”(near plane)参数设置为-1000允许我在不剪裁对象的情况下渲染场景中z坐标>=0的对象,但它似乎也破坏了threejs光线投射器,因为z坐标>=0的网格上的三角形永远不会与光线投射器相交,即使它们已渲染

我一直在检查,看看它是如何处理正交相机(尤其是近平面)

我的主要问题是,是否可以在负空间中设置近平面,但仍然有一个功能性的光线投射器,可以与z坐标>=0的网格三角形相交

为了回答这个问题,我还想知道是否有人能解释一下正交相机的光线投射器背后的数学原理? 特别是设置光线原点z位置的零件。它使用此表达式设置光线原点z位置的摄影机:

( camera.near + camera.far ) / ( camera.near - camera.far )
有人能解释一下这个表达式的作用吗

我希望任何人都能分享这方面的见解。谢谢。

请参见(1)内联注释和(2)。这个答案帮助了我:这里有一个简短的代码:var vector=new THREE.Vector3();var raycaster=new THREE.raycaster();var dir=new THREE.Vector3();vector.set((event.clientX/window.innerWidth)*2-1,-(event.clientY/window.innerHeight)*2+1,-1);//z=-1重要!矢量。取消投影(摄像机);方向集(0,0,-1).transformDirection(camera.matrixWorld);raycaster.set(向量,dir);var intersects=raycaster.intersectObjects(objects,recursiveFlag)`请参阅(1)内联注释和(2)。这个答案帮助了我:这里有一个简短的代码:var vector=new THREE.Vector3();var raycaster=new THREE.raycaster();var dir=new THREE.Vector3();vector.set((event.clientX/window.innerWidth)*2-1,-(event.clientY/window.innerHeight)*2+1,-1);//z=-1重要!矢量。取消投影(摄像机);方向集(0,0,-1).transformDirection(camera.matrixWorld);raycaster.set(向量,dir);var intersects=raycaster.intersectObjects(objects,recursiveFlag)`