我有一个由单个THREE.Points()
表示的点云。我希望通过鼠标单击来挑选单个点。
starsGeometry = new THREE.Geometry();
for ( var i = 0; i < 10000; i ++ ) {
var star = new THREE.Vector3();
star.x = THREE.Math.randFloatSpread( 100 );
star.y = THREE.Math.randFloatSpread( 100 );
star.z = THREE.Math.randFloatSpread( 100 );
starsGeometry.vertices.push( star );
}
var starsMaterial = new THREE.PointsMaterial( { color: 0x888888 } );
starField = new THREE.Points( starsGeometry, starsMaterial );
scene.add( starField );
我的选择代码是这样的,但不幸的是它只是选择整个 Points 对象
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
raycaster.setFromCamera( mouse, camera );
// calculate objects intersecting the picking ray
var intersects = raycaster.intersectObjects( scene.children );
for ( var i = 0; i < intersects.length; i++ ) {
intersects[ i ].object.material.color.set( 0xff0000 );
}
第 1 步:
改变material.color
将影响所有点,而不仅仅是一个点。如果要为每个点设置独立的颜色,则必须遵循类似于此示例的内容。关键点是,你必须使用Geometry.colors
数组来分配每个点的颜色,就像你对每个点的位置所做的那样。这样,您可以在光线投射发生时单独更改它。然后,在创建材质时,您告诉它使用THREE.VertexColors
读取各个顶点颜色:
THREE.PointsMaterial({ vertexColors: THREE.VertexColors });
第 2 步:
每次光线投射器与某些内容相交时,您都会得到一个具有多个属性的对象:
{ distance, point, face, faceIndex, object, uv, instanceId }
如您所发现的,object
属性都是点,但您可以使用point
属性来获取相交发生位置的 Vec3 位置。您需要遍历geometry.vertices
数组才能找到最近的数组,但找到它后,您可以使用在步骤 1 中建立的geometry.color
属性更改其颜色。