Raycast引擎:渲染实心门

时间:2015-09-21 17:29:21

标签: rendering basic raycasting

我目前正在处理我正在处理的光线投影引擎的问题。我目前正在向渲染引擎添加非传送门,但我收到了一些奇怪的文物。我已经列举了每个案例的一些例子。

raycast example 1: correct

这是从-X角度(向东看)观察的垂直(南北)门。正如您所看到的,这就是在所有情况下应该如何绘制门。

raycast example 2: incorrect

这是同一扇门,但从Y轴直视(向南/向北看)。正如您所看到的,这是视觉工件开始出现的时候。在门口中间绘制的块来自右侧,向左移动直到达到+ X角(向西看)。

此行为在所有水平和垂直打开的门道中复制。它们从一个角度看起来是正常的,但是然后奇怪的神器将从右向左移动(或在相反的一侧反之亦然),直到在某一时刻抛出溢出错误,因为X碰撞或Y碰撞跳转到一些荒谬的高数字

以下是我用于确定碰撞的代码。这是基本编写的,因为我还没有将它转换为C / C ++。这两个函数都使用GOTO语句调用,并且能够返回它们被调用的函数。

`X and Y are the non-precalculated ray coordinates while COLLX and COLLY are precalculated for the typical orthogonal cubes
`For when DX(direction X) is the greater magnitude (-1, +1). Called by @CASTXLOOP
@XDOOR
`ignore any occurences of T=2, for drawing code only
IF T==10 THEN @XDOORH `horizontal east-west door
T=2
IF COLLX-FLOOR(COLLX)>=.8 THEN RETURN `return positive collision to be drawn
IF SGN(DX)>1 THEN @CASTXLOOP `X-ray going the wrong direction to detect door

COLLY=Y+DY*(FLOOR(X)+.8-X) `Mulltiplied by fraction of X to +.8
COLLX=FLOOR(X)+.8
RETURN `Collision point returned
@XDOORH
T=2
IF COLLY-FLOOR(COLLY)>=.8 THEN RETURN `Return positive collision to be drawn
IF SGN(DY)>1 THEN @CASTXLOOP `Y ray going wrong direction
IF FLOOR(Y)+.8-Y>=DY THEN @CASTXLOOP `Distance to door collision is greater than magnitude 1

COLLX=X+DX*((FLOOR(Y)+.8-Y)/DY) `Important, move by magnitude of DY distance to .8
COLLY=FLOOR(Y)+.8
RETURN `Collision point returned

`For when DY(direction Y) is the greater magnitude (-1, +1). Called by @CASTYLOOP
@YDOOR
IF T==10 THEN @YDOORH
T=2
IF COLLX-FLOOR(COLLX)>=.8 THEN RETURN `Return positive collision to be drawn
IF SGN(DX)>1 THEN @CASTYLOOP `X ray going wrong direction
IF FLOOR(X)+.8-X>=DX THEN @CASTYLOOP `Distance to door collision greater than magnitude 1

COLLY=Y+DY*((FLOOR(X)+.8-X)/DX)
COLLX=FLOOR(X)+.8
RETURN `Collision point returned
@YDOORH
T=2
IF COLLY-FLOOR(COLLY)>=.8 THEN RETURN `Return collision to be drawn
IF SGN(DY)>1 THEN @CASTYLOOP `Y ray going wrong direction

COLLX=X+DX*(FLOOR(Y)+.8-Y)
COLLY=FLOOR(Y)+.8
RETURN `Collision point returned

1 个答案:

答案 0 :(得分:0)

没关系,我发现我做错了什么。我使用非预先计算的变量作为我的光线坐标,结果不正确。