2017-09-16 5 views
2

顔の配列から重複する顔を削除したい - 私は以下のコードを試しましたが、完了方法がわかりません。顔の配列から重複する顔を削除する - Three.js

まず私はそれを見つけるために驚いた:偽(私はそれが真をもたらすことを期待する)、さらに

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

利回り以下のコードはまた、(再び、私はそれがTrueをもたらすことを期待する)偽得られること。

顔が、私は次のように書かれている面の配列にすでに存在するかどうかを確認するために私のコードについては
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をチェックすると、ここからprocedeする方法がわかりませんよ==頂点2は、コードの最初のブロックでデモストされているので動作しません。それらを比較するとき、各面のx、y、z座標を実際に抽出する必要がありますか?さらに、頂点の順序は重要ですか?

+0

こんにちはAntonさん、あなたの現在のシナリオの簡単な例であなたの質問を更新してください。これまでに何を試してみましたか? – rafaelcastrocouto

+1

あなたのコメントのために@rafaelcastrocoutoありがとうございました。私は質問に多くの詳細を追加しました。最初はあまりにも単純でした。 –

答えて

2

これが機能しない理由:new THREE.Vector3(0,0,0) == new THREE.Vector3(0,0,0) この場合、==は、2つの値が同じオブジェクトへの参照であるかどうかをチェックしていますか?しかし、あなたのベクトルはx、y、zについて同じ値を持つ異なるオブジェクトです。各顔がまったく同じで頂点を持っている場合

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)) 

:あなたは代わりにするVector3上equals機能three.js使用する必要があります入力面としての順序。それはあなたがこれを使う予定に依存しますが、原則として顔(1,2,3)は顔(2,3,1)と(3,1,2)と同じです。

さらに、面が両面である場合、頂点の順序も同じです。私。 (3,2,1)、(2,1,3)、(1,3,2)となる。したがって、これらのケースをチェックするためにコードを拡張することもできます。

関連する問題