簡體   English   中英

在3D中找到2個任意立方體的交集

[英]Finding the intersection of 2 arbitrary cubes in 3d

因此,我想找出一個函數,該函數可讓您確定任意旋轉和大小的兩個立方體是否相交。

如果立方體的旋轉不是任意的(而是鎖定在特定的軸上),則交點很簡單; 您可以通過檢查邊界以查看它們是否在所有三個維度上交叉或彼此相交,來檢查它們是否在所有三個維度上相交。 如果它們相交或僅在兩個內,則它們不相交。 此方法可用於確定任意多維數據集是否甚至是相交的候選對象,方法是使用它們的最高/最低x,y和z來創建外邊界。

那是第一步。 從理論上講,根據這些信息,我們可以知道它們彼此在哪個“邊”上,這意味着我們可以從交點中消除一些四邊形(邊)。 但是,我不能假定我們擁有該信息,因為立方體的旋轉可能使簡單確定變得困難。

我的想法是采用每對四邊形,找到它們的平面的交點,然后確定該線是否與每對邊中的至少一個邊相交。 如果任一對邊的相交線與它們的任意一條邊相交,則四邊形相交。 如果沒有相交,則兩個立方體不相交。

然后,我們可以通過平面相交線與其邊緣相交的位置來確定第二個立方體上相交的深度。

但是,這僅僅是推測性的。 有沒有更好,更有效的方法來確定這兩個立方體的交點? 我可以想到許多不同的方法來執行此操作,而且我還可以說,就所需的計算量而言,它們可能有很大不同。

目前,我正在使用Java,但是C / C ++解決方案也很酷(我可以移植它們)。 甚至是偽代碼,因為這可能是個大問題。

您應該看一下計算機圖形學領域。 他們有很多手段。 例如, Weiler–Atherton裁剪算法 還有許多數據結構可以為您簡化流程。 提到AABB( 軸對齊的邊界框 )。

要在三個維度上找到兩個任意立方體的相交(接觸)點,必須分兩個階段進行:

  1. 檢測碰撞。 這本身通常是兩個階段,但為簡單起見,我們將其稱為“沖突檢測”。

該算法可以是SAT(分離軸定理),也可以是多面體擴展/縮小的某種變體。 再次,為簡單起見,讓我們假設您將使用SAT。

我不會詳細解釋,因為其他人已經做了很多次,而且比我能做的更好。 在“帶回家”從這個,是碰撞檢測的目的不是告訴你在哪里碰撞已經發生; 只是它已經發生了。

  1. 在檢測到交叉點時,您需要計算接觸點。 這是通過多邊形裁剪算法完成的。 在這種情況下,讓我們使用https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm

這樣做有更好的方法,但是SAT在3d中很容易掌握,SH裁剪也很容易引起您的注意,因此這對您來說是一個很好的起點。

嘗試使用分離軸定理。 它應像在2d中一樣在3d中應用。

如果從多維數據集的側面創建多邊形,則另一種方法是在其上使用構造空間幾何(CSG)操作。 通過為每個多維數據集構建一個二進制空間分區(BSP)樹,您可以對它們執行交集。 相交的結果是一組代表相交的多邊形。 在您的情況下,如果多邊形的數量為零,則立方體不相交。

我要補充一點,這種方法可能不是一個好的實時解決方案,但是您沒有指出是否需要在幀刷新時間內進行。

由於移植是一個選項,因此您可以查看位於CSG的Javascript庫

http://evanw.github.io/csg.js/docs/

我已將此庫移植到C#

https://github.com/johnmott59/CGSinCSharp

暫無
暫無

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

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