Articles of 视线

如何基于角色视线网格和着色器创建一场雾战?

我有一个使用透视图的3D游戏,通过光线投射,我创建了一个代表角色视线的网格。 我正在寻找一种让这个网格外面的整个区域“变暗”的方法(比如老派的战争迷雾 – 未探测到的=黑色的,探索的,但是没有看到=变暗的),最好使用着色器? 在场景之上的黑色网格与透视摄像机+网格不一样,因为它们是基于相机而不是单元创建的。 (即,我希望着色器在人物视线上行事,而不是像摄像机看到的角色视线 – 否则单位可以看到墙后)。 任何人有任何关于如何实现这一目标的指针? 在下面的图片中,白色区域是由光线投射创建的网格,我想创建一个雾化的着色器,使屏幕空间中的LoS网格之外的所有东西变暗。 结果应该和你在老roguelikes中看到的相似,我认为这叫做“阴影投射”,但是在3D中。

对所有可能的方向进行最快的能见度计算

我正在寻找你的建议。 我有一个庞大的体素化模型,就像图片中的那个(但是有更多的几百万个体素)。 为了减less模型的三角形总数,我可以去除体素中的共享面,但是三角形确实会保持很多。 我需要做的是创建一个索引,该索引将包含来自以下过程的布尔列表(可见/不可见)信息: 定义一组点,如图中3个黄色三维像素的质心(但是,这个集合可能再次包含数百万个点),并且每个点计算哪个体素(除了它们相应的容器)可以被看到(直接和未被阻挡的线的网站)向所有方向(像全球照明概念)。 如果射线源(来自给定点)甚至可以达到目标体素的最小值,则意味着我们对于该体素具有“真实”条件。 例如,如果我们假设图片中的射线源点是光源,那么蓝色圆圈中的所有体素对于特定点都是“真实的”。 这与游戏开发无关,所以如果我的post应该在其他地方,我很抱歉。 我只是觉得我应该在这里问一下,因为我的大部分search结果都是光线投射,硬阴影,可见的表面确定,OpenGL等,在这里非常相关。 我不需要看到任何graphics(或者具有较高的fps:D),只需要将结果存储到第三个模拟过程中即可。 我感觉到,如果我实施简单的几何计算,这个索引将运行时间太长(尽管这可以相当容易并行,我相信)。 尽管如此,我可以利用OpenGL和GPU吗? 这会大大提高我的工作吗? 我应该如何处理这个问题? 我正在使用华硕ROG-G752VY。 我只需要构建和存储这个索引(如果数十亿字节,我不会感到惊讶)。 模拟的其余部分不断运行在一个集群上。 此索引计算操作将只会运行一次或多或less。 我只是不知道用这个数量的射线源点我会提到什么执行时间(天/星期/年)以及对所有方向和体素的“粗暴”检查(使用或不使用OpenGL和GPU)。 但是,我可以预测,每次可见体素的最大数量将只有几千。 这是因为(遗憾的是,没有提及它),当它的行程距离超过“x”单位(“x”将比整个模型的尺寸小得多)时,这条射线有一个终生逻辑。 因此,对于比“X”更远的光线,search过程应该每次都会中断。 非常感谢你的时间!

检测是否在python中跨越矩形。 需要速度提升

我正在写一个自上而下的人vs机器人射击游戏。 游戏现在可以工作,但是如果我有一个体面的大小的级别,当你被机器人追赶的时候,它会运行的很慢。 漫游时可以达到60fps,但尾巴上的机器人会非常缓慢。 我已经把问题的根源追溯到机器人决定他们的视线是否被墙壁阻挡的那部分代码。 该代码通过查看机器人中心和玩家中心形成的线段是否与墙壁相交而起作用。 我已经写了这个algorithm来看看一个线段是否通过矩形: for wall in wall_rects: #is wall between the robot and player: if man.rect.centerx < wall.rect.centerx < self.rect.centerx or\ man.rect.centerx > wall.rect.centerx > self.rect.centerx or\ man.rect.centery < wall.rect.centery < self.rect.centery or\ man.rect.centery > wall.rect.centery > self.rect.centery: r = [] #are the corners above or below the line between the man […]

数百个网格上的个体代理同时视线?

我有一个拥有数百个独立代理的大型网格,每个代理都基于自己的视觉input和快速控制algorithm进行移动。 我的问题是:我怎样才能有效地为每个代理提供他们可以看到的一系列其他代理(或墙壁)? 从每个人的作品射线铸造,但速度缓慢。 似乎我应该能够在每一步预处理世界以加快这个过程,因为我会做很多次,但是我还没有能够提出一个合适的algorithm。 有没有我已经错过的一些已知的诡计?

与Bresenham的视线

我有一个简单的函数来确定一个实体是否可以在自上而下的基于tile的游戏中看到另一个实体(在我的游戏中,这实际上是一个稍微复杂一点,以确定是否看到第一个块,但我简化了它这个例子): public static boolean canSee(int x, int y, int x2, int y2, Area area) { Array<Tile> blocks = new Array<>(); Utils.Bresenham.Plotter plotter = (x1, y1) -> { Tile t = area.getTileAt(x1, y1); if (t.blocksView()) { blocks.add(t); } }; Utils.Bresenham.line(x, y, x2, y2, plotter); return blocks.size == 0; } // Example below: P = player, E […]

几何问题的视域

我的玩家有一道视线,白线之间的所有物体变成红色。 为了计算这一点,满足以下条件:如果黄线与红线之间的角度小于或等于上述黄线与白线之间的角度,则认为该物体在视线内。 如果对象在白线之下,它也可以工作。 这里是代码: def _getTeta(obj_1, obj_2): deltaX = (obj_1.centerx – obj_2.right) deltaY = (obj_2.top – obj_1.centery) return math.acos(deltaX / math.sqrt(deltaX**2 + deltaY**2)) Obs .: centerx和right是X值, centery和top是Y值; 所有这些代表每个对象的矩形的某些点下遇到的值。 那么,我呢: if _getTeta(platform.rect, self.rect) <= _getTeta(abovePoint, self.rect): return True 上面的点是顶部形成白线的点,而平台是要检查的对象。 但是,如第二张图所示,如果视线在X轴上反转,则不起作用。 问题是我不知道如何设置正确的值,所以当玩家向左看时它也可以工作。 让我知道如果我不清楚我的问题! 谢谢!

快速三维视线计算algorithm

我有一个基于棋盘的棋盘游戏,其中单位在2D空间等距视图中的3D空间中移动。 当计算一个单位的攻击牌时,我如何确认他们没有穿过墙壁或者他们看到的高度。 我需要快速validation这些攻击瓦片是在一个单位的范围内(约20)。 我可以用x,y和z轴validation视线的最快方法是什么? 有人在这里发布了一个类似的问题,但是它包括2D视域计算而不是3D(使得答案非常不同)。

在2D中最有效的方法来实现墙和阴影

我正在制作一个类似于robocode的2D自上而下的编程游戏。 在舞台上将有多达1000个墙(线),并有多达50个机器人。 每个机器人都可以看到一个90度的弧线,而且看不到墙壁。 我需要一个有效的方法来计算每个机器人可以看到的(其他机器人和墙壁)。 我已经有一个网格的实施。 我想知道什么是解决这个问题最有效的方法。 如果该方法还包含绘制阴影以进行可视化的方法,那将是非常好的,但这不是必需的。 我正在使用C ++和Qt框架。 总结:主要问题是如何生成每个机器人可以看到的机器人和墙壁列表。 例如: Robot 1 can see: Robot 6 Robot 15 A wall from (50,60) to (70,80) Robot 2 can see: …

如何查找对象看不到的网格单元格

我正在写一个VB.NET程序。 我有一个网格视图,它是由多个称为网格单元的小单元组成的。 在网格视图中,我放置了一个障碍(红色框)和一个观察者(蓝色框)。 我的任务是find如何find蓝框看不到的网格单元格。 你可以参考下面的截图。 请注意,黄色方块形状不是必需的。 1)我已经考虑遍历网格视图中的所有网格单元格,并检查它们是否被蓝框看到。 但是,在网格视图中可能会有数百万个网格单元,并且循环遍历每个网格单元会花费大量时间并且效率不高。 除了在视图中的所有网格单元中循环以外,还有没有更好的方法来定位网格单元格,而不是通过蓝色框显示? 谢谢。

XNA 2D视线检查

我正在XNA上从事自上而下的射击,我需要实施视线检查。 我想出了一个似乎可以工作的解决scheme,但是我有一种唠叨的感觉,那就是不能够有效地完成多个呼叫的每个帧(游戏已经在每帧大约10次呼叫时略微打嗝)。 代码如下,但是我的总体规划是创建一系列宽度和高度为零的矩形,作为视线上的点,然后检查这些矩形是否与ClutterObject (我定义的接口)相交对于像墙壁或其他障碍之类的东西),在首先筛选出不可能在视线之内(即在观察者之后)或者太远(我为提高效率而作出的让步)之后进行筛选。 public static bool LOSCheck(Vector2 pos1, Vector2 pos2) { Vector2 currentPos = pos1; Vector2 perMove = (pos2 – pos1); perMove.Normalize(); HashSet<ClutterObject> clutter = new HashSet<ClutterObject>(); foreach (Room r in map.GetRooms()) { if (r != null) { foreach (ClutterObject c in r.GetClutter()) { if (c != null &&!(c.GetRectangle().X * perMove.X < 0) && […]