Three-mesh-bvh shapecast函式

更新 發佈閱讀 6 分鐘

前情提要

Three-mesh-bvh套件加速搜尋原理簡介這篇文章介紹Three-mesh-bvh套件加速搜尋的原理,且該文提到判斷兩個模型是否相交的功能,只需簡單呼叫Three-mesh-bvh套件提供的函式即可實現。

利用shapecast函式參與過濾的過程

raw-image


shapecast讓我們能參與加速搜尋的過程,如果有更進階的需求,例如想找出所有相交的點,可以通過shapecast函式實作。

附上Demo鏈接:Three-mesh-bvh shapecast demo




// 一些參數、函式資訊資訊不完整,完整版可參考上方Demo鏈接

// 準備參數
const tempPoint = new THREE.Vector3();
const { frogMesh, staticMesh } = Editor;
const frogGeometry = frogMesh.geometry;
const frogIndexAttr = frogGeometry.index;
const staticGeometry = staticMesh.geometry;
const staticGeometryRelativeMatrix = staticMesh.matrix.clone().multiply(frogMesh.matrix.clone().invert());
const staticMeshRelativeBox = staticGeometry.boundingBox.clone().applyMatrix4(staticGeometryRelativeMatrix);

// 利用shapecast,找出frogMesh與staticMesh所有相交的點
const intersectPointSet = new Set();
frogGeometry.boundsTree.shapecast({
  // 持續細分有相交的包圍框
  intersectsBounds: (box) => {
    if (!box.intersectsBox(staticMeshRelativeBox)) return NOT_INTERSECTED;
    return INTERSECTED;
  },
  // 分別判斷三角形三個點是否在staticMesh內,是就收集到intersectPointSet內
  intersectsTriangle: (triangle, triIndex) => {
    if (!triangle.intersectsBox(staticMeshRelativeBox)) return false;
    if (checkIfMeshIncludePoint(staticMesh, tempPoint.copy(triangle.a).applyMatrix4(frogMesh.matrix)))
      intersectPointSet.add(frogIndexAttr.getX(triIndex * 3));
    if (checkIfMeshIncludePoint(staticMesh, tempPoint.copy(triangle.b).applyMatrix4(frogMesh.matrix)))
      intersectPointSet.add(frogIndexAttr.getX(triIndex * 3 + 1));
    if (checkIfMeshIncludePoint(staticMesh, tempPoint.copy(triangle.c).applyMatrix4(frogMesh.matrix)))
      intersectPointSet.add(frogIndexAttr.getX(triIndex * 3 + 2));
  },
});

intersectsBounds方法可以遍歷bvh逐漸細分的包圍框

  1. 回傳NOT_INTERSECTED,則不會繼續細分這個包圍框。
  2. 回傳INTERSECTED,則繼續細分該包圍框。
  3. 回傳CONTAINED,則只細分該包圍框,其他的就不管了。
    1. 如果只想簡單判斷某個點與模型是否相交,可以使用CONTAINED繼續細分這個包圍框。
    2. 如果你想收集兩個模型相交的所有三角形,這個就不適合,因為可能其他包圍框也有相交。

intersectsRange方法,在遍歷到最小包圍框後,會遍歷裡面的一組三角形

  1. 回傳true代表這組三角形符合條件,結束shapecast函式。
  2. 如果想收集三角形,可以不傳入該函式,直接到下一步intersectsTriangle遍歷所有三角形。

intersectsTriangle方法遍歷子包圍框內所有三角形

  1. 回傳true代表這個三角形符合條件,結束shapecast函式。
  2. 如果想收集三角形就回傳false,在此收集符合條件的三角形
留言
avatar-img
s_SoNg的沙龍
4會員
12內容數
s_SoNg的沙龍的其他內容
2025/04/28
在工作上遇到nodejs呼叫執行檔執行失敗問題,最後發現是由於nodejs專案本身有用nssm包成服務,在服務環境的nodejs呼叫的執行檔也執行在服務中,造成程式不會跳出視窗而導致失敗。
Thumbnail
2025/04/28
在工作上遇到nodejs呼叫執行檔執行失敗問題,最後發現是由於nodejs專案本身有用nssm包成服務,在服務環境的nodejs呼叫的執行檔也執行在服務中,造成程式不會跳出視窗而導致失敗。
Thumbnail
2025/04/08
準備專案 這邊首先準備一個新的專案,可以參考react官網,完成後參考README.md輸入npm run dev就可以啟動並在瀏覽器看到畫面 準備nssm工具 在google上搜nssm,第一個項目點進去後,找到並下載穩定版,附上下載鏈接 壓縮檔下載完畢後,解壓縮到喜歡的地方,然後進入資料
Thumbnail
2025/04/08
準備專案 這邊首先準備一個新的專案,可以參考react官網,完成後參考README.md輸入npm run dev就可以啟動並在瀏覽器看到畫面 準備nssm工具 在google上搜nssm,第一個項目點進去後,找到並下載穩定版,附上下載鏈接 壓縮檔下載完畢後,解壓縮到喜歡的地方,然後進入資料
Thumbnail
2024/10/30
如果有個算法是2秒以上很耗時的長任務,希望在執行長任務前後修改state渲染loading畫面,可能會難以達到預期效果,會看到loading畫面一閃而過。 把setState改非同步的方法...
2024/10/30
如果有個算法是2秒以上很耗時的長任務,希望在執行長任務前後修改state渲染loading畫面,可能會難以達到預期效果,會看到loading畫面一閃而過。 把setState改非同步的方法...
看更多
你可能也想看
Thumbnail
創作不只是個人戰,在 vocus ,也可以是一場集體冒險、組隊升級。最具代表性的創作者社群「vocus 野格團」,現在有了更強大的新夥伴加入!除了大家熟悉的「官方主題沙龍」,這次我們徵召了 8 位領域各異的「個人主題專家」,將再度嘗試創作的各種可能,和格友們激發出更多未知的火花。
Thumbnail
創作不只是個人戰,在 vocus ,也可以是一場集體冒險、組隊升級。最具代表性的創作者社群「vocus 野格團」,現在有了更強大的新夥伴加入!除了大家熟悉的「官方主題沙龍」,這次我們徵召了 8 位領域各異的「個人主題專家」,將再度嘗試創作的各種可能,和格友們激發出更多未知的火花。
Thumbnail
vocus 最具指標性的創作者社群──「野格團」, 2026 年春季,這支充滿專業、熱情的團隊再次擴編,迎來了 8 位實力堅強的「個人主題專家」新成員 💫💫💫 從投資理財、自我成長、閱讀書評到電影戲劇,他們各自帶著獨特的「創作超能力」準備在格友大廳與大家見面。
Thumbnail
vocus 最具指標性的創作者社群──「野格團」, 2026 年春季,這支充滿專業、熱情的團隊再次擴編,迎來了 8 位實力堅強的「個人主題專家」新成員 💫💫💫 從投資理財、自我成長、閱讀書評到電影戲劇,他們各自帶著獨特的「創作超能力」準備在格友大廳與大家見面。
Thumbnail
本期將針對霍爾感測器(Hall Sensor)於馬達中的運作規律,進行說明及解析。係因在我們存在的物理世界當中,事物往往具有各自的脈絡與法則,若能用心體會了解之後妥善運用,皆可進一步的推動科技發展。 由上一期中,理解了霍爾感測器的安裝規則後,再將其對應到馬達旋轉狀態,可以察覺到霍爾訊號變化具備了固
Thumbnail
本期將針對霍爾感測器(Hall Sensor)於馬達中的運作規律,進行說明及解析。係因在我們存在的物理世界當中,事物往往具有各自的脈絡與法則,若能用心體會了解之後妥善運用,皆可進一步的推動科技發展。 由上一期中,理解了霍爾感測器的安裝規則後,再將其對應到馬達旋轉狀態,可以察覺到霍爾訊號變化具備了固
Thumbnail
上篇提到Hall Sensor的基本擺放位置,本篇就來討論其對應馬達驅動的邏輯脈絡,以及擺放角度變化的可能性。 首先得要核對馬達驅動時的變化種類,了解使用需求後,才能定位Hall Sensor所扮演的角色及功用。以目前主流的三相馬達而言,送電模式共有下述六種;這就代表Hall Sensor只要能提
Thumbnail
上篇提到Hall Sensor的基本擺放位置,本篇就來討論其對應馬達驅動的邏輯脈絡,以及擺放角度變化的可能性。 首先得要核對馬達驅動時的變化種類,了解使用需求後,才能定位Hall Sensor所扮演的角色及功用。以目前主流的三相馬達而言,送電模式共有下述六種;這就代表Hall Sensor只要能提
Thumbnail
這篇文章,會帶著大家複習以前學過的BFS框架, 並且以圖論的應用題與概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 BFS 框架 + 演算法 虛擬碼 # Queue 通常初始化成根結點,作為起點 BFS_queue = deque([root])​ # 先
Thumbnail
這篇文章,會帶著大家複習以前學過的BFS框架, 並且以圖論的應用題與概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 BFS 框架 + 演算法 虛擬碼 # Queue 通常初始化成根結點,作為起點 BFS_queue = deque([root])​ # 先
Thumbnail
[機器學習][監督式][資料分群] 支持向量機 (Support Vector Machine, SVM)
Thumbnail
[機器學習][監督式][資料分群] 支持向量機 (Support Vector Machine, SVM)
Thumbnail
Multi-level meshing 在Icepak當中扮演的是捕捉幾何輪廓的功能,一般來說如果幾何形狀不複雜,就是些圓形和方形的原件,啟用後也沒有變化是有可能的。 因為幾何太簡單,並沒有用到Curvature function 或是 Proximity function.
Thumbnail
Multi-level meshing 在Icepak當中扮演的是捕捉幾何輪廓的功能,一般來說如果幾何形狀不複雜,就是些圓形和方形的原件,啟用後也沒有變化是有可能的。 因為幾何太簡單,並沒有用到Curvature function 或是 Proximity function.
Thumbnail
建模 (Modeling) 畫細不難,難在用最經濟的方式達成 "雖不中亦不遠矣"。 網格 (Meshing) 任憑你列式再怎麼漂亮,解不出來就是白搭。 求解 (iterating) 能收斂都好說,不能收斂就是痛苦的開始
Thumbnail
建模 (Modeling) 畫細不難,難在用最經濟的方式達成 "雖不中亦不遠矣"。 網格 (Meshing) 任憑你列式再怎麼漂亮,解不出來就是白搭。 求解 (iterating) 能收斂都好說,不能收斂就是痛苦的開始
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News