【问题标题】:How do you pick individual points from THREE.Points object?您如何从 THREE.Points 对象中选择单个点?
【发布时间】:2019-12-12 05:12:25
【问题描述】:

我有一个由单个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 );

    }

【问题讨论】:

    标签: javascript three.js point-clouds


    【解决方案1】:

    第 1 步:

    更改material.color 将影响所有点,而不仅仅是一个。如果你想为每个点设置一个独立的颜色,你必须遵循this example之类的东西。关键是你必须使用Geometry.colors 数组来分配每个点的颜色,就像你对每个点的位置所做的那样。这样,您可以在光线投射发生时单独更改它。然后,在创建材质时,使用THREE.VertexColors 告诉它读取各个顶点颜色:

    THREE.PointsMaterial({ vertexColors: THREE.VertexColors });

    第 2 步:

    每次你的光线投射器与某物相交时,你都会得到一个object with several attributes

    { distance, point, face, faceIndex, object, uv, instanceId }

    正如您所发现的,object 属性是所有 个点,但您可以使用point 属性来获取发生交叉点的 Vec3 位置。您需要遍历您的 geometry.vertices 数组以找到最接近的数组,但是一旦找到它,您可以使用您在第 1 步中建立的 geometry.color 属性更改其颜色。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多