我想加载一个STL,列出它的所有顶点,并获得它们所连接的顶点,这样我就可以计算它们的角度和距离。用three.js可以做到这一点吗?
我的想法是加载低聚stl,并创建连接器,我可以3D打印和组装棒,以在现实生活中重新创建stl的线框表示。例如,加载一个多维数据集stl文件,并创建8个连接器,每个连接器将有3个分支,如下图所示。
发布于 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个边的节点。然而,为了在现实世界中工作,模型需要是无懈可击的。
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://stackoverflow.com/questions/46486044
复制相似问题