Gracias Gracias:  0
Página 1 de 2 12 ÚltimoÚltimo
Resultados 1 al 15 de 22

Tema: BLITZ basic : colisiones

  1. #1
    Expulsado
    Fecha de ingreso
    Dec 2010
    Ubicación
    En matrix
    Mensajes
    1,681

    BLITZ basic : colisiones

    Mi problema es las colisiones de POLIGONO A ESFERA. Ya se que blizt3d no soporta este tipo de colisiones, pero necesito implementar un código que las realize. Lo que necesito es teniendo una malla realizar una rutina que compruebe polígonos y sus colisiones con una esfera y le de la física necesaria para desplazarse al colisionar, es decir, de la misma forma que funciona la colisión de esfera a poligono (que si soporta el blitz3d) pero a la inversa.

  2. #2
    Ninja Fever Avatar de Mars Attacks
    Fecha de ingreso
    Jun 2003
    Ubicación
    Castellón
    Mensajes
    12,744

    Re: BLITZ basic : colisiones

    No tengo ni idea de Blitz, pero igual es algo que puedes preguntar por los foros de http://www.stratos-ad.com (allí hay varios blitzeros, creo).

  3. #3
    Expulsado
    Fecha de ingreso
    Dec 2010
    Ubicación
    En matrix
    Mensajes
    1,681

    Re: BLITZ basic : colisiones

    Bueno, me acordé de que este tema ya lo había abierto hace tiempo, y haber si marco puede echarme un cable. Dejo el código actual en el que estaba trabajando.

    Pd: me propongo desde hoy intentar poner acentos,:D
    Archivos adjuntados Archivos adjuntados
    Última edición por aprendiz; 19-07-2011 a las 20:59

  4. #4
    Miembro Nuevo
    Fecha de ingreso
    Jul 2011
    Mensajes
    18

    Re: BLITZ basic : colisiones

    Hola por aquí! :D

    Este es el concepto detrás de todas las colisiones (no se aceptan reclamos por mis dibujos en ASCII):

    Código:
    Los modelos 3D en Blitz están formados por mayas (mesh), que a su vez están 
    formadas por triángulos. Cada triángulo se define por sus vértices, que son 
    coordenadas en X-Y-Z:
    
     v1 = (x1, y1, z1)
     /\
     / \
     / \
     / \
     /_ _ _ _ \
     v2 v3
    
    Cuando mueves un triángulo seguirá un movimiento lineal:
    
     /\
     / \ distancia = velocidad * tiempo
     / \ -------------------------------->
     / \
     /_ _ _ _ \
    
    Este movimiento describe un volumen (inclino un poco el triángulo para verlo mejor):
    
     tiempo incial tiempo final
     | |
     _________________________
     /\ /\
     / \ / \
     / \ __________________/____\
     / __-- / __--
     /__--____________________/__--
    
    Si el triángulo colisiona con una esfera, eso significa que la esfera quedará 
    dentro del volumen que describe el triángulo al moverse (la zona punteada esta 
    metida en la esfera):
    
     _ _ _ _ _ _ _ 
     / \
     ______________/__________ \
     /\ /./\ \
     / \ |./..\ |
     / \ ________|_________/____\ |
     / __-- |../...__-- |
     /__--____________|_______/__-- |
     \ /
     \ /
     \ _ _ _ _ _ _ _ /
    
    Ahora lo que necesitas es simplificar el problema para resolverlo matematicamente. 
    Si te lo imaginas, ese volumen del triángulo en movimiento es como un prisma. 
    Si el prisma entra en la esfera, esta NECESARIAMENTE debera tocar alguna de 
    las 3 caras o planos laterales (A, B, o C):
    
     _________________________
     /\ PLANO A (adelante) /\
     / \ PLANO B (atras)/ \
     / \ __________________/____\
     / __-- PLANO C (abajo)/ __--
     /__--____________________/__--
    
    Entonces necesitas resolver la intersección de los 3 planos y la superficie de la
    esfera, que se hace con el siguiente pseudo-código:
    
    producto_punto_del_plano = ProductoPunto(normal_del_plano, un_punto_en_el_plano)
    distancia = ProductoPunto(centro_de_la_esfera, normal_del_plano) - producto_punto_del_plano
    hay_colision = ValorAbsoluto(distancia) <= radio_de_la_esfera
    
    Repites esta prueba para los 3 planos, y vuelves a repetir todo para cada triángulo
    de la maya. Si alguna prueba es positiva entonces habrá colisión.
    
    Y este es el fundamento de todas las demás colisiones.
    Espero que te ayude. Te dejo de tarea traducirlo a BlitzBasic. Si tienes alguna duda avísame, pero en general si no entiendes algún concepto matemático tendrías que estudiarlo.

    PD: por cierto que me faltó un caso, pero si entiendes el concepto seguro lo descubriras.

    Saludos!
    -Marco
    Última edición por marcoantap; 19-07-2011 a las 23:55

  5. #5
    Expulsado
    Fecha de ingreso
    Dec 2010
    Ubicación
    En matrix
    Mensajes
    1,681

    Re: BLITZ basic : colisiones

    Valla esto lo sabia, pero no lo había planteado nunca como un volumen. Lo que yo hacia era cuando un ente se movia, "desmoverlo" y comprobar si chocaba. Pero ahora con esos dibujos lo veo más claro.

    Si no me equivoco lo que consigues es obtener la distancia más cercana del centro de la esfera a los tres planos que conforman el volumen. Pero... si la esfera esta muy alejada y su centro esta a la distancia menor al radio, aun sin haber colisión con los planos que forman el volumen no habrá colisión y la función dira que si. Yo la forma que tengo de solucionar esto es proyectar el centro de la esfera sobre el plano, y comprobar sus distancias a los vértices...alguna manera/algoritmo mejor?

    También faltaría la comprobación de la intersección con lo que sería el triángulo en su posición actual y en la posición previa.

    Mi problema es el movimiento, es decir, cuando detectas que ha chocado contra un poligono perfecto, se mueve en la dirección perpendicular a la normal del poligono pero proyectada en el plano del moviento.

    Pero cuando ese movimiento resultante de una colisión hace que colisione con un nuevo poligono? como resuelves tu eso?
    Yo lo hice mediante llamadas recursivas a la función, pero me parece que esa no es la forma correcta, por las fps, y porque si la malla tiene muchos triángulos juntos, la función devería llamarse tantas veces como choques implique el movimiento.
    Y bueno, sin usar esta solución, simplemente atraviesa uno de los polígonos. ¿Qué propones?
    Gracias por la respuesta del volumen, ahora lo veo más claro.
    Última edición por aprendiz; 20-07-2011 a las 00:05

  6. #6
    Miembro Nuevo
    Fecha de ingreso
    Jul 2011
    Mensajes
    18

    Re: BLITZ basic : colisiones

    Hola aprendiz, lamento no haber respondido antes, tenía que resolver un trabajo urgente.

    Claro la cuestión es imaginar un volumen. Por ejemplo, cuando una esfera se mueve forma una capsula, en el caso del triángulo forma un prisma.

    No entiendo muy bien tu ejemplo de la esfera muy alejada, ¿te refieres a que la esfera contiene al prisma? En ese caso solo tienes que probar si todos los vértices están dentro del radio de la esfera. Es cuestión de hacer un caso adicional.

    Otra cosa que no entiendo es el problema con el nuevo polígono. ¿Te refieres a que la esfera sea "aplastada" por dos polígonos que la colisionan al mismo tiempo? ¿O a un rebote? Aclarame un poco más esto para ver en que te puedo ayudar.

    Saludos!
    -Marco

  7. #7
    Expulsado
    Fecha de ingreso
    Dec 2010
    Ubicación
    En matrix
    Mensajes
    1,681

    Re: BLITZ basic : colisiones

    aaa, ese caso no lo había visto yo, (me refiero a que el prisma este dentro de la esfera).

    Lo que me refiero a muy alejada es que siendo la distancia de la esfera al plano menor al radio, pero aun así, estando la esfera fuera del prisma.

    Lo del nuevo polígono me refiero a que suponte que la esfera choca contra un triángulo. Pues bien ese triángulo hace que la esfera se desplaze por él. En ese desplazamiento suponte que choca contra un nuevo triángulo (me exprese mal con polígono, quería decir triángulo), como tratas en ese caso la colisión?

    Gracias de antemano.:D

  8. #8
    Miembro Nuevo
    Fecha de ingreso
    Jul 2011
    Mensajes
    18

    Re: BLITZ basic : colisiones

    Lo que me explicas lo veo así:

    Código:
    |plano /
    | /
    | <--- de ----> | <-------------------------------------------- radio ---------------*centro
    | \
    | \
    Estoy seguro que el algoritmo en pseudo-código que te mostré cubre ese caso.

    Ahora si entiendo la segunda parte. Pues una cosa es la detección de la colisión, y otra cosa será la simulación del efecto, como en las leyes de causa y efecto. Pues todo depende de lo que quieras simular. Por ejemplo, si la esfera es una bomba de jabón, y el triángulo es una estrella ninja, que pasara con la esfera? O si la esfera es de goma? O si es de vapor? O de acero? O si el material de los 2 objetos es magnético? O si la esfera representa la pólvora en una bala? Y que tal que sea un agujero negro supermasivo? Como ves todo depende de la reaccion del material, y usarías algoritmos diferentes para cada caso.

    Saludos!
    Última edición por marcoantap; 21-07-2011 a las 15:44

  9. #9
    Expulsado
    Fecha de ingreso
    Dec 2010
    Ubicación
    En matrix
    Mensajes
    1,681

    Re: BLITZ basic : colisiones

    Bueno realmente a lo que me refería es a esto

    Código:
    
    
     /
     /
     / este es el plano
     /
     /
     /
     -
     - -
     - R - esta es la esfera
     ------+-------
     - -
     -
    Bueno no se me da bien hacer esos dibujos,xD. Lo que digo es que estando el centro de la esfera a una distancia menor al radio, esta se encuentra fuera del plano.

    Lo de los algoritmos diferentes ya te entiendo. Pero yo me refiero a una colisión básica de desplazamiento.
    Es decir, tengo un personaje cualquiera (colision de esfera) y una pared, bueno pues si se acerca a ella y la colisiona se desplazara por ella (como en todos los juegos que hay). Pero si la pared es una esquina, y el movimiento de una de las caras hace que choque contra otra cara en el mismo bucle del programa, hay como haces? esa es la pregunta.

  10. #10
    Miembro Nuevo
    Fecha de ingreso
    Jul 2011
    Mensajes
    18

    Re: BLITZ basic : colisiones

    Con el dibujo esta más claro. Pero igual sigo pensando que el algoritmo cubre ese caso también. Ahora, puesto que los planos son infinitos, se podría restringir el área de contacto con el plano.

    Para la segunda parte, otro dibujo

    Código:
    T1: INICIO, DONDE PARED ESTA FORMADA POR POLIGONOS 1 Y 2:
    | __
    | Vx / \
    | ------> | |
    |POLIG. 1 ^ \____/
    | | Vy
    |____________|_________________
     Pared POLIG. 2
    
    
    T2: COLISION:
     |POLIG. 1
     |_
     / | \
     | |___|________________________
     \____/ POLIG. 2
    
    
    T2: REPOSICIONAMIENTO PARA POLIGONO 1
     |POLIG. 1
     |
     | __
     |/ \
     |______|_____________________
     \____/ POLIG. 2
    
    
    T2: REPOSICIONAMIENTO PARA POLIGONO 2
     |POLIG. 1
     | __
     |/ \
     | |
     |\____/______________________
     POLIG. 2
    Como me decías que necesitas la colisión polígono contra esfera, en este ejemplo una pared con esquina se mueve hacia una esfera. Al detectarse la colisón, se reposiciona la pared, restando la distancia que esta se incrusta en la esfera. Si no hay fricción se toman en cuenta sólo las componentes de la velocidad. La detección de la colisión y el reposicionamiento se hacen en el mismo bucle.
    Última edición por marcoantap; 23-07-2011 a las 02:40

  11. #11
    Expulsado
    Fecha de ingreso
    Dec 2010
    Ubicación
    En matrix
    Mensajes
    1,681

    Re: BLITZ basic : colisiones

    aaa, ok, graciass, ahora ya tengo una idea. Intentare hacerla en blitz.

  12. #12
    Miembro Avatar de Jhonatan00_00
    Fecha de ingreso
    Oct 2016
    Mensajes
    96

    Re: BLITZ basic : colisiones

    Madre mía que follón para hacer que Blitz3D detecte una puñetera colisión como debe de ser.

    Estoy buscando hilos antiguos sobre colisiones por el foro y por Internet y no encuentro nada util, todo parrafadas del copón para hacer de forma super complicada y chapucera algo que en cualquier engine del mundo debe de venir implementado.

    Yo soy de los puristas que piensan y defienden que todo lo debes de hacer desde cero, todo, programación, modelado, sonido, animación y texturizado, todo, pero es que con Blitz3D es imposible hacer un videojuego.

    Tengo el problema de que el protagonista solo puede ser una esfera como colisión y además de que esa esfera no se puede estirar ni recolocar en ninguna posición, sino que se pone en los pies del protagonista y cuanto más radio le das, más "gordo" es el personaje y eso implica que antes de que toque una pared ya haya colisionado o que como la esfera queda en los pies, choques contra un objeto con la cabeza al saltar y no lo coja.

    Le he dado veinte mil vueltas y es un asunto que erróneamente he ido dejando porque no sabía solucionar y he ido avanzando en el juego dejando ese punto y cuando ya tengo bastantes cosas (que me han costado también un huevo) hechas, me doy cuenta que no se puede hacer un videojuego con Blitz3D, no se puede.

    No se puede porque no es cuestión de trabajo, de ingeniartelas, es que tiene tantas limitaciones que dudo mucho que ningún videojuego por más retro que sea se haya podido programar con un engine así, es absurdo, es que el Mario 64 que es un videojuego de 1996 tiene unas físicas y unas colisiones que no hace Blitz3D ni de coña.

    ¿Alguien sabe como puedo hacer que el protagonista sea un cubo hablando de colisiones y que detecte las colisiones con otros cubos, esferas o polígonos? Al final acabaré dejando de lado el engine, porque tampoco he visto en Internet ni un solo juego profesional hecho con Blitz3D y será por algo.

    Saludos y feliz navidad.

  13. #13
    Senior Member Avatar de Soliman
    Fecha de ingreso
    Aug 2004
    Ubicación
    Torrevieja-Alicante
    Mensajes
    10,200

  14. #14
    Miembro Avatar de Jhonatan00_00
    Fecha de ingreso
    Oct 2016
    Mensajes
    96

    Re: BLITZ basic : colisiones

    Buenas noches Soliman, como siempre tu, ayudando al personal en todo lo posible, no sé qué sería del foro sin personas como tu, de verdad te lo digo.

    He estado mirando un poco por encima los videos de los enlaces que has colgado y algunos de ellos los había visto ya, otros no, pero la verdad es que siguen sin aportar nada nuevo al tema, o al menos yo no he visto nada de utilidad.

    Como no encuentre una solución para lo que queda de año me paso a Unity. La pena es el trabajo que voy a tener que tirar a la basura en programación, que no sabes lo que me costó por ejemplo programar el comportamiento de la cámara, que me llevó meses hacerla.

  15. #15
    Miembro Nuevo
    Fecha de ingreso
    Jul 2011
    Mensajes
    18

    Thumbs up Re: BLITZ basic : colisiones

    Como pasa el tiempo, aún recuerdo mis años con Blitz. Igual que tú "perdí" mucho tiempo creando mis propios códigos, pero la tecnología avanza no podemos evitarlo. Entender estas cosas en bajo nivel es lo que nos hace buenos programadores. Ahora si lo que quieres es terminar tus proyectos aprende a utilizar las herramientas modernas. Aprovecha lo que te dan. Compensa el tiempo que te ahorran mejorando la jugabilidad y el aspecto de tus juegos. Invierte más tiempo en entender el mercado de apps y serás recompensado.

Página 1 de 2 12 ÚltimoÚltimo

Temas similares

  1. tutores para crear videojuejos con blitz basic 3d
    Por Cibertronic en el foro Videojuegos
    Respuestas: 0
    Último mensaje: 25-09-2014, 06:20
  2. Colisiones con 3ds max
    Por javitooling en el foro Animación y Rigging
    Respuestas: 1
    Último mensaje: 07-03-2013, 18:58
  3. exportador de blender a blitz basic 3d
    Por Sadyk en el foro Videojuegos
    Respuestas: 1
    Último mensaje: 15-03-2009, 01:10
  4. Colisiones en x3d
    Por FANTASMAA2004 en el foro Quien eres tu - Aqui puedes presentarte
    Respuestas: 1
    Último mensaje: 13-03-2009, 12:02
  5. Problema con Collisions en Blitz Basic
    Por Alexs1888 en el foro Videojuegos
    Respuestas: 4
    Último mensaje: 23-08-2008, 21:40

Actualmente estos son sus permisos de publicación en el foro.

  • -No puedes crear nuevos temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes responder temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes subir archivos adjuntos al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes editar tus mensajes al no estar registrado o no haber iniciado sesión en el foro.
  •