Ajustar eficientemente a los vértices en threejs

Quería hacer una función de ajuste para ajustar a mis vértices de malla. Experimenté con varias soluciones.

Una solución es agregarTHREE.Sprite instancias para todos los vértices en mi escena y luego usando unrayCaster para decidir si hay unsnap punto en elintersects formación. Funciona bastante bien; aquíes un violín con una demostración.
La idea es ocultar los sprites en la solución final para que no se procesen, pero mis escenas son bastante grandes, por lo que aún significaría agregar muchos sprites a mi escena (por cada vértice, posiblemente miles de sprites) para detectar puntos de referencia con mirayCaster.

var intersects = rayCaster.intersectObject(scene, true);
var snap = null;
if (intersects.length > 0) {
    var index = 0;
    var intersect = intersects[index];
    while (intersect && intersect.object.name === 'snap') {
        snap = sprite.localToWorld(sprite.position.clone());
        index++
        intersect = intersects[index];
    }
    if (intersect) {
        var face = intersect.face;
        var point = intersect.point;
        var object = intersect.object;
        mouse3D.copy(point);
    }
}
if (snap) {
    renderer.domElement.style.cursor = 'pointer';
} else {
    renderer.domElement.style.cursor = 'no-drop';
}

También pensé en una solución alternativa haciendo los cálculos usando los resultados delrayCaster. Esa solución está demostradaen este violín.
La idea aquí es probar todovertices de la geometría de laobject (malla) que se intersecta y luego verifique si eldistance entre la intersecciónpoint y esosvertices de la geometría es más pequeña que el complementothreshold.

var intersects = rayCaster.intersectObject(mesh, true);
if (intersects.length > 0) {
    var distance, intersect = intersects[0];
    var face = intersects[0].face;
    var point = intersects[0].point;
    var object = intersects[0].object;
    var snap = null;
    var test = object.worldToLocal(point);
    var points = object.geometry.vertices;
    for (var i = 0, il = points.length; i < il; i++) {
        distance = points[i].distanceTo(test);
        if (distance > threshold) {
            continue;
        }
        snap = object.localToWorld(points[i]);
    }
    if (snap) {
        sphereHelper.position.copy(snap);
        sphereHelper.visible = true;
        renderer.domElement.style.cursor = 'pointer';
    } else {
        sphereHelper.visible = false;
        renderer.domElement.style.cursor = 'no-drop';
    }
}

Lo triste es que en la segunda solución, el ajuste solo funcionará cuando el mouse se mueva desde la superficie del objeto intersectado hacia un vértice. En caso de que el mouse se mueva desde fuera del objeto (para que no haya intersección), el ajuste no funcionará. En ese sentido, la primera solución con sprites es mucho más útil ...

Mi pregunta, ¿estoy complicando demasiado las cosas y hay una manera mejor / más simple / más eficiente de hacer esto? Cualquier sugerencia para enfoques alternativos es bienvenida.

Respuestas a la pregunta(1)

Su respuesta a la pregunta