У меня в настоящее время проблема с движком raycast, над которым я работаю. В настоящее время я добавляю не телепортационные двери в механизм рендеринга, но я получаю некоторые странные артефакты. Я включил некоторые нарисованные примеры каждого случая.Raycast Engine: рендеринг Solid Door
Это вертикальный (север-юг) дверь рассматривается от -X угла (если смотреть на восток). Как вы можете видеть, так это то, как дверь следует рисовать во всех случаях.
Здесь же дверь, но рассматривать прямо от оси 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