我花了几个小时来理解这个问题。出于某种莫名其妙的原因(对我来说)raycaster.intersectObject( pointCloud );
不要与我的“点云”相交。当对象只有一个顶点时(具有三个元素的相应位置数组属性)。如果对象只有两个或多个顶点,则raycaster.intersectObject
可以正常工作。
我的几何图形为THREE.BufferGeometry()
,我使用自定义ShaderMaterial
。
我的对象是THREE.Points
。
this.pointCloud = new THREE.Points( geometry, material0 );
有什么想法吗?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓我的问题的新版本↓↓↓↓↓↓↓↓↓↓↓↓↓↓
好吧,我认为这里的问题是,当我有一个THREE.Point
时,缓冲几何只有一个顶点(非常特殊和奇怪的东西,但在我的情况下可能),计算{{1 } boundingBox
和min
,是:
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
答案 0 :(得分:0)
@WestLangley在GitHub给了我答案。
他说: pointCloud.geometry.boundingBox = null;
“
我尝试过它开箱即用!检测工作比以前更好。
@Beiller在评论中指出了一些内容,我认为这一点非常重要。
我打电话给
this.geometry.computeBoundingBox();
...对于我的几何体,但这些点不是体积,因此未检测到单点或对齐(在三个轴中的一个:x,y或z)点。改为使用:
this.geometry.computeBoundingSphere()
也解决了这个问题。