ayuda con raycasting c++ [traducir al español]
Publicado por felipe (74 intervenciones) el 12/05/2020 16:22:22
Hola
Estoy intentando crear un raycasting y tengo la mayoría del algoritmo completado para renderizar muros sin textura.
Tengo un problema y es que los muros no se ven correctamente.
Solo se muestra en pantalla un muro del mismo tamaño y eso obviamente esta mal.
Ojala puedan ayudarme, en verdad lo necesito.
Estoy haciendo uso de una libreria grafica y estoy seguro que el error no es ese.
codigo:
y video:
Si observan bien, la ultima columna de pixeles de la derecha (vertical), tiene una altura diferente
estoy estancado en esta parte del trabajo y no puedo avanzar
ayuda, gracias
Estoy intentando crear un raycasting y tengo la mayoría del algoritmo completado para renderizar muros sin textura.
Tengo un problema y es que los muros no se ven correctamente.
Solo se muestra en pantalla un muro del mismo tamaño y eso obviamente esta mal.
Ojala puedan ayudarme, en verdad lo necesito.
Estoy haciendo uso de una libreria grafica y estoy seguro que el error no es ese.
codigo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
//header que incluye variables y funciones para el renderizado y manipulacion del mapa.
#define black 0,0,0
#define red 255,0,0
#define green 0,255,0
#define blue 0,0,255
#define light_gray 97,97,97
#define brown 126,79,52 //color cafe
const unsigned int mapSize = 12;
char map[mapSize+1][mapSize+1]{
"XXXXXXXXXXXX",
"X X",
"X X",
"X X X",
"X X X",
"X X",
"X X X",
"X X",
"X X X X",
"X X X",
"X X",
"XXXXXXXXXXXX",
};
struct St2DMap{
void keys();
void render();
}2dmap;
struct St2DRay{
float distance;
float angle;
float reasonX,reasonY;
float step;
bool hitWall;
float finalXcoord; //coordenadas finales para detectar muros
float finalYcoord;
int wallHeight; //altura de la pared (depende de la distancia)
int initWall; //coordenada Y inicial de la pared
int endWall; //coord Y final de la pared
}2DRay;
void St2DMap::keys(){
//mover la camara del jugador
if(keyStack.a) player.angle -= PI/9/window.maxFps;
if(keyStack.d) player.angle += PI/9/window.maxFps;
//mover al jugador
if(keyStack.w) player.y -= 1.0/window.maxFps;
if(keyStack.s) player.y += 1.0/window.maxFps;
}
void St2DMap::render(){
for(int xx=0;xx<=window.width;xx++){
2DRay.angle = (player.angle - (player.FOV/2)) + (xx/window.width*player.FOV);
2DRay.reasonX = cos(2DRay.angle);
2DRay.reasonY = sin(2DRay.angle);
2DRay.distance = -0.1;
2DRay.step = 0.1;
2DRay.hitWall = false;
while(!2DRay.hitWall){
2DRay.distance += 2DRay.step;
2DRay.finalXcoord = player.x + 2DRay.reasonX * 2DRay.distance;
2DRay.finalYcoord = player.y + 2DRay.reasonY * 2DRay.reasonX;
//comprobar si el rayo golpeo un muro
if(map[int(2DRay.finalYcoord)][int(2DRay.finalXcoord)] == 'X'){
//2DRay.block = map[int(2DRay.finalYcoord)][int(2DRay.finalXcoord)];
2DRay.hitWall = true;
}
}
2DRay.wallHeight = window.height-(2DRay.distance*30)+0.1; //altura de la pared
2DRay.initWall = (window.height - 2DRay.wallHeight) /2;
2DRay.endWall = 2DRay.initWall + 2DRay.wallHeight;
//dibujar color de "techo"
al_draw_line(xx,1,xx,2DRay.initWall,al_map_rgb(light_gray),0);
//dibujar color de muro
al_draw_line(xx,2DRay.initWall,xx,2DRay.endWall,al_map_rgb(black),0);
//dibujar color de "piso"
al_draw_line(xx,2DRay.endWall,xx,window.height,al_map_rgb(brown),0);
/* al_draw_line(x1,y1,x2,y2,color,0); */
}
}
/*
otras variables que no aparecian en este header:
window.width = 800
window.height = 450
player.fov = 0.785 (en radianes)
*/
y video:
Si observan bien, la ultima columna de pixeles de la derecha (vertical), tiene una altura diferente
estoy estancado en esta parte del trabajo y no puedo avanzar
ayuda, gracias
Valora esta pregunta


0