2017-09-16 2 views
2

얼굴 배열에서 중복 된 얼굴을 제거하고 싶습니다. 아래 코드를 시도했지만 완료 방법을 모르겠습니다. 얼굴 배열에서 중복 된 얼굴 제거 - Three.js

는 첫째로 나는 그것을 찾을 놀라게했다 :

new THREE.Vector3(0,0,0) == new THREE.Vector3(0,0,0) 

이 거짓 산출 (나는 사실을 산출 기대)와 또한 또한 아래의 코드가 거짓 얻을 수 있음을 (다시 나는 사실을 산출하기 위해 기대). 얼굴은 얼굴의 배열에 이미 있는지 여부를 확인하려면 코드에 관해서는

var triangleGeometry = new THREE.Geometry(); 
    triangleGeometry.vertices.push(new THREE.Vector3(0.0, 1.0, 0.0)); 
    triangleGeometry.vertices.push(new THREE.Vector3(-1.0, -1.0, 0.0)); 
    triangleGeometry.vertices.push(new THREE.Vector3(1.0, -1.0, 0.0)); 
    triangleGeometry.faces.push(new THREE.Face3(0, 1, 2)); 

    var triangleGeometry2 = new THREE.Geometry(); 
    triangleGeometry2.vertices.push(new THREE.Vector3(0.0, 1.0, 0.0)); 
    triangleGeometry2.vertices.push(new THREE.Vector3(-1.0, -1.0, 0.0)); 
    triangleGeometry2.vertices.push(new THREE.Vector3(1.0, -1.0, 0.0)); 
    triangleGeometry2.faces.push(new THREE.Face3(0, 1, 2)); 

    triangleGeometry2.faces[0] === triangleGeometry.faces[0] - yields false 

나는 다음과 같은 기록이 있습니다

  function faceInArray(arrayOfFaces,face) 
      { // https://stackoverflow.com/questions/29759480/how-to-customize-object-equality-for-javascript-set 
       // Determine whether a face is in an array of faces 
       // The ES6 Set object does not have any compare methods or custom compare extensibility. 
       // For this reason this function will be called before adding an face to an array of faces 
       // to ensure that duplicate faces are not placed in an array 

       for(let i = 0; i < arrayOfFaces.length; i++) 
       { 
        vertexaFaceFromArray = buildingGeometry.vertices[arrayOfFaces[i].a] 
        vertexbFaceFromArray = buildingGeometry.vertices[arrayOfFaces[i].b] 
        vertexcFaceFromArray = buildingGeometry.vertices[arrayOfFaces[i].c] 

        vertexaFace = buildingGeometry.vertices[face.a] 
        vertexbFace = buildingGeometry.vertices[face.b] 
        vertexcFace = buildingGeometry.vertices[face.c] 

        // Compare the vertices in each face I'm not sure how to do this? 


       } 
      } 

지금 나는 단순히 확인 vertex1로 여기에서 것이며 진행하는 방법을 확실 해요 == 코드의 첫 번째 블록에서 demostrated로 vertex2 작동하지 않습니다. 비교할 때 각면의 x, y 및 z 좌표를 추출해야하나요? 또한 꼭지점의 순서가 중요합니까?

+0

안녕하세요. Anton, 현재 시나리오의 간단한 예를 들어 질문을 업데이트 해주십시오. 지금까지 시도한 내용은 무엇입니까? – rafaelcastrocouto

+1

귀하의 의견에 대해 @rafaelcastrocouto 감사합니다. 제 질문에 더 많은 세부 사항을 추가했습니다. 처음에는 너무 간단했습니다. –

답변

2

이유가 작동하지 않는 이유 : new THREE.Vector3(0,0,0) == new THREE.Vector3(0,0,0) 이 경우 ==은 두 값이 동일한 개체에 대한 참조인지 확인합니다. 그러나 벡터는 x, y 및 z에 대해 동일한 값을 갖는 다른 객체입니다. 대신 Vector3에 equals 기능 three.js를 사용한다 : 각면은 동일한 정점이있는 경우, 물론,이 경우에만 검사를

function faceInArray(arrayOfFaces, face) { 
    for(let i = 0; i < arrayOfFaces.length; i++) { 
     vertexaFaceFromArray = buildingGeometry.vertices[arrayOfFaces[i].a] 
     vertexbFaceFromArray = buildingGeometry.vertices[arrayOfFaces[i].b] 
     vertexcFaceFromArray = buildingGeometry.vertices[arrayOfFaces[i].c] 

     vertexaFace = buildingGeometry.vertices[face.a] 
     vertexbFace = buildingGeometry.vertices[face.b] 
     vertexcFace = buildingGeometry.vertices[face.c] 

     if (vertexaFaceFromArray.equals(vertexaFace) && 
      vertexbFaceFromArray.equals(vertexbFace) && 
      vertexcFaceFromArray.equals(vertexcFace)) { 
      return true; 
     } 
    } 
    return false; 
} 

을하지만 :

new THREE.Vector3(0,0,0).equals(new THREE.Vector3(0,0,0)) 

그래서 함수는 다음과 같이 작업 할 수 있습니다 입력면으로 주문하십시오. 그것은 당신이 이것을 사용하려고하는 것에 달려 있지만 원칙적으로 얼굴 (1, 2, 3)은 얼굴 (2, 3, 1)과 (3, 1, 2)와 같습니다.

또한면이 양면 인 경우 정점의 순서와 동일합니다. 나는. (3, 2, 1), (2, 1, 3) 및 (1, 3, 2) 따라서 이러한 경우를 확인하기 위해 코드를 확장 할 수도 있습니다.