java - Algoritmo para Raytracer 2D
algorithm vector (2)
A mi entender, el tema se abordaría de manera diferente. Dada alguna posición (posición actual del mouse o algo similar), el entorno se rastrearía desde allí en el rango de un ángulo determinado (como 90 grados, en su imagen esto se ve como 360 grados). En la resolución deseada del ángulo, los rayos desde la posición inicial se cruzan con los polígonos mencionados. Se representan los puntos de intersección más cercanos. Este enfoque debería representar los puntos que son ''visibles'' desde la posición dada.
Quiero hacer un
RayTracer
programático en
Java
con fines de demostración mientras hago una presentación sobre Ray Tracing en general (también mencionando 3D, este modelo 2D solo debe ser para una comprensión más fácil y para entrenar mi conocimiento general de Java).
Mi problema es que no sé por dónde empezar todo esto.
Lo primero que intentaría es usar vectores para rastrear cada píxel en la pantalla desde una coordenada dada (por ejemplo, la posición del cursor de mi mouse). Luego calcularía si el vector se cruza con un polígono y luego detendría el vector allí y lo dibujaría solo a este punto específico.
Tal vez podría incluso dibujar algunas sombras calculando lo normal y reflejar el vector en la otra dirección con una intensidad más baja.
Entonces, ¿sería una buena idea dibujar un vector desde
A = {everypixelonthescreen}
a un
Point P
específico y calcular las intersecciones?
La versión final debería verse así:
Me temo que este tipo de aplicación de trazado de rayos que está proponiendo es un poco más engañoso que usar un trazador de rayos 3D real.
- Los trazadores de rayos 2D se usan de manera un poco diferente
- y esto puede confundir mucho a tu audiencia
Intentaría elegir un uso más nativo de trazado de rayos 2D como:
-
Simulación óptica
Esto se utiliza para simular lentes y espejos ópticos. Aquí la imagen de una de mis antiguas simulaciones de trazado de rayos 2D:
-
Almacena tu mundo
Tienes lentes en forma de polilíneas + índice de difracción y espejos también como polilíneas. Tienes el índice de difracción mundial
-
emitir rayos R, G, B desde la fuente de luz
Lanza solo los importantes o todos ellos. Use la ley de Snell para simular ópticas
Como puede ver, el error cromático es visible (cada color tiene su propia longitud de onda, por lo que el índice de difracción es diferente). También puede usar la representación MultiBand .
Utilicé esto para sintonizar sistemas ópticos personalizados si agrega la capacidad de drag&drop , obtuvo Optic Lab
-
-
Demostración de Wolfenstein
Este pseudo juego en 3D utiliza un motor de fundición de rayos 2D. Consulte Wiki: Wolfenstein_3D_engine . Esta imagen fue tomada de este enlace:
- primero dibuje el piso y el techo / cielo como 2 medias pantallas (pantalla dividida por horizonte)
-
entonces tienes un mapa 2D de tu laberinto / mundo (derecha)
Entonces, proyecta rayos desde tu posición actual en todas las direcciones visibles (similar a tu imagen pero generalmente se usa una vista de 60 grados). Los rayos deben hacerse con precisión de subpíxeles (celda). donde su rayo golpeó la pared (en el mapa) obtenga la posición del subpíxel (celda). Indica qué parte de la textura de la pared se golpea
-
dibuje la columna apropiada (línea vertical) en la pantalla para cada golpe de Rayo
El tamaño y la escala están determinados por la distancia desde el origen del rayo. La corrección del ojo de pez se aplica si mi memoria sirve, se hizo usando solo la distancia perpendicular (multiplica la distancia por
cos(ray_angle-player_angle)
).
Aquí un ejemplo de lo que descubrí por diversión ahora:
Se realiza en C ++ con GDI puro (usando solo la línea de escaneo de mapa de bits) sin otras bibliotecas de terceros. Utiliza textura única, iluminación difusa + ambiente, emisión de rayos 2D. Tiene 2 mapas de bits (pantalla, atlas de texturas) y un solo mapa 2D. El código es inferior a 9 KByte incluyendo rems. Se controla solo con el teclado (el mouse se usa para editar el laberinto en la subventana del mapa).
Aquí ejemplo animado GIF :
Si está interesado, consulte el control de calidad relacionado:
- Wolfenstein con altura variable de celdas