当前位置:  开发笔记 > 编程语言 > 正文

有人可以解释每像素碰撞检测吗?

如何解决《有人可以解释每像素碰撞检测吗?》经验,为你挑选了2个好方法。

有人可以解释它的优点和缺点以及与之相关的任何数学吗?



1> Peter Parker..:

对于2D:您不需要任何数学解决此问题,您只需要一个自定义bitblit例程.通过将碰撞掩模绘制到此曲面上并检查是否要绘制的像素(像素!= 0),您可以将碰撞候选者插入隐藏曲面.那你就会发生碰撞.当然,如果发生碰撞,您应该通过边界矩形预先检查.

对于3D:你需要数学(很多)!

基本上你会检查你的演员的每个表面对抗敌人的每个表面.这将通过计算平面光线交点来完成.这里有很多可能的优化,但它取决于你的3d表示.这也不是Per-Pixel-Collision,而是Per-Vertex-Collision



2> 小智..:

我将首先回答每像素碰撞检测的优缺点,然后再考虑数学方面.

每像素碰撞检测,也称为像素完美碰撞检测,并且可能更精确地基于图像的碰撞检测,是在表示为图像的碰撞对象之间发现碰撞.这种空间方法与更多几何方法形成对比,其中多边形和其他几何形状用于表示碰撞对象.

对于2D,通常有3种不同的选择:

基于图像的

简单的几何形状(轴对齐的边界框,圆圈)

复杂的几何形状(凸多边形,褶皱多边形,椭圆等)

基于图像的碰撞检测精确且易于使用和理解.关于使用图像进行绘制的游戏,使用基于图像的碰撞检测意味着每当屏幕上的精灵重叠时,它们也在碰撞检测系统中重叠.它们对于需要可变形碰撞对象的游戏也很有用,例如对于可破坏地形的游戏,例如Worms 2D,因为通常很少涉及预计算.它们的主要缺点是与其他方法相比效率非常低,尤其是在旋转和缩放碰撞对象时.

简单的几何形状既简单易用又高效.如果不需要高精度,或者碰撞对象与简单的几何形状很好地配合(例如,如果你的碰撞物体是球,圆圈是完美的,有时甚至比图像更好).它们的主要缺点是精度.对于基本形状不适合的高精度,您必须将简单形状组合成更复杂的形状,或者必须使用更通用和复杂的形状.无论哪种情况,您最终都会进入第三种方法.

复杂的几何形状可以在某种程度上精确且相对有效或低效,这取决于用于表示碰撞对象的所使用形状的复杂性.一个重要的缺点是易于使用.当碰撞对象不适合可用的几何形状时,精度将不得不受到影响,或者必须使用多个可能不同的形状来表示它,这需要时间.此外,某些形状很复杂且不易创建,除非您可以自动从图像生成它们.一个重要的优点是旋转和缩放通常是有效且容易的,特别是与基于图像的碰撞检测相比.

基于图像的碰撞检测通常被视为一种不好的解决方案,因为它通常效率低下,尤其是在使用旋转和缩放时.但是,由于它非常灵活,精确且易于使用,因此我决定实施一个旨在解决效率问题的库.结果是PoxelColl,它使用自动预先计算的凸包来加速基于图像的碰撞检测.这提供了易用性,灵活性,精确性和效率,并支持旋转和缩放.主要的缺点是,与纯几何解决方案相比,它在所有情况下都不是有效的,并且它需要使用预计算,这意味着它对于可变形碰撞对象来说效率不是很低.

对于3D,选项和优势有些类似:

基于容量

简单的几何形状(轴对齐的边界框,圆圈)

复杂的几何形状(凸多边形,褶皱多边形,椭圆等)

值得注意的是,彼得帕克对3D的回答是错误的; 2D中的像素(图像元素)对应于3D中的体素(体积元素).

一些重要的区别是3D的空间方法比2D的空间方法要少得多.一个可能的原因是,由于3D增加了额外的维度,空间解决方案变得效率更低,而简单的几何解决方案仍然有效.在游戏中,碰撞检测通常是在线操作,需要一定程度的效率,使效率变得重要.因此,在非游戏应用程序中更常使用卷,其中不需要在线确定冲突.

有关基于体积的碰撞检测的碰撞检测示例,请参阅例如可变形对象的体积碰撞检测,其中使用体积而不是几何形状意味着它们可以处理具有任意形状的闭合曲面的可变形碰撞对象.

至于第二个问题,基于图像的碰撞所涉及的数学范围可以从简单到复杂.简单的情况基本上是使用轴对齐的边界框来查找图像,找到它们的交点,然后只检查交叉点中的图像.更复杂的解决方案包括我之前提到的库,其中需要凸多边形交叉.对于3D案例,解决方案从简单到非常复杂.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有