平均像素位置以找到表面法线.(2D)

本文关键字:2D 表面 像素 位置 | 更新日期: 2023-09-27 17:56:41

我正在XNA中开发一个需要一些物理效果的2D游戏。我发现像Farseer这样的物理引擎不会因为它们的某些工作方式而削减它。(这是一个很长的故事,涉及重写代码 3 次,最终弄清楚我需要自己编写物理。因此,根据我正在使用的参考材料,我现在唯一需要的数据是碰撞表面的法线。

这是使用精灵的每像素碰撞检测。我目前有一个所有重叠像素及其位置的数组。我想用这些数据来平均重叠像素的位置,以找出该表面的法线。这应该允许我与形状不规则的物体发生碰撞,但仍保留逼真的物理交互。

如果有人对我如何使用此像素信息来确定表面法线或足够接近的东西有建议,那就太好了。

谢谢。

平均像素位置以找到表面法线.(2D)

考虑存储精灵中每个点的法线(即在单独的纹理中),而不是尝试计算它们。通过这种方式,您将能够调整法线,使您的碰撞看起来"自然"(从游戏的某种意义上说,从物理角度来看不一定正确)。

[已编辑] - 我更喜欢阿列克谢的精灵法线想法,而不是我的表格驱动方法,但仍然会添加......

您可能只想考虑能够将 2D 几何体附加到每个精灵。它将使您能够进行真正的多边形碰撞。确定精灵碰撞时,请查看两个精灵的多边形,并对它们应用标准碰撞物理场。

这可能有效:找到两个最糟糕的像素(每个主体一个),并在它们之间应用一个临时弹簧以将它们分开。基本上,哪个像素组合具有最大的重叠(与分离相反),并施加与重叠量成比例的力。这将为您的系统增加能量,因此请考虑添加阻尼器(与相对速度成正比的力)。我经常使用的方程式是:

(reduced mass) = 1/( 1/(mass 1) + 1/(mass 2) )
(stiffness) = (reduced mass) * (response freq)^2
(damping) = (ratio)*(reduced mass) * (response freq)

我控制(response freq)(ratio)量以获得所需的效果。响应频率是您希望重叠自行校正的速度,"阻尼比"是一个正数,可以小于或大于一个,可以让您微调阻尼响应。