顶点和连接的顶点

时间:2017-09-29 09:37:32

标签: three.js

我想加载一个STL,列出它的所有顶点并获得它们所连接的顶点,这样我就可以计算它们的角度和距离。 是否有可能用three.js做到这一点? 我的想法是加载低多边形并创建我可以使用3D进行3D打印和组装的连接器,以在现实生活中重新创建stl的线框表示。 例如,加载一个多维数据集stl文件,并创建8个连接器,每个连接器有3个分支,如下图所示。 enter image description here

1 个答案:

答案 0 :(得分:0)

这个问题措辞的方式,你真的应该申请赏金。但我很好奇如何去做,因为我喜欢你的想法。请注意,即使是简单的stl或obj文件也可能包含数千条边。这是很多要打印的销钉。即使是简单粗糙的球体也可能包含数百个边缘。

此函数返回边和节点列表。

边缘列表非常简单。每个数组位置都是一个ID,值是边的长度。例如,如果您需要找到边15的长度,只需找到边[15]。该值将是该行的长度。

节点包含自己边的列表。我相信这些是逆时针存储的,但是,你想要测试它。每个节点的缠绕顺序将决定您的顶点是否正确打印,可能仍需要解决。例如,这些看起来像[0,2,4]。您可以使用这些值来查找它们的长度。节点还包含角度对象。这些角度以与边缘相同的顺序保存在列表中。每个节点的属性名称是它在冒号分隔的空间中的本地位置。例如,节点的唯一名称可能如下所示:" 19.09830093383789:190.2113037109375:58.778526306152344"

每个角度在局部空间中是弧度,以与边缘相同的顺序列出。这很重要:角度在局部空间中以弧度表示。如果模型的父模型上有变换,则需要应用变换矩阵来获取世界空间。该模型也不能有任何翻转面。

例如,此节点连接到边0,2和4:

节点> " 19.09830093383789:190.2113037109375:58.778526306152344"

Node.edges> [0,2,4]

Node.angles> [0.31415926112916176,0.31415926112916176,0.31415926228226293]

这适用于具有N个边数的节点。但是,该模型需要在现实世界中保持水密。

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};
  }

工作小提琴: https://jsfiddle.net/y1hs9x4v/