2017-07-03 53 views
0

我是Three.js的新手,並且已經分配了嘗試修復偶爾出現的顯示爲壞的文件的法線任務。我們不知道它們是不好的掃描還是可能是不好的上傳。我們正在研究上傳功能,但如果可能的話,也想嘗試修復它們。任何人都可以提供任何想法或提示來修復文件或找到正確的法線?修復可能壞的.stl文件的法線。

下面是我們抓住法線和我們如何抓住它們的代碼。注意:此代碼通常工作正常,這只是法線不良時的問題。我還附加了其中一個文件,以便您可以查看正在處理的法線類型和「壞文件」。 Get File here

我們也在C++的後端使用VTK,所以使用這兩種方法的解決方案或想法都很有幫助。

my.geometry = geometry; 

    var front = new THREE.MeshPhongMaterial(
    {color: 0xe2e4dc, shininess: 50, side: THREE.DoubleSide}); 

var mesh = [new THREE.Mesh(geometry, front)]; 

my.scene.add(mesh[0]); 
my.objects.push(mesh[0]); 

var rc = new THREE.Raycaster(); 

var modelData = {'objects': [mesh[0].id], 'id': mesh[0].id}; 

var normalFound = false; 
for (var dy = 80; dy >= -80; dy = dy - 10) { 
    console.log('finding a normal on', 0, dy, -200); 
    rc.set(new THREE.Vector3(0, dy, -200), new THREE.Vector3(0, 0, 1)); 

    var hit = rc.intersectObjects([mesh[0]]); 

    if (hit.length) { 
    my.normal = hit[0].face.normal.normalize(); 
    console.log('normal', my.normal.z); 

    modelData['normal'] = my.normal; 

    if ((my.normal.z > 0.9 && my.normal.z < 1.1)) { 
     my.requireOrienteering = true; 
     modelData['arch'] = 'lower'; 
     normalFound = true; 
     console.log('we have a lower arch'); 
    } else if ((my.normal.z < -0.9 && my.normal.z > -1.1)) { 
     modelData['arch'] = 'upper'; 
     normalFound = true; 
     console.log('we have an upper arch'); 
     } 

    break; 
    } 
} 
+0

我不確定它是如何完成的,但有很多現有的程序會爲您修復.stl文件。獲取其中一個源代碼並查看它,它可能會給你一些想法。 – Bernard

回答

0

計算法線是一個簡單的步驟。如果你計算兩個向量的交叉乘積(幾何一個),你將得到一個與你輸入的兩個向量正交的向量。所有你現在要做的就是規範化它,因爲法線應該標準化,不要搞亂閃電計算。

對於光滑表面,您必須計算點上的所有法線並對其進行平均。對於平面而言,每個頂點有多個標準(每個表面一個)。

在僞代碼它看起來像這樣的四邊形:

foreach quad : mesh 
foreach vertex : quad 
    vector1 = neighborVertex.pos - vertex.pos; 
    vector2 = otherNeighborVertex.pos - vertex.pos; 
    vertex.normal = normalize(cross(vector1, vector2)); 
end foreach; 
end foreach; 
0

VTK有一個名爲vtkPolyDataNormals過濾器,你可以在你的文件來運行計算法線。在運行之前,您可能需要撥打ConsistencyOn()NonManifoldTraversalOn()AutoOrientNormalsOn()

如果您想要點法線(而不是每個單元法線)並且您的形狀具有尖角,則可能需要使用SetFeatureAngle()提供一個特徵角並呼叫SplittingOn()

相關問題