2017-01-13 142 views
1

我一直在研究體素類遊戲一段時間,它使用我寫的算法。但是,我仍然堅持碰撞檢測;因爲我不知道從哪裏開始。體素引擎並不是很複雜。體素世界中的碰撞檢測?

我只是真的需要計算高度圖的高度。

拿這張臉,例如:(請原諒我糟糕的形象)enter image description here

假設與多邊形我的立場是0.5,0.5(中心)。我現在如何計算y位置?

+0

也許我錯了,但沒有一個體素通常具有1個單位的邊長(例如像素),以便每個體素具有唯一的位置(x,y,z),其三維空間中具有相同唯一的座標。碰撞檢測應該「僅」需要檢查該位置是否已經包含體素。 –

+0

對不起,我應該已經更清楚了:我所指的體素並不是它在體素中渲染,而是所有東西都基於立方體(有點像我的世界做的那樣) – Anonymus

+1

你的形象是一個錯誤還是你真的Y = 0時有三個拐角,Y = 1時有一個拐角?如果是這樣,那不是一個體素,那是一個六面體。如果是這樣的話,在六面體中,通常對任何事物都使用三線性插值。搜索雙線性插值。也就是說,西蒙克拉默是絕對正確的,那不是一個好的碰撞檢測方案。操作太多。無論如何,你想使用類似碰撞盒這樣的東西來減少計算量。在開始時排除大部分碰撞。八叉樹結構不是一個壞主意。 – Aziuth

回答

3

感謝Ped7g,我們終於到達了作爲高度圖的實際問題。

首先我想說明的是,這與Voxels完全無關。你的引擎碰巧使用體素,但你的問題是無關的。 碰撞檢測也一樣。雖然它與你想要使用的東西有關,但你實際上已經省略了實際的問題。其次,像Ped7g這樣的三角形提出了一些工作,但我看到一個缺點,它將基本上產生一個由三角形組成的曲面。 對於示例和三角測量

___   
|\ |  
| \ |  
|__\| 

左下三角將平躺在地面上並且僅右上將有一個斜坡。 更復雜的三角形看起來會更好,但仍然由三角形表面組成,並且還要求您使用幾組重心座標。

在一個正方形內插的常用方法是Bilinear Interpolation,它有一個簡單的公式,每個角都影響每個點。

給定λx和λz爲0 ..1代表在角落單位平方(在x和z上)和高度y00,y01,y10和y11的相對位置,高度僅爲

y =(1-λx)(1-λz)y00 +(1-λx)(λz)y01 +(λx)(1-λz)y10 +(λx)(λz)y11

請注意,這將在邊緣創建線條。雙線性插值的優點是速度。缺點是在邊緣上,高度不會平穩,這是不可微分的。如果你想要的話,你需要更復雜的方法,在相鄰的方塊。 Ped7g提到了B-Splines,可以使用B-Splines曲面,但需要一段時間才能實現,而且速度都很快,不會向初學者推薦這些曲面(但如果您有興趣,請參閱第8章包含您需要的內容,但在此之前你最好閱讀其他章節)。一個好的中間地帶將是Bicubic Interpolation。該鏈接包含雙三次插值和雙線性插值的視覺比較。

雖然假設你是初學者,但我建議使用雙線性。

+0

謝謝!這個答案真的幫助了我!對不起,我對這個網站仍然很陌生,並不知道如何以一種好的方式來制定我的問題。 – Anonymus

1

在我看來,更像是來自該圖片的「身高地圖」,而不是體素。如果這是真的,只有一個角落是「1」,那麼你必須定義你將如何建模中間部分。

隨着銳邊三角測量可以用兩種變體結束:

___  ___ 
|\ |  | /| 
| \ |  |/| 
|__\| vs |/__| 

在整個中間邊緣是Y = 0的第一種情況下,這樣你的點在[0.5,0.5]是在Y = 0太,在第二種情況下,中間邊緣從0到1線性變化,在[0.5,0.5]處Y = 0.5。

或者你可以使用甚至一些更復雜的方式來定義特定[X,Y]高度內,像一些B樣條,加權平均等

但是如果你的地圖有足夠精細的分辨率,我會以另一種方式進行分割,體素之間的邊緣處於+ -0.5,+ -0.5,並且拾取在([0.5,0.5]之下的「體素」的高度位於4個體素的交叉點上,所以很難說哪個被挑選出來,但Y = 0或1)。

如果您需要比0/1更多的分辨率,您可以計算中間點Y作爲四個點的平均值,然後每個帶中點的邊形成一個三角形,您可以在沒有模糊的情況下計算[x,y] Y在你的情況中[0.5,0.5]正好在中點上,所以Y = 0.25((0 + 0 + 0 + 1)/ 4))。像這樣:

___ 
|\ /| 
| X | 
|/_\| 
+0

是的,圖片是一個高度圖。我應該澄清一點。對不起 – Anonymus

+1

@Anonymus那麼你不應該談論體素:體素是* volume *的有限元素,但高度圖不會定義多於或少於* surface *。用體素進行碰撞檢測總是等價於用邊界框進行碰撞檢測,不需要插值。 – cmaster

+0

@Anonymus:我想你正在做某種光線投射?將高度列渲染爲高立體像素?像老[DOS介紹「mars」](http://www.pouet.net/prod.php?which=4662)和類似的?或者,也許一些立方體推進算法爲每個柱子創建立方體,就像你提到的Minecraft一樣。所以這可能就是爲什麼你使用「體素」的原因......但這些解決方案通常會將各種各樣的東西混合在一起,無論哪個適合特定用途。只要你想要「表面碰撞」高程地圖數據應該足夠了,渲染是不同的東西。 – Ped7g