Three.js有获取对象的单击面并随后突出显示该面的示例。我想知道如何获得整个物体而不仅仅是脸部。
实施例: 我有很多小行星都在一个缓冲区中渲染。如何获得点击的小行星对象?
*更新*
我想我找到了一种方法来实现对象的选择'。基本上,我在内存中保留了一个对象列表。当拾取对象时,我使用该对象的点信息对列表中的所有对象进行碰撞检测。理论上,最接近交叉点的物体应该是我需要的物体。
答案 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:
这将向您展示如何挑选面孔,而不是对象。所以我的猜测是:
//pseudo code
foreach( object in bufferGeometry){
foreach(face in object){
face.addAttribute ( name[object], attribute[object] )
}
}
因此,为每个对象创建自定义属性并将其传递到其面部,您可以:
与脸交叉
获取其自定义属性
选择具有该属性的所有面孔 - >对象
我没有测试过,但我想它应该可以使用,让我知道:)。