繁体   English   中英

从点Three.js生成网格

[英]Generate Mesh from Points 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 );

这些点得到了补充,我可以在它们之间绘制线条我只是无法填充中心所以鼠标可以检测到它!

您可以使用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

有一种不同的方法可以从点云创建网格 - 这一切都取决于您的具体需求。 我将尝试为您提供一些方法的高级概述。

也许一个边界框就足够了? 计算点云的边界框和针对BBox的光线投影。

如果BBox碰巧包含没有点的大体积,那么你可能需要在这些点周围采用更紧密的网格。 给定光线投射后,将所有点投影到垂直于光线的平面上,然后使用礼品包装算法构建此平面上点的2D凸包。 最有可能存在实现此算法的库。 使用此算法构造的多边形进行光线投射测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM