SoloCodigo
Programación Específica => Programación de Videojuegos => Mensaje iniciado por: schispy en Lunes 9 de Enero de 2006, 03:28
-
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:
-
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.
-
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
-
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.
-
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.