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吗?”--它必须设置为某个值。。。您应该将其重置为所需的值。