可破坏的环境

我现在有自己的游戏引擎,现在渲染和animation,MD2 MD3和MD5模型。 我觉得我只是开始习惯于opengl。

我目前正在编写渲染Quake 3地图的代码,但是,我很想知道红色派系游戏是如何允许破坏性环境的。 不太确定,从哪里开始。 如果我渲染地图,我必须把地图变成构成组件,通过物理引擎控制地图中的每一块砖块,或者有人可以告诉我,我应该看或读的地方会很棒。 谢谢。

    这是一个复杂的高级主题,但幸运的是有一些资源如何实现。 我不能用直的arm说哪一个是最好的。 我最好的建议是阅读一些关于它的文章,然后尝试一些东西,看看它是否有效,如果你可以得到一个可管理的状态。

    关于如何做这件事的最好的想法是让一个几何着色器分裂一个特定的网格物体,并在它被销毁之后重新定位它。 这当然会带来不好的内存消耗,因为您可能需要一个原始网格的副本,然后每个被破坏的对象需要一个副本。 但总有一些东西需要改进。

    这里有很好的链接:
    DICE这基本上是我的想法也是如此。 DICE销毁
    在白皮书上阅读好: 白皮书

    一般来说,在游戏和模拟中有很多种方法。 没有一种技术会是最好的,因为他们都有自己的位置。

    一般而言,可破坏的材料随着柔体模拟的课题而变化。

    我会从这里假设你有一些forms的刚体物理引擎可以检测碰撞和解决力量。

    预先计算的骨折

    在运行游戏之前,先把网格分成好的部分。 将它们与物理引擎中的关节连接,并根据用于断裂对象的项目dynamic分割这些关节。

    直到必须使用join的网格。 使用未断裂的版本,直到它受到一定的冲击/武器,然后快速交换模型,打破关节,让物理引擎接管。

    这可以让你很好地控制什么可以中断,以及如何中断。 真正的dynamic压裂可能会导致意想不到的结果,并在某些情况下阻止游戏继续。 试想一下,如果一个支柱只能打破足够的阻挡出口,玩家没有更多的火箭。

    为了给它dynamic的外观,只需使用混合包的变种。 物理引擎将会使得棋子很好的移动到基于冲击点和使用的武器上。

    物质点法

    你可以用粒子云填充你的物体,然后根据这些粒子如何在内部移动来增加网格。 这通常用于柔软的身体或stream体模拟,并允许事物弯曲,凹陷,熔化等。

    颗粒应粘合在一起,并在适当的情况下,这些债券应该被打破。 当他们是网状应该分裂这些债券之间。

    事物破坏的方式可以通过粒子间使用的键来定义。 更坚硬的材料,如金属可以有更强大的联系。 另外,您可以对同一个对象使用不同的债券定义,以便根据应该制作的材料对其进行不同的操作。

    这是一种全面的技术,但对于有机材料等天然柔软的东西尤其有益。 主要的问题是它增加了解决所有这些粒子的计算量。

    维诺

    Voronoi压裂可能是我最喜欢的一个。 这只是一种以有趣的方式分割网格的技术。

    它看起来很好的结构环境,似乎相当简单。 这种技术将有助于定义单独的骨折线,新的多晶硅应该被添加到网格中。

    在链接中的例子的优点是分解成凸形状。 一些物理系统需要凸形状,尤其是那些基于轴定理分离的物理系统。

    有限元法

    有限元基本上是把问题分解成小块。 通过这种方式,上面的粒子方法属于这一类,被认为是一种“基于有限元的粒子方法”。

    通常在FEM中,对象用简化的三角形网格框表示,用作主要对象网格的变形器。 三角形是以相当独特的方式处理的,以确定在对三角形赋予力之前,力如何作用于三角形上。

    这里的一个难点是如何描述每个三角形中使用的材料。 这将决定三角形如何响应各种力量/效果,并可以使模拟看起来真实和看起来可怕的区别。

    这种方法,你会发现在所有的地方,并用于高度详细的建模复杂的模拟在工程中使用。 一个常见的例子就是建模撞击如何影响汽车及其内部的车辆,因此,在通过碰撞testing进行工作原型之前,可以对各种devise进行testing。

    这主要是一种将问题分解成可管理的组合的技术,可以扩展以模拟许多物理现象,如传热或stream体运动。 你应该可以在这个地方find许多文章,也可能是代码示例,但是这里是一个开始的地方。

    结论

    这是一个巨大的话题,在select你喜欢的方法之前,需要大量的研究。 我的主要建议是记住我们正在制作游戏,而不是模拟软件,所以最终使用哪种方法,确保它看起来不错,播放良好,保持稳定/无bug,最重要的是,真的很好玩。

    我正在做类似的事情。

    我到现在为止所做的就是拥有

    • 一个程序化的地形
    • 一个能满足我需要的世界结构(一个三维matrix或一个八叉树)
    • 函数来修改基础结构(即dig()函数,例如从世界结构中去除一定量的细胞)

    如果你从来没有处理地形的程序生成,你应该确实读一些arcticle,因为它是一个非常广泛的主题。 您应该根据您的性能/精度/速度/等的需要selectalgorithm。 基本上你必须select一个伪随机生成的结构,然后另一个渲染它的algorithm。

    我会把你发现的一些有趣的东西和你联系起来,这些东西可以帮助你,因为我有更多的时间重新安排事情。 你可以开始阅读一些更通用的地形程序化语言。 然后,我将链接关于伪随机生成的Perlin/Simplex noysealgorithm和Marching CubesMarching Tetrahedraalgorithm进行渲染的文档(您可以自己开始查看)

    尝试阅读关于单纯的噪音

    尝试一下关于Marching Cubes