2017-09-29 2 views
0

Je voudrais charger une STL, énumérer tous ses sommets et obtenir les sommets auxquels ils sont connectés pour que je puisse calculer leurs angles et leur distance. Serait-il possible de le faire avec three.js?
Mon idée est de charger du low poly stl et de créer des connecteurs que je pourrais imprimer en 3D et assembler avec des tiges, pour recréer une représentation filaire de la stl dans la vraie vie. Par exemple, chargez un fichier stl cube et créez 8 connecteurs qui auront chacun 3 branches, quelque chose comme l'image ci-dessous. Sommets et sommets connectés

+1

oui, il serait possible de le faire avec Three.js. – gaitat

Répondre

0

De la façon dont cette question est formulée, vous auriez vraiment dû appliquer une prime. mais j'étais curieux de savoir comment le faire, parce que j'aime votre idée. Notez cependant que même un simple fichier stl ou obj peut contenir des milliers d'arêtes. C'est beaucoup de chevilles à imprimer. Même une sphère simple et rugueuse peut contenir des centaines d'arêtes.

Cette fonction renvoie une liste d'arêtes et de nœuds.

La liste des arêtes est très simple. Chaque position de tableau est un ID et la valeur est la longueur de l'arête. Par exemple, si vous avez besoin de trouver la longueur de l'arête 15, trouvez simplement les arêtes [15]. La valeur sera la longueur de la ligne.

Les noeuds contiennent une liste de leurs propres arêtes. Je crois que ceux-ci sont stockés dans le sens inverse des aiguilles d'une montre, mais vous voudrez tester cela. L'ordre d'enroulement de chaque nœud déterminera si vos sommets s'impriment correctement et devront peut-être être résolus. Ceux-ci ressemblent à [0,2,4] par exemple. Vous pouvez utiliser ces valeurs pour trouver leurs longueurs. Les nœuds contiennent également un objet angle. Ces angles sont conservés dans une liste dans le même ordre que les bords. Le nom de la propriété de chaque nœud est sa position locale dans l'espace délimitée par deux points. Par exemple, le nom unique d'un nœud peut ressembler à: "19.09830093383789: 190.2113037109375: 58.778526306152344"

Les angles de chacun sont des radians dans l'espace local, listés dans le même ordre que les arêtes. C'est important: les angles sont en radians dans l'espace local. Si votre modèle a un modèle parent avec une transformation, vous devez appliquer une matrice de transformation pour obtenir l'espace du monde. Le modèle ne peut pas non plus avoir de faces retournées.

Par exemple, ce nœud se connecte au bord 0,2 et 4:

Node> "19,09830093383789: 190,2113037109375: 58,778526306152344"

Node.edges> [0, 2, 4]

Node.angles> [0.31415926112916176, 0.31415926112916176, 0.31415926228226293]

Ceci fonctionnera avec les nœuds avec N nombre d'arêtes. Cependant, le modèle doit être étanche pour fonctionner dans le monde réel.

function getEdges(geometry){ 
    var material = new THREE.LineBasicMaterial({ color: 0xff0000}); 
    var edges = new THREE.EdgesGeometry(geometry); 
    var vertexList = edges.attributes.position.array; 
    var nodes = {}; 
    var edges = []; 
    var edgeID = 0; 
    for(var i=0; i<vertexList.length;i=i+6){ 
     var geometry = new THREE.Geometry(); 
     var node1ID = vertexList[i]+":"+vertexList[i+1] +":"+ vertexList[i+2]; 
     var node2ID = vertexList[i+3]+":"+vertexList[i+4] +":"+ vertexList[i+5]; 
     var node1 = nodes[node1ID]; 
     var node2 = nodes[node2ID]; 
     if(node1 == undefined){ 
     node1 = {}; 
     node1.edges = []; 
     node1.angles = []; 
     nodes[node1ID] = node1; 
     } 
     if(node2 == undefined){ 
     node2 = {}; 
     node2.edges = []; 
     node2.angles = []; 
     nodes[node2ID] = node2; 
     } 
     var vec1 = new THREE.Vector3(vertexList[i], vertexList[i+1], vertexList[i+2]); 
     var vec2 = new THREE.Vector3(vertexList[i+3], vertexList[i+4], vertexList[i+5]); 
     geometry.vertices.push(vec1); 
     geometry.vertices.push(vec2); 
     geometry.computeLineDistances(); 
     var edge = new THREE.Line(geometry, material); 

     node1.edges.push(edgeID); 
     node1.angles.push(vec1.angleTo(vec2)); 

     node2.edges.push(edgeID); 
     node2.angles.push(vec2.angleTo(vec1)); 

     edges[edgeID] = geometry.lineDistances[1]; 

     mesh.add(edge); 
     edgeID++; 
    } 
    return {nodes:nodes, edges:edges}; 
    } 

violon travail: https://jsfiddle.net/y1hs9x4v/