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
留言分享你的想法!
avatar-img
s_SoNg的沙龍
4會員
11內容數
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
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
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
將單位脈衝(Unit Impulse)輸入系統時,其響應即是此系統的特性函數 h(t), 此h(t)稱為脈衝響應。 ●時域的脈衝響應為Convolution 函數式 ●頻域的脈衝響應為乘積函數式:
Thumbnail
將單位脈衝(Unit Impulse)輸入系統時,其響應即是此系統的特性函數 h(t), 此h(t)稱為脈衝響應。 ●時域的脈衝響應為Convolution 函數式 ●頻域的脈衝響應為乘積函數式:
Thumbnail
續傳遞函數離散化的核心環節,就是將控制器的s轉移函數(s-TF)轉換為z轉移 函數(z-TF)。 一般情況下,由連續到離散的設計最好多實驗幾種方法(通過模擬,得出滿意的 結果)。 用於PID連續系統映射轉換成PID離散系統的方塊圖如下: ■離散化演算法摘要 ■離散化演算法比較 ■MATLAB 指令說
Thumbnail
續傳遞函數離散化的核心環節,就是將控制器的s轉移函數(s-TF)轉換為z轉移 函數(z-TF)。 一般情況下,由連續到離散的設計最好多實驗幾種方法(通過模擬,得出滿意的 結果)。 用於PID連續系統映射轉換成PID離散系統的方塊圖如下: ■離散化演算法摘要 ■離散化演算法比較 ■MATLAB 指令說
Thumbnail
Multi-level meshing 在Icepak當中扮演的是捕捉幾何輪廓的功能,一般來說如果幾何形狀不複雜,就是些圓形和方形的原件,啟用後也沒有變化是有可能的。 因為幾何太簡單,並沒有用到Curvature function 或是 Proximity function.
Thumbnail
Multi-level meshing 在Icepak當中扮演的是捕捉幾何輪廓的功能,一般來說如果幾何形狀不複雜,就是些圓形和方形的原件,啟用後也沒有變化是有可能的。 因為幾何太簡單,並沒有用到Curvature function 或是 Proximity function.
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News