Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Ayuda - Fisica

Iniciado por enelmenu, Junio 26, 2017, 05:10:05 AM

Tema anterior - Siguiente tema
Junio 26, 2017, 05:10:05 AM Ultima modificación: Junio 26, 2017, 05:27:09 AM por enelmenu
Hola muchach@s!
 


Bueno, resulta que estoy en pleno desarrollo y me encuentro con un problema no menor, y no se me ocurre nada para poder solucionarlo..........

Aca un video de mi problema
 


   

 
Bueno como ven...

Necesito empujar un objeto en tiemporeal (osea basicamente cuando esta ejecutandose), y no puedo, como que  aveces lo transpasa, aveces no... :/ no conosco la causa de este problema....

No tiene nada que ver que mi cubo tenga scripts de movimiento, de echo tambien hice la prueba con un cubo limpio, donde meto un rigidbody y me pasa exactamente lo mismo... Alguna solucion ante esto?...

Nose como definir el problema, pero necesito que dicho objeto (en este caso mi cubo) NUNCA sea traspasado por NADA.... hay alguna forma de elevar el nivel de proteccion de mi boxcollider? para que NUNCA sea transpasado?
 
Tambien probe, desactivandole los freeze rotation a mi rigidbody, pero de igual manera sige transpasando

Junio 26, 2017, 07:16:28 AM #1 Ultima modificación: Junio 26, 2017, 07:17:54 AM por lightbug
Cita de: enelmenu date=1498446605hay alguna forma de elevar el nivel de proteccion de mi boxcollider? para que NUNCA sea transpasado?
   


Yo no me preocuparia por el nivel de proteccion ese, porque por lo que se ve en el video los movimientos que haces no son taaan bruscos, aunque si puede ser que pase y un objeto traspase a otro (revisa un script que se llama DontGoThroughThings o algo por el estilo).
 
Ahora tene en cuenta que:
 
-> Si el objeto tiene un rigidbody dinamico olvidate de moverlo cambiando la posicion como haces en el video, esa es la idea, todo lo hace las fisicas.
 
-> Si es kinematico todo lo hace el Transform
 
Por eso el metodo de prueba que hiciste en el video no me dice nada por lo estas haciendo de manera "ilegal". Si queres que nunca jamas traspase nada usa transforms con colisiones propias usando raycasts (de donde sale el script q te pase arriba). Ahi ya te estas metiendo mas en el mundo del CharacterController, es por esto (y otras cosas mas) que es lo mas usado para controlar un Jugador.
 
 
 
 

Cita de: lightbug date=1498454188revisa un script que se llama DontGoThroughThings o algo por el estilo
   


Okaa ahora leo sobre eso.
 
Cita de: lightbug date=1498454188el video no me dice nada por lo estas haciendo de manera "ilegal".
   


Entonces... vos decis que aplicando un cambio al transform de mi objeto que empuja mediante script, no tan bruscamente, va a empujar mi player de una manera coherente? sin cosas raras? eso entendi con el ultimo parrafo

La velocidad influye en la capacidad de detección de un objeto, si la colisión se calcula 50 veces por segundo y mueves un objeto a 50 metros por segundo, la posibilidad de atravesar un objeto de un metro es muy grande, eso es debido a que a unity no le da tiempo a calcular la colisión. Creo que si se pone la detección a dinámica  (ContinuousDynamic

), puede mejorar, pero se consume mas recursos, también se pueden aumentar las veces que la física calcula las colisiones en un segundo.  En ningún caso puede ser la solución ya que el ordenador tiene un limite de velocidad a la hora d calcular la colisión. Al final siempre fallara, si los objetos se mueven demasiado deprisa.

Junio 26, 2017, 07:41:17 AM #4 Ultima modificación: Junio 26, 2017, 07:45:04 AM por lightbug
Cita de: enelmenu date=1498454780Entonces... vos decis que aplicando un cambio al transform de mi objeto que empuja mediante script, no tan bruscamente, va a empujar mi player de una manera coherente? sin cosas raras? eso entendi con el ultimo parrafo
   


Desde el momento que decidiste poner tu rigidbody en dinamico decile bye bye a: Translate, Rotate , position, rotation , Update (para movimientos)...
 
Es decir que probando asi como probas no dice nada, yo tambien tengo cosas andando al 100%, pero si hago lo que hiciste vos me va a dar errores, colisiones mal hechas etc.
 
Pensalo al transform = posicion + rotacion+ escala , eso se calcula una matriz que sera mandada al shader/gpu y de ahi a tu monitor. Lo que hacen las fisicas (con RB dinamicos) es calcular donde deberia estar un objeto basandose en velocidad, gravedad, rebote, colision con otros, etc y una vez que calculó todo determina esa matriz de arriba , es decir que el master es el transform, el que da el Ok, ---> si vos andas modificando directamente esa matriz (como por ejemplo en el video) te vas a cagar en las fisicas, entonces un objeto se ve que paso por encima de otro cuando en condiciones normales no deberia por ejemplo.
 
Aunque agrego puede ser que esto pase en condiciones normales fisicas (q manera de inventar jaja), por ejemplo un proyectil a alta velocidad pasa una pared, en este caso tu proteccion que mencionas en valida de usar, como te dice tambien @Miguel_Angel el usar deteccion continua ayuda, yo la he usado y a funcionado, te consume mas claro.
 
 

Cita de: Miguel_Angel date=1498455562La velocidad influye en la capacidad de detección de un objeto, si la colisión se calcula 50 veces por segundo y mueves un objeto a 50 metros por segundo, la posibilidad de atravesar un objeto de un metro es muy grande, eso es debido a que a unity no le da tiempo a calcular la colisión. Creo que si se pone la detección a dinámica  (ContinuousDynamic

      ), puede mejorar, pero se consume mas recursos, también se pueden aumentar las veces que la física calcula las colisiones en un segundo.  En ningún caso puede ser la solución ya que el ordenador tiene un limite de velocidad a la hora d calcular la colisión. Al final siempre fallara, si los objetos se mueven demasiado deprisa.
   


Para estos casos lo ideal es guardar la ultima posición del objeto y hacer raycast desde la antigua posición a la posición actual y si el rayo golpea con algo hacer lo que se deba (si es un proyectil impactar).

Cita de: TheBullet date=1498476895Para estos casos lo ideal es guardar la ultima posición del objeto y hacer raycast desde la antigua posición a la posición actual y si el rayo golpea con algo hacer lo que se deba (si es un proyectil impactar).
   


Si, tienes razón, al final hay que usar el raycast para todo.

Este problema se suele producir por una relación directa entre velocidad y escala si la escala es muy grande en función de la velocidad se atraviesan los colliders, en tu caso veo que las escala no son grandes, así que supongo que es porque la colisión se hace con mucha velocidad, al final, como te han dicho por aquí, la solución a los problemas de las físicas siempre es el Raycast. aún recuerdo un pinball que hice, en el que cuando la bola cogía velocidad empezaba a atravesar cosas y me llevaba por el camino de la amargura,

Julio 04, 2017, 01:31:33 AM #8 Ultima modificación: Julio 04, 2017, 01:33:08 AM por enelmenu
Cita de: FNP date=1499070037en el que cuando la bola cogía velocidad empezaba a atravesar cosas y me llevaba por el camino de la amargura,
   


Buena data @FNP!!! gracias...

Y sii compadesco tu amargura jajaja, yo se que en el videoo hago un movimiento ilegal y lo movi bastante rapido jajajaj estaba cebado por la musica, pero de igual manera moviendolo desde script lento o rapido me pasaba lo mismo....
 
Lo que hice fue agregar rigidbody para que no transpase tanto.... Siendo sincero nose la causa de esto, por que con rigidbody mi collider es mas "resistente" segun tengo entendido el rigidBody maneja la gravedad y la masa, la fisica, pero el box collider es otra cosa aparte no?...

 
 
En fin... navengado por varios lugares, saque la conclucion que unity no tiene "grandes" control de colisiones.... Ya que a la minima presion que ejercer a un collider transpasa... sin mas..., osea hay miles de otras formas de actuar y reaccioner, pero transpasa... podria bugearse, volverse loco, saltar para todos lados, pero como que deja mucho que hblar las colisiones de unity.... nose digo es mi opinion!
 
Saludos!! abrazoo! <3

El problema siempre es la relación velocidad / escala. Imagina un enanito, da pasos pequeños por lo que se encontrará con el collider, ahora imagina un gigante, da un paso muy grande, así que es posible que se pase de largo el collider o parte de el y aunque colisione lo haga por ejemplo con la parte de atrás del objeto. Cambien puede ser que el enanito sea Sppedy Gonzales, seguro que también atraviesa el collider, dado que entre fotograma y fotograma el desplazamiento da un salto, no es suave debido a que va muy rápido, es decir en un fotograma está antes del colider y en el siguiente lo ha pasado y ya no lo detecta, esto solo pasa cuando el objeto coge una gran velocidad. Siempre hay que tratar de trabajar con escalas y velocidades reales y si da problemas intentar trabajar a escala mas pequeña. Aún así siempre se sufrirá con el motor de físicas, es un hecho :D :D :D 
 
 

Cita de: enelmenu date=1499124693Lo que hice fue agregar rigidbody para que no transpase tanto.... Siendo sincero nose la causa de esto, por que con rigidbody mi collider es mas "resistente" segun tengo entendido el rigidBody maneja la gravedad y la masa, la fisica, pero el box collider es otra cosa aparte no?...

       
   
   
       
   


Cualquier objeto que tenga colliders debe tener un rigidbody. El porqué es muy sencillo. Si collisionas un objeto con otro como vas a saber el resultado si no sabes las masas de ambos objetos? El rigidbody maneja la física del objeto y para que se reproduzca una colisión se tiene que calcular con las físicas o sea, con los rigidbody. Los colliders solo avisan al sistema de físicas que ha habido una colisión.

Etiquetas: