Я работал над очень элементарным raycaster, и у меня есть искажение типа "рыбий глаз". Вот код, который у меня есть:
var a = new part(player.x,player.y,rr(player.angle-22.5+(2.25*i))[0]/accuracy,rr(player.angle-22.5+(2.25*i))[1]/accuracy);
var c = 0, m, n;
while (!level[Math.round(a.x)][Math.round(a.y)]) {
a.x += a.Dx;
a.y += a.Dy;
c++;
}
n=dist(a.x,a.y,player.x,player.y);
m=1/n*400;
cols[i].height = Math.round(m);
cols[i].shapeColor=rgb(n*20+10,n*20+10,n*20+10);
функция rr()
просто возвращает подъем / ход введенного угла. (ввод в градусах)
часть коротка для частицы, и у меня есть x, y, delta x (Dx) и deta y (Dy)
стена помечена 1 в массиве у меня пол помечен как 0.
var level = [
[1,1,1,1,1,1,1,1],
[1,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,1,1,1],
[1,0,0,0,0,0,0,0,0,1],
[1,0,1,1,1,1,1,1,0,1],
[1,0,0,0,0,0,0,0,0,1],
[1,0,1,1,1,0,0,1,0,1],
[1,0,0,0,1,0,0,1,0,1],
[1,0,1,0,1,0,0,1,0,1],
[1,0,1,0,1,0,0,1,0,1,1,1],
[1,0,0,0,1,0,0,1,0,0,0,1],
[1,0,1,1,1,1,1,1,1,1,0,1,1],
[1,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,1,1,1,1,1,1,1,1,1,0,1],
[1,0,0,0,0,0,0,0,0,0,1,1,1],
[1,0,1,1,1,1,1,1,1,1,1,1,1],
[1,0,1],
[1,0,1],
[1,0,1],
[1,0,1],
[1,0,1],
[1,0,1],
[1,0,1],
[1,0,1],
[1,0,1],
[1,0,1],
[1,0,1],
[1,0,1],
[1,0,1],
[1,0,1],
[1,0,1],
[1,0,1,1],
[1,0,0,1],
[1,1,1,1],
];
Я хочу, чтобы высота столбца определялась по расстоянию, и у меня в настоящее время есть 1 / расстояние, но это вызывает изогнутую стену, чем дальше она удаляется от начала актерского состава. это то, что я хочу исправить.