2013-07-27 50 views
1

我有一個僞隨機生成的地形(它由三角形組成)的3D環境。我想簡單地檢測如果3D邊界框和其中一個地形三角形相撞;我怎樣才能做到這一點?我讀了this這個問題與我想要的幾乎完全一致,但答案並不令人滿意,因爲它基本上只提供了AABB算法......簡單的3D框到多邊形的碰撞

PS:三角形用3個3D點定義,邊界框可以由其8個頂點定義。

+2

你能否更全面地解釋爲什麼這不令人滿意?很明顯,提問者和我們無法知道爲什麼不對你。 – mydogisbox

+0

從答案:「下面的方法...將接受一個BoundingBox對象,並確定它是否在BoundingBox的當前實例內......這裏是檢測一個盒子是否在另一個盒子內的方法,如果所以,修改盒子將它移到外面。「我不明白回答者是如何回答這個問題的;在我看來,他們提供了一種檢測AABB-AABB碰撞和反應的方法(不涉及三角形)。如果我的理解錯誤,請告訴我! – Jwosty

回答

1

要在盒子和隨機形狀之間進行碰撞檢測(假設只有直邊),請確定盒子中是否包含任何形狀的點。基本上是這樣的(僞代碼):

let objectsCollide boundingBox shape 
    shape.vertexes 
    |> Seq.forall (fun v -> boundingBox <|> vertex 
    |> not 

let (<|>) a b = 
    let vertex = a.vertexes[0] 
    vertex.neighbors 
    |> Seq.forall (fun neighbor ->if b is between v and neighbor 
             return false 
            else 
             true 
    |> not 

有用於各種相交問題here(在C++)的實施方式。您想要使用的將是三角形與線段的交集,您需要爲邊界框中的每個線段(框中的所有矢量組合)重複該三角形。

+0

想到這一點,但它不會涵蓋所有的情況(三角形可能是在盒子的一個角落上的臉「串」)。雖然,我現在要使用的算法是這樣的一個擴展:它將使每個頂點的平均值在三角形的邊上再增加3個點,然後取這些點的平均值以獲得3點實際面部,並使用AABB碰撞測試對這9個點進行測試。應該現在工作,但我認爲這將是一個顛簸的方塊...... – Jwosty

+0

有一個在C++中的實現在這裏:http://www.geometrictools.com/LibMathematics/Intersection/Intersection.html我會將其張貼在答案中,但時間很長。 – mydogisbox

+0

我確實更新了我的答案,更多地介紹了爲了適應您的問題而需要做的事情。 – mydogisbox