【问题标题】:Calculating how visible an object is in a 3D-scene for use in game logic/AI计算对象在 3D 场景中的可见度以用于游戏逻辑/AI
【发布时间】:2010-10-29 19:31:29
【问题描述】:

我正在启动一个允许角色隐藏在黑暗区域的游戏项目。躲在黑暗的角落应该会让其他角色更难看到你。

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

理想的情况是拥有一个

double getLightFactor(GameCharacter observer, GameCharacter target)

因为我认为可能存在光线落下的照明条件,因此目标的不同侧面会受到不同数量的光线照射。 但我很乐意接受

double getLightFactor(GameCharacter target)

无论您在哪里观看,甚至可以为特定角色获取光线

double getLightFactor(int x, int z)

只在地形中的特定地图点获取光线。

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

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

非常欢迎提出想法、论文或任何相关的东西!

【问题讨论】:

    标签: 3d visibility shadow ogre3d light


    【解决方案1】:

    考虑到当前的灯光设置,您可以只从观察者的角度将场景渲染到屏幕外缓冲区(即使分辨率相当低)。然后您可以计算目标字符中间的平均亮度值。

    我不了解 Ogre3d 引擎,但这应该是处理您的问题的一种相当通用的方法(毕竟它只是从不同的角度渲染场景......)

    【讨论】:

    • 我喜欢这个答案。主要是因为我也是这么想的;)如果目标隐藏在阴影中,请不要渲染目标,并且没有观察者可以在他们的屏幕上看到它。这个概率需要一些修改,因为你可能希望目标是 20% 可见等。
    • 我喜欢这个想法,并且会考虑它。但不确定它是否足够快。
    【解决方案2】:

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

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

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

    然后您需要添加动态灯光。您可以做到这一点的一种方法是向光源发射来自玩家的光线(可以肯定的是,来自玩家不同部位的几条不同的光线)。数一数被击中的数量,并根据光线的距离为每个数量添加一点点。所有体面的游戏引擎都有一个“发射射线并看到它击中什么”的程序,这是人工智能如何进行视线以及如何确定子弹击中了什么以及当你撞到墙上时会发生什么。不要将太多光线射得太远,因为它可能会很慢。

    您不必过于频繁地重新计算此值,您可以在创建新光源时重新计算,然后每隔一秒左右重新计算一次。

    【讨论】:

      【解决方案3】:

      根据环境的复杂性,您可以作弊并使用叠加在地形上的 2D 光照贴图。每个单元格将具有基于附近光源的光强度值。即使是移动的物体也可以快速计算,并且可以快速访问以确定位置的“暗度”。

      您可能需要使用简单的方框或圆形算法在其上“标记”形状,具体取决于您拥有的灯光类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多