[英]Assigning surfaces to zones based on the 3D regions they enclose
給定三維空間中的一組曲面,我試圖將每個曲面分配到一個區域,指向該組所包含的最小3D區域,如果不適用,則不分區。 我還想確定表面是否是兩個區域之間的接口。 因此,例如,如果我們有11個表示兩個立方體堆疊在一起的表面,則頂部立方體中的表面將位於相同的區域中,而底部的表面將位於不同的區域中(界面表面為在兩個區域)。
作為一個例子,我想在一組表面如此 ,並把它在給此 。 這里的每種顏色代表一個區域,灰色沒有區域關聯(如在底部的翻蓋中)。
我已經做了一些搜索,試圖找出是否有人已經提出了一個算法來做到這一點,但我沒有找到任何東西(大多數似乎識別區域而不是鏈接表面到他們所包圍的區域)。 因此,我試圖提出我自己的算法,並想知道是否有任何其他選擇或我的方法是否有效。
我假設所有表面都已連接。
我的想法如下:
這似乎適用於簡單的場景(例如,兩個立方體堆疊在一起),但我不確定是否有任何棘手的條件我需要注意,或者如果有兩個以上的區域它會崩潰分享一方。
對我的粗略算法/實施的替代想法的任何改進將不勝感激。 謝謝!
編輯:以下是一些回復一些評論的細節。 根據我的定義,區域只是一組完全綁定3D區域而沒有間隙的表面。 因此,如果我有兩個不接觸的立方體A和B,我將有兩個區域:一個由立方體A的所有表面組成,另一個由立方體B的所有表面組成。如果我有一個缺少的立方體一方面,沒有與這些表面相關的區域。
我的最終目標是在我正在創建的建模工具中創建一個自動化流程來對表面進行分組。 細節被分類,但基本上我正在處理模型,其中某些屬性僅在如上所述的相同“區域”中的表面之間是共同的。 我想創建一個自動化過程來創建這些區域,以便用戶可以立即將這些屬性應用於區域中的所有表面,而不是手動執行。
基本上問題歸結為找到完全由任意一組表面包圍的最小3D區域,並跟蹤哪些表面屬於哪些區域。 我希望這使我的問題更清楚。
那么,您感興趣的是從一組輸入多邊形中發現閉合曲面(體積)網格拓撲; 換句話說 - 多面體。 這幾乎適用於每個3D建模包。 我猜Blender有代碼可以做到這一點。 有不同的方法,但通常使用某種版本的半邊圖。 請參閱此處的wiki鏈接: 雙重鏈接半邊圖 。 想法是走你的輸入政策,並建立這些圖。 完成后,您可以輕松查詢每個圖形以查看是否存在孔(邊緣缺失等)。
我附上了一張圖片,解釋了如何使用半邊結構來獲得你想要的東西:假設給你一個五個長方形的湯(他們組成一個頂部的立方體。你處理你的第一個矩形說ABCD,這會創建你的第一個圖形,比如說G1。現在你處理第二個多邊形,比如FEHG,你還沒有看過這些頂點,所以你創建第二個圖形,G2。現在說你處理多邊形CDGH。你之前看過這些頂點,所以不是創建一個新圖,你合並(連接)共享這些節點的現有圖。繼續處理所有多邊形。你得到圖中的圖形。
現在,查詢圖表以獲取您的信息。 走完圖形后,您將看到正好有四個缺少邊的頂點(節點)。 這些頂點對應於框的缺失頂部(圖中邊緣為紅色)。 因此,您知道此圖不是封閉的流形。 如果你有另一個盒子,它沒有與這個盒子共享節點,你會有另一個圖表。 因此,處理完多邊形后,每個圖形都是一個“區域”。
請注意,如果您有兩個相交的形狀,您也可以使用這些圖形來跟蹤它們,但它更復雜。 基本上,當處理新的多邊形時,您不僅需要查看其任何頂點是否屬於已處理的圖形,還要查看此多邊形是否與先前處理的任何多邊形相交,如果是,則拆分此多邊形並將所有這些添加到相交圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.