首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >顶点和连通顶点

顶点和连通顶点
EN

Stack Overflow用户
提问于 2017-09-29 17:37:32
回答 1查看 316关注 0票数 0

我想加载一个STL,列出它的所有顶点,并获得它们所连接的顶点,这样我就可以计算它们的角度和距离。用three.js可以做到这一点吗?

我的想法是加载低聚stl,并创建连接器,我可以3D打印和组装棒,以在现实生活中重新创建stl的线框表示。例如,加载一个多维数据集stl文件,并创建8个连接器,每个连接器将有3个分支,如下图所示。

EN

回答 1

Stack Overflow用户

发布于 2017-10-02 23:41:04

从这个问题的表达方式来看,你真的应该申请赏金。但我很好奇怎么做,因为我喜欢你的想法。但请注意,即使是一个简单的stl或obj文件也可能包含数千条边。要打印的图钉太多了。即使是一个简单的、粗糙的球体也可以包含数百条边。

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

边缘列表非常简单。每个数组位置都是一个ID,值是边的长度。例如,如果您需要查找15边的长度,只需查找edges15即可。该值将是线的长度。

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

每条边的角度都是局部空间中的弧度,按与边相同的顺序列出。这一点很重要:在局部空间中,角度是弧度。如果您的模型有一个带有变换的父模型,则需要应用变换矩阵来获得世界空间。模型也不能有任何翻转的面。

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

Node > "19.09830093383789:190.2113037109375:58.778526306152344“

Node.edges > 0,2,4

Node.angles > 0.31415926112916176、0.31415926112916176、0.31415926228226293

这将适用于具有N个边的节点。然而,为了在现实世界中工作,模型需要是无懈可击的。

代码语言:javascript
运行
复制
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/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46486044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档