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

计算对象在3D场景中的可见程度,以便在游戏逻辑/AI中使用,3d,visibility,shadow,ogre3d,light,3d,Visibility,Shadow,Ogre3d,Light,我开始一个游戏项目,将允许字符隐藏在黑暗的地区。躲在黑暗的角落会让其他角色更难看到你 我需要的是一种计算角色所在位置的照明条件的方法 理想的情况是有一个 double getLightFactor(GameCharacter observer, GameCharacter target) 因为我认为可能有灯光照射的情况,所以目标的不同侧面被不同数量的灯光照射。 但我很乐意接受 double getLightFactor(GameCharacter target) 获取特定角色的灯光,无论您从

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

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

理想的情况是有一个

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

double getLightFactor(GameCharacter target)
获取特定角色的灯光,无论您从何处观看,甚至

double getLightFactor(int x, int z)
仅获取地形中特定地图点处的灯光

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

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


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

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


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

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

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

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

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


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

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


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

我喜欢这个答案。主要是因为我也这么想;)如果目标隐藏在阴影中,只需不渲染目标,任何观察者都无法在屏幕上看到它。这个PROB需要一些修改,因为你的PRB希望目标是20%可见的。我喜欢这个想法,并会考虑它。但我不确定它是否足够快。