threeJS,需要一些建议从带有光线投射的pointcloud中挑选一个项目

时间:2015-05-21 15:40:02

标签: javascript three.js raycasting point-clouds

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

Interactive particles example

Interactive raycasting pointcloud example

所以我写了下面的代码:

    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 );            
            }
        }  
    }

只有当用户从pointcloud点击实体时,该代码才会在屏幕上放置绿色球体。

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

我的实体的大小似乎存在问题,因为即使我离任何实体很远,该函数也会给我一个位置。

所以我改变了选择位置的方式。我检查了该点的distanceToRay是否小于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;
            }
        }          
    }

现在它工作正常,但我想了解为什么以前没有工作。为什么在交叉过程中没有进行验证?

而且我想知道我的第二个功能是否正常,或者这是一种奇怪的方式来做我想做的事情。 还有更好的方法吗?

ps:我是新朋友,所以如果我错了请解释我:D

0 个答案:

没有答案