体素世界中的碰撞检测?

时间:2017-01-13 09:07:11

标签: c++ collision

我一直在研究体素游戏一段时间,它正在使用我编写的算法。但是,我仍然坚持碰撞检测;因为我真的不知道从哪里开始。体素引擎并不是很复杂。

我只需要计算高度图的高度。

以这张脸为例:(请原谅我可怕的形象)enter image description here

假设我相对于多边形的位置是0.5,0.5(中心)。我如何计算此时的y位置?

2 个答案:

答案 0 :(得分:3)

感谢Ped7g,我们终于得出了一个高度图的实际问题。

首先,我想指出这与Voxels完全无关。您的引擎恰好使用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曲面,但需要一段时间才能实现,除了快速之外,不会向初学者推荐(但如果你感兴趣,click on this link。第8章包含了什么你需要,但在那之前你最好阅读其他章节。一个良好的中间地带是Bicubic Interpolation。该链接包含双三次和双线性插值的视觉比较。

假设你是初学者,我建议使用双线性。

答案 1 :(得分: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 |
|/_\|
相关问题