2015-09-21 6 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

Ничего, я нашел то, что я делал неправильно. Я использовал не предсказываемые переменные для координат луча, которые дали неверные результаты.