簡體   English   中英

如何分區定向邊界框?

[英]How do I partition an oriented bounding box?

我正在編寫代碼,為2維的(不一定是凸的)多邊形構建一個定向邊界框(obb)樹。

到目前為止,我能夠通過找到它的凸包並在船體上使用旋轉卡尺來找到多邊形的面積最小的obb。

下圖就是一個例子。 帶有紅線和紅點的黃色填充多邊形描繪了原始多邊形。 凸殼顯示為藍色,黑色線條,obb顯示為紫色線條。

(編輯)根據要求: 交互式版本 - 僅在chrome中測試

現在我想擴展我的代碼來構建一個OBB樹,而不僅僅是一個OBB。 這意味着我必須剪切多邊形,並為多邊形的每一半計算新的OBB。

推薦的方法似乎是通過將OBB切成兩半來切割多邊形。 但是如果我通過其中任一軸的中間切割obb,看起來我必須在多邊形上創建新的頂點(否則如何找到該分區的凸包?)。

  1. 有沒有辦法避免像這樣添加頂點?
  2. 如果沒有,最簡單的方法是什么(關於實施難度)? 運行效率最高的方法是什么?

這是我們想要為以下項創建OBB樹的凹多邊形的示例:

為了將其拆分為一組新的凹面多邊形,我們可以通過在中間切割邊界框並根據需要添加新的“交叉點”頂點來簡單地剪切當前多邊形:

這可以在O(頂點)時間內完成,因為我們可以簡單地遍歷所有邊,並且如果邊穿過紅色分割線,則添加交叉點頂點。

然后可以根據這些交點頂點划分多邊形,以獲得一組新的較小(但仍可能是凹面)的多邊形。 將至少有兩個這樣的多邊形(紅線每邊一個),但可能還有更多。 在下一張圖片中,新的多邊形已經着色以強調:

遞歸地計算這些較小多邊形的定向邊界框給出了期望的結果。 例如,以下是遞歸深度2的框:

在此輸入圖像描述

希望這很明顯足以幫助那些與我一樣掙扎的人!

如果沒有進一步的背景,我不確定這是你需要的,但是這里......

將凹多邊形細分為一組凸多邊形

在上面的評論中,我建議遞歸細分凹多邊形,以便獲得一組凸多邊形。 一種(常見)方法如下:

  1. 如果多邊形是凸的,請停止。 (我想,將多邊形添加到數組中)
  2. 選擇多邊形的未標記邊。 標記邊緣。
  3. 在邊緣上分割多邊形(實際上:與邊緣重合的無限線)。
  4. 遞歸地為兩個結果多邊形重復此算法(如果非空)。

注意: 這正是BSP樹的構建方式。 除了上面的算法,我們不構建樹節點並在其中存儲多邊形。 也許只有BSP的解決方案也可以解決您的問題(而不是使用OBB)。

測試多邊形的凸度(步驟1)

對於每條邊,將每個頂點分類為在邊緣的前面或后面。 所有頂點都應位於邊緣之前或之前。 如果不是(邊緣后面至少有一個頂點),則多邊形是凹的。 有關“分類”部分的詳細信息,請參閱我對其他問題的回答,該問題也是如此。

其余的部分

獲得凸子多邊形列表后,就可以像在原始帖子中那樣為它們生成OBB。 你不會有OBB ......

通過細分,您添加頂點(問題中的一個問題)。 根據您的應用程序,您可能不需要使用細分的多邊形:如果您要使用BSP樹並且只需要簡單的碰撞,您只需遍歷樹並執行一些點/邊分類而不處理任何多邊形頂點。

無論如何,不​​確定要進一步推薦什么,因為我不知道您希望您的應用程序做什么,但希望這有一些幫助。

編輯:我剛剛意識到這可能是你想要做的:構建一個BSP樹並為每個節點生成OBB,從根節點到葉節點。 因此根節點OBB將包含整個凹多邊形,而葉節點僅包含凸子多邊形。 我記得原來的Doom引擎做了類似的事情(除了軸對齊的BB)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM