2016-12-02 57 views
0

給定一組Vector3點,我需要測試它們在某個任意平面上是否共面。假設它們是共面的,那麼我需要將它們映射/投影到XY平面上,同時保持所有點之間的比例。Three.js--確定點是否共面以及將共平面映射到XY平面上

我不認爲這樣做的數學辛苦,但正在尋找使用three.js所做一個簡單的/有效的方法...

+0

測試一組點是否共面的一種方法是取前三個點並使用Plane.setFromCoPlanarPoints(p1,p2,p3)'來製作一個平面。然後爲後續點使用'Plane.distanceToPoint(p)'。這是做第一部分我想知道的有效方法嗎? – jugglingcats

回答

1

1)功能,以覈實該四點位於同一平面very simple

function tripleProduct(a,b,c) { 
    return a.clone().dot(
    (new THREE.Vector3()).cross(b,c) 
); 
} 

function _isCoPlanar(a,b,c,d) { 
    var ab = b.clone().sub(a); 
    var ac = c.clone().sub(a); 
    var ad = d.clone().sub(a); 
    return tripleProduct(ab,ac,ad) === 0; 
} 

You need to go through the array,並確保由於第四謊言在同一平面上與前三站的每一個點。

2)對於飛機上的投影,您可以使用projectOnPlane函數。

+0

謝謝。在我的情況下,我有任意數量的點來檢查,所以我不能直接使用你的解決方案,但我確定我可以適應它。它是否可能比我提出的在尋找最初的飛機和在隨後的點上使用'distanceTo'的評論中提出的方法更快? – jugglingcats

+0

@jugglingcats我認爲這比你提出的方法更準確。看看'jsfiddle'的鏈接 - 有很多點的例子。 –

+0

關於'projectOnPlane',在這種情況下它沒有給出預期的結果。例如,考慮點[(0,0,0),(1,0,0),(1,0,1),(0,0,1)]',即。 XZ平面上的一個正方形。如果我們將它們投影到XY平面上,它會給出一條直線上的點:'[(0,0,0),(1,0,0),(1,0,0),(0,0,0)]' 。目的是在保持形狀的同時將平面/共麪點轉換到XY平面(或平行於XY的任何平面)。 – jugglingcats