Realidad Virtual
información adicional
jaume ferrer i rosera

<< índice FAQs

 

16. Scripting: Un objeto en movimiento que rebota contra otro objeto

Consulta:
En la FAQ 12 vemos un ejemplo de cómo asignar límites a un espacio para que un objeto en movimiento rebote en ellos y no salga fuera. Pero, ¿cómo añadir más objetos a ese espacio y conseguir que también sean detectados alterando la trayectoria del objeto en movimiento?

Respuesta:
El ejemplo que se muestra a continuación añade al de la FAQ 12 diversas novedades:

Los campos del nodo Script han sido modificados para que resulten más compactos. Para ciertos datos se han usado MFFloat, que equivalen a arrays o listas de de valores que desde las funciones pueden ser referenciados mediante índices. También se ha dividido la función original del script en varias funciones destinadas a realizar tareas distintas.

Un proximitySensor detecta el punto de vista del usuario en cuanto se carga el mundo y envía un SFTime al script que activa la función inicializa(). Desde esta función se calculan los límites del objeto fijo que se halla dentro del espacio y que queremos que sea detectado por nuestro objeto en movimiento.

Durante la animación, antes de que se lleve a cabo un nuevo movimiento se produce una llamada a la función comprueba(), que es la encargada de comparar los límites del espacio y del objeto fijo con las futuras coordenadas de nuestro objeto en movimiento para determinar si colisionará o no. En caso afirmativo se invierte el sentido de la marcha (sólo en el eje de la colisión cuando se trata de los límites del espacio y en los tres ejes a la vez cuando se trata del objeto fijo).

Se han añadido aleatorios que modifican ligeramente el ángulo y la velocidad del objeto en movimiento cada vez que se produce un rebote. El objetivo es que evitar que se produzca una trayectoria de rebotes repetitiva.

Visualizar ejemplo [de momento sólo disponible para Cortona]

Ver código fuente [si lo guardáis en vuestro disco duro y lo editáis con VrmlPad podréis ver el código coloreado]