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