我希望能够从我的pointCloud中选择一个点。为此,我找到了很多例子:
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