給定一組Vector3點,我需要測試它們在某個任意平面上是否共面。假設它們是共面的,那麼我需要將它們映射/投影到XY平面上,同時保持所有點之間的比例。Three.js--確定點是否共面以及將共平面映射到XY平面上
我不認爲這樣做的數學太辛苦,但正在尋找使用three.js所做一個簡單的/有效的方法...
給定一組Vector3點,我需要測試它們在某個任意平面上是否共面。假設它們是共面的,那麼我需要將它們映射/投影到XY平面上,同時保持所有點之間的比例。Three.js--確定點是否共面以及將共平面映射到XY平面上
我不認爲這樣做的數學太辛苦,但正在尋找使用three.js所做一個簡單的/有效的方法...
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
函數。
謝謝。在我的情況下,我有任意數量的點來檢查,所以我不能直接使用你的解決方案,但我確定我可以適應它。它是否可能比我提出的在尋找最初的飛機和在隨後的點上使用'distanceTo'的評論中提出的方法更快? – jugglingcats
@jugglingcats我認爲這比你提出的方法更準確。看看'jsfiddle'的鏈接 - 有很多點的例子。 –
關於'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
測試一組點是否共面的一種方法是取前三個點並使用Plane.setFromCoPlanarPoints(p1,p2,p3)'來製作一個平面。然後爲後續點使用'Plane.distanceToPoint(p)'。這是做第一部分我想知道的有效方法嗎? – jugglingcats