[Blender] Raycast python BGE

Explicado por Guzmán Álvarez García en su proyecto final de carrera. Mil gracias.
5.9.2. Uso del método rayCast.

Este método, presente en todos los objetos del juego, consiste en la versión completa de rayCastTo (ver apartado 5.5.2, página 64). Su funcionamiento básico es equivalente, aunque mediante la aceptación y devolución de más cantidad de parámetros adopta una flexibilidad mucho mayor que permite hacer cálculos más complejos.

Los parámetros que admite aparecen a continuación:
– Objeto hacia cuyo origen se traza el rayo, o punto del espacio (vector tridimensional u objeto de tipo tuple o list). Equivalente al parámetro pasado anteriormente a rayCastTo.
– Objeto desde el que se lanza el rayo, o punto del espacio. Este parámetro hace al rayo independiente del objeto desde el que se llama al método, ya qué tanto el punto dónde empieza como donde termina pueden definirse libremente. Si se omite, o se pasa None, el rayo se lanza desde el objeto que llamó al método.
– Distancia hasta la cual se detectan intersecciones (número real). Permite limitar o extender la búsqueda: el objeto hacia el que se traza el rayo sólo se usa para calcular la dirección, mientras que la distancia indica si el rayo llega hasta el objeto o lo sobrepasa o, si es negativa, hace que se lance en sentido contrario. Si se omite, pasando 0, el rayo llega hasta el objeto pasado como primer parámetro.
– Propiedad buscada (cadena de caracteres). Hace que sólo se detecten los choques con objetos que tengan una propiedad cuyo nombre coincida con el pasado.
– Orientación de la normal (0 o 1). Si se pone a 1 la normal que se devuelve será la normal real de la cara donde se ha producido el choque. Si su valor es 0 o se omite, siempre se devuelve la normal que apunta hacia el lado de la superficie donde impacta el rayo. Por regla general las normales dé las caras de los objetos bien construidos apuntan hacia el exterior, por lo que el valor que se pase no supondrá ninguna diferencia en el resultado. Sin embargo, es conveniente que sea 0 u omitirlo, para evitar comportamientos erróneos en caso de que haya algún error en las normales.
– Atravesar objetos (0 o 1). Sólo tiene sentido cuando se buscan objetos que tengan una determinada propiedad. Si se pasa un 1 se descartan los objetos que no tengan la propiedad y se sigue buscando hasta llegar a la distancia límite o hasta encontrar uno, mientras que si se omite o se pasa un 0 el rayo se detiene en el primer choque.
– Datos devueltos (0, 1 o 2). Determina qué datos se incluyen en el objeto que devuelve el método (ver siguiente lista). El valor por omisión es 0.

De estos parámetros sólo el primero es obligatorio, mientras que el resto tomarán los valores por defecto si se omiten. Solamente es necesario especificar los parámetros, en orden, hasta el último de ellos cuyo valor no sea el predeterminado (pasando, en los anteriores a este último que no requieran modificaciones, el valor por omisión). Así, sí, por ejemplo, se quisiesen detectar objetos con una determinada propiedad, pero no definir una distancia límite.

Interactividad Programada en el Game Engine de Blender.
94.

Ni un punto de origen diferente, la llamada quedaría: resultado = objeto_origen, rayCast(objeto_final, None, 0, propiedad_buscada).

El objeto que devuelve el método es siempre de tipo tuple, y el número de elementos que contiene depende del último parámetro de la lista anterior. Según valga 0, 1 o 2 se incluirán, respectivamente, los tres primeros, los cuatro primeros o todos los elementos que aparecen a continuación:
– Objeto detectado: objeto del juego (tipo KX_GameObject) contra el que ha chocado el rayo. Si no ha chocado, contiene None.
– Punto de choque: vector tridimensional con las coordenadas globales del punto en el que el rayo toca la superficie del objeto. Si no ha chocado, contiene None.
– Normal: vector normal a la superficie del objeto en el punto donde impacta el rayo. Si no ha chocado, contiene None.
– Cara del objeto con la qué ha chocado: objeto de tipo KX_PolyProxy, que contiene los datos de dicha cara, tales como el material asociado o referencias a los datos de sus vértices. Si no ha chocado, contiene None.
– Coordenadas en el mapa UV del punto de choque. Si no ha chocado, contiene None.

Dado que la única funcionalidad extra qué se requiere en este apartado respecto a rayCastTo es la obtención de la normal, las llamadas al método se harán omitiendo o poniendo a 0 el último parámetro, de forma qué el objeto tuple conste de tres elementos.

Un aspecto importante a tener en cuenta es que, cuando el punto de inicio se encuentra dentro del objeto de destino, o éste tiene forma cóncava, es probable que el rayo no atraviese ninguna superficie, y por tanto el método no devuelva ningún objeto válido. En el escenario del proyecto este hecho tiene relevancia, por ejemplo, en las rampas que se han colocado, o en el recinto circular con una rampa en su interior.

Ver más sobre el tema y los comentarios en el foro