我试图通过鼠标点击生成的一堆点在Three中创建一个可点击的形状。
此代码有点工作:
mouse.x = ( ( event.clientX - renderer.domElement.offsetLeft ) / player.width ) * 2 - 1;
mouse.y = - ( ( event.clientY - renderer.domElement.offsetTop ) / player.height ) * 2 + 1
raycaster.setFromCamera( mouse, camera );
var objects = [];
objects.push(selectedHotspot);
var intersects = raycaster.intersectObjects( objects, true );
if ( intersects.length > 0 ) {
var point = new THREE.Mesh( new THREE.SphereGeometry(1, 1, 1), new THREE.MeshBasicMaterial( { color: 0x00ffff } ) );
point.position.copy(intersects[0].point);
scene.add(point);
points.push(intersects[0].point);
}
var geometry = new THREE.Geometry();
points.forEach( function( point ){
geometry.vertices.push( point );
});
geometry.vertices.push( points[0] );
geometry.faces.push( new THREE.Face3(0, 1, 2));
// material
var material = new THREE.MeshBasicMaterial( { color: 0xffffff } );
// line
var line = new THREE.Mesh( geometry, material );
scene.add( line );
hotspots.push( line );
点数增加了,我可以在它们之间绘制线条我只能填写中心,以便鼠标可以检测到它!
答案 0 :(得分:5)
您可以使用THREE.ConvexGeometry
从点创建网格。
var mesh = new THREE.ConvexGeometry( vertices_array );
例如,请参阅http://threejs.org/examples/webgl_geometry_convex.html
这只是你的点的凸包,但它应该足以满足你的用例。
您必须在源代码中明确包含three.js文件examples/js/geometries/ConvexGeometry.js
。
three.js r.84
答案 1 :(得分:2)
从点云创建网格有多种方法 - 这取决于您的具体需求。我将尝试为您提供一些方法的高级概述。
也许一个边界框就足够了?计算点云的边界框并对BBox进行光线投射。
如果BBox恰好包含没有点的大体积,那么你可能需要在这些点周围采用更紧密的网格。给定光线投射后,将所有点投影到垂直于光线的平面上,然后使用Gift wrapping algorithm构建此平面上点的2D凸包。最有可能存在实现此算法的库。使用此算法构造的多边形进行光线投射测试。