代码之家  ›  专栏  ›  技术社区  ›  Hannes Ovrén

计算对象在3D场景中的可见程度,以便在游戏逻辑/AI中使用

  •  2
  • Hannes Ovrén  · 技术社区  · 17 年前

    我开始一个游戏项目,将允许字符隐藏在黑暗的地区。躲在黑暗的角落会让其他角色更难看到你。

    我需要的是一种计算角色所在位置的照明条件的方法。

    理想的情况是有一个

    double getLightFactor(GameCharacter observer, GameCharacter target)
    

    因为我认为可能有灯光照射的情况,所以目标的不同侧面被不同数量的灯光照射。 但我很乐意接受

    double getLightFactor(GameCharacter target)
    

    获取特定角色的灯光,无论您从何处观看,甚至

    double getLightFactor(int x, int z)
    

    该方法需要考虑到在游戏过程中照明条件可能会发生变化,但由于它是基于回合的,因此允许进行一些繁重的计算。我打算使使用手电筒成为可能,因此也需要考虑它们(但它们可以单独建模和处理)。

    我将使用Ogre3d来处理我的场景,但我很乐意接受通用解决方案,甚至是其他引擎的解决方案(我对引擎的选择不是一成不变的)。

    3 回复  |  直到 17 年前
        1
  •  3
  •   MartinStettner    17 年前

    我不知道Ogre3d引擎,但这应该是处理问题的一种相当通用的方法(毕竟它只是从不同的视点渲染场景…)

        2
  •  0
  •   Dietrich Epp    17 年前

    哦,孩子。这在很大程度上取决于发动机。我现在可以告诉你,你想要第二个选择。

    照明是如何工作的?它是动态的还是静态的?让我们假设这是两者的结合。

    对于静态照明,请检查附近的光照贴图。它要么是基于顶点的,要么是纹理,无论哪种方式,你都可以在附近的几个点对它进行采样并取平均值。查看引擎如何计算模型的照明,深入研究图形代码,并查看数据实际来自何处,您可以使用相同的源。有些游戏具有体积照明信息,Quake 2在BSP树中以每片叶子为基础进行此操作(易于检查),Quake 3具有体积纹理(也易于检查)。

    然后需要添加动态灯光。一种方法是从播放器向光源发射光线(可以肯定的是,从播放器的不同部分发射几条不同的光线)。数一数被击中的次数,根据光线的距离,在你的数字中为每一个增加一点。所有像样的游戏引擎都有一个“射出射线,看看它击中了什么”的程序,这是AI如何瞄准线,以及你如何计算子弹击中了什么以及当你撞到墙时会发生什么。不要射太多太远的光线,因为它可能会很慢。

    您不必太频繁地重新计算该值,您可以在创建新光源时以及每隔一秒左右进行计算。

        3
  •  0
  •   sean riley    17 年前

    根据环境的复杂性,您可以欺骗并使用覆盖在地形上的2D光照贴图。每个单元都有一个基于附近光源的光强度值。即使对于移动的物体,计算速度也会很快,而确定一个位置的“黑暗”也会很快。

    您可能必须使用简单的框或圆算法在其上“冲压”形状,具体取决于您拥有的灯光类型。

    推荐文章