当THREE.Points只有1个顶点或排列有顶点时,Three.js raycaster.intersectObject不相交

时间:2015-11-30 22:28:28

标签: javascript three.js

我花了几个小时来理解这个问题。出于某种莫名其妙的原因(对我来说)raycaster.intersectObject( pointCloud );不要与我的“点云”相交。当对象只有一个顶点时(具有三个元素的相应位置数组属性)。如果对象只有两个或多个顶点,则raycaster.intersectObject可以正常工作。

我的几何图形为THREE.BufferGeometry(),我使用自定义ShaderMaterial。 我的对象是THREE.Points

this.pointCloud = new THREE.Points( geometry, material0 );

有什么想法吗?

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓我的问题的新版本↓↓↓↓↓↓↓↓↓↓↓↓↓↓

好吧,我认为这里的问题是,当我有一个THREE.Point时,缓冲几何只有一个顶点(非常特殊和奇怪的东西,但在我的情况下可能),计算{{1 } boundingBoxmin,是:

max

问题不仅在于一个顶点,一组顶点排列在同一条线上(不太奇怪),几何体的boundingBox的最小值和最大值绘制一条线。我的意思是,例如,相同的X pos,Y pos,但不同的Z pos,

boundingBox: 
  max: 
     THREE.Vector3  x: 50  y: 50  z: -50
  min: 
    THREE.Vector3  x: 50  y: 50  z: -50

所以,我认为这就是为什么在这两种情况下,光线投射交叉都不起作用。

更多详情:

在最后一种情况下,例如,跟随boundingBox: max: THREE.Vector3 x: -100 y: 0 z: 133 min: THREE.Vector3 x: -100 y: 0 z: -33

的主题
raycast.intersection

这里,在这个intersectBox函数中:

//in my file.js
intersections = raycaster.intersectObject( pc.pointCloud , true);  
//line 7734 three.js
intersectObject( object, this, intersects, recursive ); 
//line 7678 three.js 
object.raycast( raycaster, intersects ); 
//line 16542 three.js
if ( ray.isIntersectionBox( geometry.boundingBox ) === false ) {... 
//line 6152 three.js
intersectBox: function ( box, optionalTarget ) {...

...评估为真,因此返回 null 并且无法实现交叉。我假设问题在于它评估boundedBox的 x y 位置是否相同,这就是为什么//line 6188 three.js if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null; 或{{{{}} 1}}给出( tmin > tymax)。但是,如果我改变粒子的位置,分享 x z ,并将 y 作为不同的粒子,则结果相同,不相交。

也许有了这些新信息,有人可以帮助我为此设置一个好的解决方案。

...编辑这个three.js函数?,或者在我的几何体中做一个技巧来给出一个有效的boundedBox?....

再次感谢!

Three.js 72

1 个答案:

答案 0 :(得分:0)

@WestLangley在GitHub给了我答案。

他说:
“你的边界框没有音量。试试这个并报告回来:

 pointCloud.geometry.boundingBox = null;

我尝试过它开箱即用!检测工作比以前更好。

@Beiller在评论中指出了一些内容,我认为这一点非常重要。

我打电话给

this.geometry.computeBoundingBox();

...对于我的几何体,但这些点不是体积,因此未检测到单点或对齐(在三个轴中的一个:x,y或z)点。改为使用:

this.geometry.computeBoundingSphere() 

也解决了这个问题。