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

时间:2011-05-16 16:58:21

标签: c# xna physics sprite normals

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

这是使用精灵进行逐像素碰撞检测。 我目前有一个包含所有重叠像素及其位置的数组。我想用这些数据来估算重叠像素的位置平均值,以找出该表面的法线。这应该允许我与不规则形状的物体发生碰撞,但仍然保持真实的物理相互作用。

如果有人建议我如何使用这个像素信息来计算表面法线或足够接近的表面,那就太棒了。

感谢。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

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