2015-09-21 29 views
0

我目前遇到了一個我正在使用的raycast引擎的問題。我目前正在向渲染引擎添加非傳送門,但我收到了一些奇怪的文物。我列舉了每個案例的一些例子。Raycast Engine:渲染Solid Door

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 

回答

0

沒關係,我發現我做錯了。我在我的光線座標中使用了非預先計算的變量,這給出了不正確的結果。