• Miércoles 20 de Noviembre de 2024, 14:27

Autor Tema:  Colisiones  (Leído 2862 veces)

schispy

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Colisiones
« en: Lunes 9 de Enero de 2006, 03:28 »
0
hola a todos

estoy trabajando con OpenGl en VC++ (da lo mismo), pero lo que necesito es como detectar una colision.

puedo decir que tengo una 'mano' que 'toma' un 'objeto'. y especificamente lo que necesito es saber cuando la 'mano' esta en contacto o no con el 'objeto'.

existira alguna tecnica o algoritmo para ello?

no me sirve una matriz con 0 y 1.. pk estoy trabajando en 3D, y ademas las posiciones de los objetos pueden variar.

alguna idea?????

gracias
:hola:

lalo_soft

  • Miembro MUY activo
  • ***
  • Mensajes: 469
    • Ver Perfil
Re: Colisiones
« Respuesta #1 en: Lunes 9 de Enero de 2006, 04:16 »
0
Yo uso una tecnica que me a dado buenos resultados en DX desconosco OpenGl pero la
operatoria no deveria variar mucho.

los nombres son solo como referencia

1.-General una clase ObjetoEnPantalla.

2.-Dentro de ObjetoEnPantalla declara una variable para cordenadas ScreenX y otra ScreenY.

3.- tambien puedes crear dentro de la clase  ObjetoEnPantalla un metodo para Rendear el objeto en pantalla usando para ello las cordenas  ScreenX, ScreenY.

3.-instancia la clase ObjetoEnPantalla con dos objetos.
    El objeto Mano.
    El objeto Cosa.
Ahora ambos objetos (Mano y Cosa) tendran variables ScreenX ScreenY ademas de un metodo(funcion,subrutina) Rendear por separadopara cada objeto instaciado en la clase ObjetoEnPantalla.

como usar Ejemplo:
 
Mano.ScreenX = 500; posicion pixel 500 (horizontal)
Mano.ScreenY = 400; posicion pixel 400 (vertical)


Cosa.ScreenX = 500; posicion pixel 500 (horizontal)
Cosa.ScreenY = 300; posicion pixel 300 (vertical)

if(Mano.ScreenX == Cosa.ScreenX && Mano.ScreenY == Cosa.ScreenY)
   {

     ......bla bla bla


    }


Mano.Rendear();dibuja Mano
Cosa.Rendear();dibuja Cosa

puedes leer y escribir las cordenadas antes de rendear para asi tomar tus decisiones en el programa.

Como te dije antes no conosco la mecanica de OpenGl pero a nivel de lenguaje esta
manera es eficiente.


Espero que este patron te sirva.

Saludos.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Colisiones
« Respuesta #2 en: Domingo 15 de Enero de 2006, 17:11 »
0
Hola.

Para detectar colisiones de manera eficiente entre entidades en una escena se suele emplear una sencilla aproximación: A cada objeto complejo se le asigna un Bounding Volume (un objeto sencillo que lo representa a efectos de comprobaciones de colisiones). Lo más común es que se trate de un cilindro, una caja o una esfera. Luego no tienes más que comprobar intersecciones entre estos objetos sencillos y tomar las medidas necesarias en caso de colisión (en tu ejemplo, sería mover conjuntamente el objeto con la mano como si en verdad lo hubiera cogido).

Si quieres aproximaciones físicamente realistas tienes que emplear algún motor de física, como pudiera ser ODE, pero requiere bastantes ciclos de reloj con modelos complejos pues el cálculo se realiza a nivel polígono, no con aproximaciones. Un ejemplo de juego que emplee esta técnica es Doom 3.

Un saludo,

Ruben3d

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Colisiones
« Respuesta #3 en: Domingo 15 de Enero de 2006, 20:49 »
0
Cita de: "schispy"
hola a todos

estoy trabajando con OpenGl en VC++ (da lo mismo), pero lo que necesito es como detectar una colision.

puedo decir que tengo una 'mano' que 'toma' un 'objeto'. y especificamente lo que necesito es saber cuando la 'mano' esta en contacto o no con el 'objeto'.

existira alguna tecnica o algoritmo para ello?

no me sirve una matriz con 0 y 1.. pk estoy trabajando en 3D, y ademas las posiciones de los objetos pueden variar.

alguna idea?????

gracias
:hola:
Bueno, tecnicas y algoritmos hay desde las mas simples como calcular la distancia entre 2 puntos hasta tan complicadas como ir calculando vectores perpendiculares a cada plano triangular de tu mesh en forma recursiva... Todo depende de que es lo que quieres lograr.

PENTEX

  • Miembro activo
  • **
  • Mensajes: 89
    • Ver Perfil
    • http://black-byte.com/
Re: Colisiones
« Respuesta #4 en: Jueves 19 de Enero de 2006, 15:12 »
0
Como escribio Ruben3d la mejor aproximacion es usar bounding, aqui subo un ejemplo que hice hace algun tiempo de colisiones mixtas (esta pseudo 3d pero es facil ajustarlo a 3d).

Camilo
Grupo Pentex.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.