从点Three.js

时间:2017-01-25 09:23:36

标签: javascript three.js

我试图通过鼠标点击生成的一堆点在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 );

点数增加了,我可以在它们之间绘制线条我只能填写中心,以便鼠标可以检测到它!

2 个答案:

答案 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凸包。最有可能存在实现此算法的库。使用此算法构造的多边形进行光线投射测试。