【问题标题】:averaging pixel locations to find a surface normal. (2D)平均像素位置以找到表面法线。 (2D)
【发布时间】:2011-05-16 16:58:20
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

    标签: c# xna physics sprite normals


    【解决方案1】:

    考虑为精灵中的每个点存储法线(即在单独的纹理中),而不是尝试计算它们。这样你就可以调整法线,让你的碰撞看起来“自然”(从你的游戏的意义上说,从物理学的角度来看,不一定是正确的)。

    【讨论】:

    • 你的建议很有趣。但是,您能否解释一下如何将法线存储在纹理中并从纹理中访问它们?我不清楚这个细节。
    • 正常是​​ 1 或 2(在 2D 空间中)或 2/3 浮点数。因此它可以很容易地存储在纹理中(请参阅msdn.microsoft.com/en-us/library/… 了解可能的纹理格式)。搜索“法线映射”示例以查看其常用方法(即create.msdn.com/en-US/education/catalog/sample/normal_mapping)。像素着色器可以同时访问多个纹理,因此合并来自多个纹理的数据相当容易。
    【解决方案2】:

    [已编辑] - 我更喜欢 Alexei 的 sprite normals 想法,而不是我的表格驱动方法,但仍然会添加...

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-06-27
        • 2015-03-23
        • 1970-01-01
        • 2011-01-06
        • 1970-01-01
        • 2013-11-09
        • 1970-01-01
        • 2017-09-01
        • 2016-05-02
        相关资源
        最近更新 更多