videojuegos robotica redes primer neuronales los juegos juego inteligentes inteligencia impacto evolucion ejemplos con artificiales artificial algoritmos agentes artificial-intelligence visibility

artificial intelligence - robotica - ¿Cómo puedo verificar si un objeto del juego puede ver otro?



primer juego con inteligencia artificial (5)

Tengo un objeto que se enfrenta a una dirección particular con (por ejemplo) un campo de visión de 45 grados y un rango de vista límite. He hecho todas las comprobaciones iniciales (nodo Quadtree y distancia), pero ahora necesito verificar si un objeto en particular se encuentra dentro de ese cono de visión (en este caso, decidir si seguir ese objeto solo si podemos verlo).

Además de lanzar un rayo para cada grado desde Direction - (FieldOfView / 2) a Direction + (FieldOfView / 2) (estoy haciendo eso en este momento y es horrible), ¿cuál es la mejor manera de hacer este control de visibilidad?


Calcule el ángulo entre la dirección de su vista (entendida como un vector) y el vector que comienza en usted y termina en el objeto. Si cae bajo FieldOfView / 2, puede ver el objeto.

Ese ángulo es:

arccos(scalarProduct(viewDirection, (object - you)) / (norm(viewDirection)*norm(object - you))).


Obtenga el ángulo entre el vector de rumbo del espectador y el vector del espectador al objetivo. Si ese ángulo es menor que (FieldOfView / 2), entonces el objetivo está en el campo de visión del espectador.

Si sus vectores son 2d o 3d, esto funcionará de la misma manera. (En 3D, si tiene una vista tridimensional en lugar de cono, necesitará separar los ángulos en dos componentes). Solo necesita encontrar el ángulo entre los dos vectores.

Si desea probar objetivos que son más grandes que un solo punto, necesitará varios puntos para cada objetivo, como las esquinas de un cuadro delimitador. Si el vector del visor a cualquiera de estos puntos da un ángulo dentro del campo de visión, entonces esa esquina del cuadro es visible.


Si estás haciendo 3D y puedes definir el rango de visión como un friso, entonces puedes usar algo similar a esta técnica de eliminación de Frustrum .


Trabajé en la industria de los videojuegos, y puedo decir que hacer funciones trigonométricas como arccos cada frame es menos que ideal. En su lugar, calcula previamente el coseno del ángulo del cono:

float cos_angle = cos(PI/4); // 45 degrees, for example

Luego, cada cuadro puede verificar rápidamente si un punto cae dentro de ese cono comparándolo con el producto punto del cono y el.

vector test_point_vector = normalize(test_point_loc - cone_origin); float dot_product = dot(normalized_cone_vector, text_point_vector); bool inside_code = dot_product > cos_angle;

No hay funciones trigonométricas, solo algunas multiplicaciones, divisiones y adiciones. La mayoría de los motores de juegos tienen una función optimizada de normalización () para vectores.

Esto funciona debido a esta ecuación:

A · B = |A| * |B| * cos(Θ)

Si normalizas los vectores (A -> An), la ecuación se simplifica:

An · Bn = cos(Θ)


Buenas respuestas, pero solo quería darle un enlace al blog de Wolfire, recientemente comenzaron una serie de álgebra que toma la ecuación del "campo de visión" como un ejemplo. Ve a leerlo , está bien escrito y es fácil.