我打算制作一款利用光线(和阴影)作为游戏玩法一部分的游戏,但是我想不出有效的算法来实现它们,我确信有一个优雅的解决方案。
白色区域由光直接照亮,浅灰色由直接照明的墙壁照亮,深灰色为黑暗。
我希望以有效的方式找到这些领域。 (实时,光线可以移动)
虽然不现实,但这是我能想到的最简单的问题,欢迎任何其他包含直射光和反射光的实现。
...
我的第一次尝试是从灯光到屏幕周边画线,找到它们相交的第一道墙。但是,对于墙壁的每个照明部分重复此算法以标记“环境”光是不可行的。
另请注意,游戏是在Flash中,所以我认为我不能使用gpu。
答案 0 :(得分:2)
受Ryan的回答启发。
在二维网格中,将屏幕的每个点标记为亮起。然后对于屏幕上的每个墙壁(按照接近点的顺序)在它们后面画一个阴影:在进入下一个墙之前,首先检查它的哪些部分被点亮,哪些不是,不要画两次阴影。标记为下一步绘制阴影的所有墙壁,因为这些墙壁可能是被照亮的墙壁。 (我们应该在下一部分之前再次检查)
对于每个亮起的线段(墙),首先检查是否有任何墙与段相交。对于每个交叉点,在交叉点处将点亮的段分割为2。
对于每个线段的端点,重复临时数组中的第一个部分,最后将所有点亮点添加到最终数组中。
第一部分应该遍历屏幕上的所有点和墙壁上的所有点。因此O(面积+墙壁的长度),并且取决于场景的复杂性(墙壁的数量和界面,第二部分应该应用第一部分约20次。
这可能是实时工作,但请务必在灯光不动时存放亮起的区域。
答案 1 :(得分:1)
您不需要绘制所有光线,只需绘制重要光线。例如,使用一个点光源和一条线,您只需要解决两个交叉点。
对于反射光照,您将从强度为n的点光开始,然后每当此光与墙壁相交时,您将墙壁分成更小的片段,并在照明片段上添加强度为n-1的线性光源。您可以根据需要多次执行此操作。