如何获取3D对象(而不仅仅是单击的面)?

时间:2016-04-08 17:26:49

标签: three.js

Three.js有获取对象的单击面并随后突出显示该面的示例。我想知道如何获得整个物体而不仅仅是脸部。

实施例: 我有很多小行星都在一个缓冲区中渲染。如何获得点击的小行星对象?

*更新*

我想我找到了一种方法来实现对象的选择'。基本上,我在内存中保留了一个对象列表。当拾取对象时,我使用该对象的点信息对列表中的所有对象进行碰撞检测。理论上,最接近交叉点的物体应该是我需要的物体。

1 个答案:

答案 0 :(得分:0)

有一个很好的例子here

您可以使用raycaster来投射光线并检测交叉点。

这是对象选择所需代码的一部分。

// find intersections

            raycaster.setFromCamera( mouse, camera );

            var intersects = raycaster.intersectObjects( scene.children );

            if ( intersects.length > 0 ) {

                if ( INTERSECTED != intersects[ 0 ].object ) {

                    if ( INTERSECTED ) INTERSECTED.material.emissive.setHex( INTERSECTED.currentHex );

                    INTERSECTED = intersects[ 0 ].object;
                    INTERSECTED.currentHex = INTERSECTED.material.emissive.getHex();
                    INTERSECTED.material.emissive.setHex( 0xff0000 );

                }

            } else {

                if ( INTERSECTED ) INTERSECTED.material.emissive.setHex( INTERSECTED.currentHex );

                INTERSECTED = null;

            }

            renderer.render( scene, camera );

更新1: 如果所有对象都合并为一个BufferGeometry:

  • 看一下这个例子:webgl_interactive_buffergeometry
  • 这将向您展示如何挑选面孔,而不是对象。所以我的猜测是:

     //pseudo code 
     foreach( object in bufferGeometry){ 
         foreach(face in object){ 
            face.addAttribute ( name[object], attribute[object] ) 
         } 
     }
    

因此,为每个对象创建自定义属性并将其传递到其面部,您可以:

  • 与脸交叉

  • 获取其自定义属性

  • 选择具有该属性的所有面孔 - >对象

我没有测试过,但我想它应该可以使用,让我知道:)。