Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.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

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
Javascript threeJS,需要一些建议来使用光线投射从点云中选择项目吗_Javascript_Three.js_Raycasting_Point Clouds - Fatal编程技术网

Javascript threeJS,需要一些建议来使用光线投射从点云中选择项目吗

Javascript threeJS,需要一些建议来使用光线投射从点云中选择项目吗,javascript,three.js,raycasting,point-clouds,Javascript,Three.js,Raycasting,Point Clouds,我希望能够从我的点云中选择一个点。为此,我找到了很多例子: 因此,我编写了以下代码: function intersectionCheck(event) { if(pointClouds != null) { event.preventDefault(); var mouse = new THREE.Vector2(); var raycaster = new THREE

我希望能够从我的点云中选择一个点。为此,我找到了很多例子:

因此,我编写了以下代码:

    function intersectionCheck(event)
    {
        if(pointClouds != null)
        {
            event.preventDefault();

            var mouse = new THREE.Vector2();
            var raycaster = new THREE.Raycaster();

            mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
            mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;

            raycaster.setFromCamera( mouse, camera );

            var intersections = raycaster.intersectObjects( pointClouds );
            intersection = ( intersections.length ) > 0 ? intersections[ 0 ] : null;

            if(intersection != null)
            {
                console.log(intersection.point);
                sphere.position.copy( intersection.point );            
            }
        }  
    }
只有当用户单击点云中的实体时,该代码才应该在屏幕上放置一个绿色球体

但这是错误的,即使没有实体,球体也会出现,如下面的屏幕截图所示:

我的实体的大小似乎有问题,因为函数返回了一个位置,即使我远离任何实体

所以我改变了选择位置的方式。我检查了点的距离是否小于sizeOfMyEntities/2

    if(intersection != null)
    {
        for(var i = 0; i < intersections.length; i++)
        {
            var testPoint = intersections[i];

            if(material.size/2 > testPoint.distanceToRay)
            {
                point = intersections[i].point;
                console.log(point);
                sphere.position.copy(point);  
                break;
            }
        }          
    }
if(交叉点!=null)
{
对于(变量i=0;itestPoint.distanceToRay)
{
点=交点[i]。点;
控制台日志(点);
球体位置复制(点);
打破
}
}          
}
现在它工作得很好,但我想理解为什么它以前不工作。为什么在交叉过程中不进行验证

我还想知道我的第二个函数是否正常,或者它是否是一种奇怪的方式来实现我想要的。 有没有更好的方法可以做到这一点


ps:我对所有这些东西都是新手,所以如果我错了,请向我解释:D

查看
Raycaster.params.PointCloud.threshold
并阅读
PointCloud.raycast()
的源代码以了解发生了什么。代码并不理想。也许你可以提出改进建议。谢谢你的建议。我查看了源代码,似乎是因为点云的阈值总是设置为1。当阈值等于size/2时,我的第一段代码几乎可以正常工作。我之所以这么说,几乎是因为当你点击角落时,它能很好地检测到项目,但由于它是一个正方形,所以它的工作距离正方形侧面的中间有点太远。(其行为就像是一个圆)是否有任何理由将阈值始终设置为1?(在Raycaster参数中默认设置为1)。此外,在三个js中直接更改threshold参数更快。我尝试了80万个项目,我必须等待1-2秒才能得到响应,现在几乎是瞬间。你写道:“有什么理由让阈值总是设置为1吗?”--它必须设置为某个值。。。您应该将其重置为所需的值。