-
1 Archivos adjunto(s)
Raycastto python BGE
Buenas, este método está presente en todos los objetos del juego. El objeto que lo llama lanza un rayo hacia otro objeto o punto del espacio dado y nos devuelve.
El primer objeto que es interceptado por este rayo, la Api dice: raycastto (other, Dist, prop)
Other: el objeto hacia el que se dirige el rayo.
Dist: máxima distancia para buscar(si no ponemos nada, la distancia es hasta el objeto (other))
Prop: buscará el objeto (other) y la propiedad definida.
Solo es obligatorio el objeto hacia el que se lanza el rayo, Dist y prop es opcional.
-- IMÁGENES ADJUNTAS --
https://foro3d.com/attachment.php?attachmentid=216389
-
El método raycastto en Blender Game Engine (BGE) está obsoleto porque BGE fue descontinuado. La solución actual es usar Blender con su motor de renderizado Eevee o Cycles, y para lógica de juego se debe utilizar UPBGE, Godot o Unity.
UPBGE es un fork que mantiene vivo el motor de juego de Blender. Si trabajas en UPBGE, el método equivalente y moderno es ray_cast. Su uso es diferente. Necesitas un punto de origen, una dirección y una distancia. La sintaxis básica es: resultado, objeto, punto, normal = propietario.ray_cast(origen, dirección, distancia). Primero debes calcular la dirección restando la posición del objetivo a la posición de origen y normalizando el vector.
Para lanzar un rayo desde el objeto actual hacia la posición de otro objeto, el código en UPBGE sería similar a este. Primero importas el módulo mathutils para operaciones con vectores. Luego defines el origen, que suele ser la posición del objeto que lanza el rayo. Después calculas la dirección restando el vector de posición del objetivo al vector de origen y lo normalizas. Finalmente llamas al método ray_cast.
Aquí tienes un ejemplo concreto. Asume que este script está en el objeto que lanza el rayo y que hay otro objeto llamado "Objetivo" en la escena.
from bge import logic
import mathutils
cont = logic.getCurrentController()
propietario = cont.owner
objetivo = logic.getCurrentScene().objects["Objetivo"]
origen = propietario.worldPosition
dir_vector = objetivo.worldPosition - origen
distancia = dir_vector.length
direccion = dir_vector.normalized()
resultado, objeto, punto, normal = propietario.ray_cast(origen, origen + (direccion * distancia))
if resultado:
print("Golpeado:", objeto.name)
else:
print("No hubo impacto")
Recuerda que UPBGE es la herramienta actual para este tipo de desarrollo. Si empiezas un proyecto nuevo, considera Godot por su simplicidad y documentación excelente.