2017-09-29 30 views
0

STLを読み込み、すべての頂点をリストし、それらが接続されている頂点を取得したいので、その角度と距離を計算できます。 three.jsでこれを行うことは可能でしょうか?
私のアイデアは、低ポリスルールをロードして、実際にstlのワイヤフレーム表現を再現するために、3D印刷してロッドでアセンブルできるコネクタを作成することです。 たとえば、キュ​​ーブのstlファイルを読み込み、下の図のような3つのブランチを持つ8つのコネクタを作成します。 enter image description here頂点と接続された頂点

+1

は、はい、three.jsで行うことが可能です。 – gaitat

答えて

0

この質問の言葉は、本当に賞金を適用したはずです。私はあなたのアイデアが好きなので、私はそれを行う方法について好奇心だった。ただし、単純なstlまたはobjファイルでも何千ものエッジが含まれることに注意してください。それは印刷するためのダーベルの多くです。単純で粗い球であっても数百のエッジを含むことができます。

この関数は、エッジとノードのリストを返します。

エッジリストは非常に簡単です。各配列位置はIDであり、値はエッジの長さです。たとえば、エッジ15の長さを見つける必要がある場合は、エッジを見つけるだけです[15]。値は行の長さになります。

ノードには、独自のエッジのリストが含まれています。私はこれらが反時計回りに保存されていると信じていますが、それをテストしたいと思うでしょう。頂点が正しく印刷されているかどうかは、各ノードの順番によって決まりますが、解決する必要がある場合もあります。これらは[0,2,4]のように見えます。これらの値を使用して長さを見つけることができます。ノードには、アングルオブジェクトも含まれています。これらの角度は、エッジと同じ順序でリストに保持されます。各ノードのプロパティ名は、コロンで区切られたスペースのローカル位置です。たとえば、ノードの一意の名前は次のようになります。 "19.09830093383789:190.2113037109375:58.778526306152344"

各角度は、エッジと同じ順序でリストされたローカル空間のラジアンです。これは重要です。角度はローカル空間ではラジアンです。モデルに変換を伴う親モデルがある場合、ワールド空間を得るために変換行列を適用する必要があります。モデルには反転した顔もありません。例えば

、このノードは0,2をEdgeに接続し、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/

関連する問題