Cámara 3D que no atraviese sólidos. [Resuelto]

Publicado por DarkKRuleR, Agosto 18, 2020, 02:24:24 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

DarkKRuleR

¡Buenas! Pues tengo una cámara con una posición 3D dada, digamos "x, y, z". El problema es que si me pongo contra un muro, la cámara puede quedarse dentro de él, viendo las cosas desde ángulos incorrectos o hasta pudiendo ver cosas que hay detrás de las paredes. Incluso si no ocurre esto, podría ocurrir que la cámara quede al otro lado de un muro, sin colisionar con nada en x, y, z, pero sí colisionando en la línea, quedando la cámara al otro lado de la pared y también viendo cosas que no debería poder ver.

Hice un bucle para calcular en qué coordenada poner la cámara, comenzando en el personaje, sumando 1 píxel a la distancia, calculando que no haya colisión, y así iterar hasta llegar a la posición de la cámara, habiéndome asegurado que entre el personaje y ésta no haya sólidos. Pero iterar tanto y buscar colisión en cada iteración dispara el coste. Intenté poner un modo "económico" en que hiciera saltos por ejemplo de 50 en 50 píxeles (los muros son de tamaño 150), pero a veces los atraviesa igual.

También pensé alternativas, como dejar que la cámara atraviese los muros, pero si lo hace, poner la vista en negro, o teletransportarla al personaje, o mil cosas.... pero ninguna me convence. Y el problema principal es saber que entre la cámara y el personaje no haya sólidos y colocar la cámara a la distancia máxima (pegada al muro) sin disparar el coste con un bucle y mil comprobaciones.

¿Quien haya hecho algo similar, cómo lo arreglaste?

Clamud

En este tema subí ejemplos donde la cámara colisiona, pero es un juego donde la cámara sigue al personaje por la espalda y creo que tu juego es un plataformero
https://www.comunidadgm.org/preguntas-y-respuestas/camara-3d-d-estilo-yume-niki-3d-(solucionado)

En alguna parte del código se usa este script
https://yal.cc/gamemaker-collision-line-point/
ya no estoy seguro, pero creo que encuentra el punto de colisión usando un método parecido a la búsquda binaria. Es decir, comienza revisando distancias largas y en cada iteración la distancia se reduce a la mitad, eso reduce considerablemente el número de iteraciones.

DarkKRuleR

Graciass. En principio no planteé collision_line ya que al ser full 3D pues faltaba la tercera componente. Sin embargo vi que de alguna forma podía hacerse, aunque fue complicado.

Entre pruebas y pruebas di con una solucion alternativa. La original, con un pequeño retoque xD Gracias igual por ser esa chispa (!)

Powered by EzPortal
SMF spam blocked by CleanTalk