0

我正在开发一款游戏,玩家必须在黑暗的走廊中行走。角色有一个手电筒,相机位于上方(如 GTA2 中)。我对着色算法有疑问。

在此处输入图像描述

所以我们有一个光源(黄色圆圈),一堆墙壁(绿色和蓝色线)和光矢量(红色箭头)。
我们所知道的:
- 光源和线路之间的距离;
- 线的长度;
- 光矢量坐标;
- 线不相互交叉;
- 线端点的角度;

问题:
如何让程序看到哪一行位于其他行的前面?例如,在图像中,我们可以看到绿线在蓝线的前面。

我们可以找到向量和两条线的交叉点,然后找到光源和交叉点之间的长度并比较它们以找到最近的线,但这会减慢程序的速度。此外,可能会出现蓝线将更靠近光源的情况(如果我们将光源稍微向上移动),但程序仍然必须看到蓝墙位于绿线后面。
也许我们可以以某种方式为每一行标记一些价值?

编辑:我还尝试使用公式为每条线创建一个值:a/alpha + b/beta
其中:
a - 光源与直线的第一个端点之间的距离
alpha - 直线的第一个端点的角度
b - 之间的距离光源和线
的第二个端点 beta - 线的第二个端点的
角度 必须反转其中一个角度。

但是为了使这个公式起作用,似乎必须有一些常数,例如:
a const/alpha + b const/beta
也许通过找到这个常数我可以给每一行一个值?

4

1 回答 1

0

The statement

The blue line is behind the green line.

is equivalent to the statement

There is a ray from the light source that passes through the green line and then the blue line.

(Note that this is a mathematical ray, not a light ray-- it passes through blue and green obstacles.)

This is equivalent to

There is a ray from the light source that intersects both lines, and the green intersection is closer to the light source than the blue one is.

Searching for such a ray looks difficult at first, -- there are infinitely many to test -- but I argue that if such a ray exists, then there must be such a ray that passes through one of the line endpoints. Now there are only four to test.

于 2013-04-03T19:38:50.560 回答