2016-03-15 71 views
1

我有一個平坦的表面,我已經爆炸並鑲嵌成三角形。我想獲得每張臉的位置來應用動畫,但顯然我無法做到這一點。Three.js - 獲取棋盤格對象的單個面的位置

if (intersects.length > 0) { 

    // if the closest object intersected is not the currently stored intersection object 
    if (intersects[0].object != INTERSECTED) { 


     if (INTERSECTED) { 
      INTERSECTED.face.color.setHex(INTERSECTED.currentHex); 
     } 

     INTERSECTED = intersects[0]; 

     INTERSECTED.currentHex = INTERSECTED.face.color.getHex(); 
     INTERSECTED.face.color.setHex(0xc0392b); 
     INTERSECTED.object.geometry.colorsNeedUpdate = true; 

     var position = new THREE.Vector3(); 
     position.setFromMatrixPosition(INTERSECTED.matrixWorld); 
     alert(position.x + ',' + position.y + ',' + position.z); 
    } 
} 

我試圖用INTERSECTED.face.matrixWorld.getPosition(),如this example規定,但它拋出一個錯誤。 Here你可以找到完整代碼的JSFiddle。你知道我的代碼有什麼問題嗎?

預先感謝您的回覆!

+0

您是否檢查過getPosition是matrixWorld上的方法?你得到什麼樣的錯誤? –

+0

你說得對,我編輯了這個問題。我得到'Uncaught TypeError:無法讀取未定義的屬性'元素'。你有什麼想法嗎? –

+0

我對圖書館並不熟悉,但我沒有看到「元素」會從哪裏來。錯誤是否來自庫中某處的代碼,特別是getPosition函數?就在我頭頂,聽起來像一個'this'在某個地方沒有按照預期執行,可能需要某種綁定。 –

回答

6

A THREE.Face3沒有像位置或矩陣那樣的東西。你需要使用這些點以使用人臉索引abc找到對應的頂點,然後你可以計算出你face centroid(也面對重力點):

var geometry = INTERSECTED.object.geometry; 
var face = INTERSECTED.face; 

var vertices = geometry.vertices; 
var v1 = vertices[ face.a ]; 
var v2 = vertices[ face.b ]; 
var v3 = vertices[ face.c ]; 

// calculate the centroid 
var position = new THREE.Vector3(); 
position.x = (v1.x + v2.x + v3.x)/3; 
position.y = (v1.y + v2.y + v3.y)/3; 
position.z = (v1.z + v2.z + v3.z)/3; 

這裏的updated fiddle