Jump to content
UnitySpain
enelmenu

Ayuda - Fisica

Recommended Posts

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

Edited by enelmenu

Share this post


Link to post
Share on other sites
9 hours ago, enelmenu said:

hay 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.

 

 

Edited by lightbug

Share this post


Link to post
Share on other sites
Ahora, lightbug said:

revisa un script que se llama DontGoThroughThings o algo por el estilo

Okaa ahora leo sobre eso.

Ahora, lightbug said:

el 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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
7 hours ago, enelmenu said:

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

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.

 

Edited by lightbug

Share this post


Link to post
Share on other sites
hace 5 horas, Miguel_Angel said:

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.

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).

Share this post


Link to post
Share on other sites
hace 29 minutos, TheBullet said:

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).

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

Share this post


Link to post
Share on other sites

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,

Share this post


Link to post
Share on other sites
hace 10 horas, FNP said:

en 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

Edited by enelmenu

Share this post


Link to post
Share on other sites

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 

 

Share this post


Link to post
Share on other sites
On 3/7/2017 at 1:31, enelmenu said:

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?...
 

 

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.

Share this post


Link to post
Share on other sites

×
×
  • Create New...