three.js的可点击点云颗粒

6

我正在使用three.js可视化通过csv文件读取的3D数据点。我想点击PointCloud中的点,以显示这些特定点的其他测量数据。根据我找到的示例,这似乎是可能的,但我无法使其工作。以下是我的代码(基本上来自那些示例):

function onDocumentMouseMove(e) {       
    mouseVector.x = 2 * (e.clientX / containerWidth) - 1;
    mouseVector.y = 1 - 2 * (e.clientY / containerHeight);
    var vector = new THREE.Vector3(mouseVector.x, mouseVector.y, 0.5).unproject(camera);
    raycaster.ray.set(camera.position, vector.sub(camera.position).normalize());
    scene.updateMatrixWorld();
    intersects = raycaster.intersectObject(particles);
    console.log(intersects);
}

但是无论我移动哪个点,交点(intersects)始终为空数组。

关于粒子对象(Particles Object),我写了以下内容:

geometry = new THREE.Geometry();        

for (var i = 0; i < howmany; i++) {
    var vector = new THREE.Vector3(data[i][0], data[i][2], data[i][1] );
    geometry.vertices.push(vector);
}

attributes = {
     size: { type: 'f', value: [] },
     customColor: { type: 'c', value: [] }
};

uniforms = {
    color: { type: "c", value: new THREE.Color( 0xFFFFFF ) },
    texture: { type: "t", value: THREE.ImageUtils.loadTexture( "js/threejs/examples/textures/sprites/disc.png" ) }
};

var shaderMaterial = new THREE.ShaderMaterial( {
    uniforms: uniforms,
    attributes: attributes,
    vertexShader: document.getElementById( 'vertexshader' ).textContent,
    fragmentShader: document.getElementById( 'fragmentshader' ).textContent,
    alphaTest: 0.9,
} );

particles = new THREE.PointCloud( geometry, shaderMaterial );

for (var i = 0; i < howmany; i++) {
    colors[i] = new THREE.Color(RainBowColor(data[i][3], 4));
    sizes[i] = PARTICLE_SIZE * 0.5;
}
scene.add(particles);

在这里,所有的变量都是预先初始化的,PARTICLE_SIZE为20,粒子数量约为10,000个,值介于(0,0,0)和(10000,10000,10000)之间。我使用THREE.OrbitControls来进行旋转和缩放。

有人看到错误了吗?或者在这种情况下无法使用射线投射与粒子交互吗?

非常感谢, Mika。


1
THREE.Raycaster.params.PointCloud.threshold 默认值为1。尝试增加它。在只有2个粒子的小问题上使用调试器逐步调试。 - WestLangley
我刚刚尝试了raycaster.params.PointCloud.threshold = 20;,然后...它奏效了。无论如何,我还需要调整点的大小。所以,起初,知道这个阈值的重要性对我帮助很大。谢谢。 - Mika Prouk
1个回答

8
当使用RaycasterPoints(之前称为PointCloud)一起时,需要注意在Raycaster构造函数中,
params.Points.threshold = 1

根据您的场景比例,您可能需要更改该值。 threshold 的单位为世界单位。

此外,点击区域仅是近似值,因为代码没有考虑到 Points.material.map 中的任何透明度。

three.js r.72


我在“THREE”对象中没有定义“Raycaster.params”。在R71中有任何更改吗?ERR.Uncaught TypeError: 无法读取未定义的属性“PointCloud”。 - Martin
@raphaelRauwolf 点云 -> 点。感谢您的提示。 - WestLangley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接