Noticias

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

Por que afecta la posicion del eje z en la rotacion de la velocidad de un objeto

Iniciado por robertoboeckmann, Enero 02, 2018, 09:25:21 AM

Tema anterior - Siguiente tema
Hola gente buenas noches, estoy trabajando en las fisicas de un motor de juegos y tengo un problema que no logro resolver, quiza la respuesta sea simple pero llevo horas con ello y no logro entender el porque.
 
El problema es el siguiente:

 
 

         //Velocidad del cuerpo del personaje
            var v = _body.velocity;
            //Rota el angulo alrededor del eje y, Angle:-90
            var o = Quaternion.AngleAxis(Angle, Vector3.up);
            //Regresa la velocidad del cuerpo rotada en el angulo inverso
            var rv = Quaternion.Inverse(o) * v;
            //Regresa la velocidad para moverse
            var speed = Walk.Speed
            //Obtiene la acceleracion y desaceleracion de camino o del aire
            var acc = _Walk.Acceleration;
            //Si se esta moviendo movement:1 speed: 5 dt:deltatime acc:20
                rv.z = Mathf.Lerp(rv.z, _movement * speed, dt * acc);
             
            rv.x = 0;
            v = o * rv;
           
             
           
            _body.velocity = v;

 
Ese es todo el codigo, aclaro nada mas dentro del proyecto afecta el movimiento del objeto y su rotacion es de -90 grados igual que Angle, pero cuando la posicion inicial del objeto esta en 0 en el eje Z, se mueve tanto en x como en z y cuando tiene una cantidad en la posicion inicial del eje Z se mueve solo en x.
 
Si alguien tiene alguna respuesta para esto se lo agradeceria mucho.
 
 

Es un comportamiento "normal", un cuerpo fisico esta sometido a las leyes de la fisica/gravedad, si lo rotas no puedes esperar que no se mueva o que se quede quieto....
 
Lo que puedes hacer es marcar las casillas del freeze rotation en caso de no querer rotacion en alguno de los ejes. En caso contrario no tienes nada que hacer y es el comportamiento natural del objeto.
 
Segundo punto importante, NUNCA se debe modificar la velocidad de un objeto con fisicas, osea un rigidbody, salvo que lo tengas puesto como kinematico. La forma correcta y de no "confundir" al engine es aplicar fuerzas (addforce y similares), nunca ajustar a pelo el campo velocity

Digamos que para ciertos efectos modifico la velocidad y no es que la rotación no afecte pero en teoría si yo pongo que no mueva en el eje x que es en el que se convierte el z no debería moverse en ese eje pero es al poner en la posicion n y no la rotación donde afecta


Cita de: Eskema date=1514906422Segundo punto importante, NUNCA se debe modificar la velocidad de un objeto con fisicas, osea un rigidbody, salvo que lo tengas puesto como kinematico. La forma correcta y de no "confundir" al engine es aplicar fuerzas (addforce y similares), nunca ajustar a pelo el campo velocity
   


Acordate que velocity --> rigidbodyDinámico, si el rigidbody es kinematico chau fisicas, por lo que no habría velocity para modificar, solo te queda modificar el transform directamente.

Cita de: lightbug date=1515043227Acordate que velocity --> rigidbodyDinámico, si el rigidbody es kinematico chau fisicas, por lo que no habría velocity para modificar, solo te queda modificar el transform directamente.
   


Los rigidbody dinamicos NO se mueven alterando su velocity. La velocity es un campo "interno", un rigidbody movido correctamente SOLO se hace con addforce y similares. 
 
El velocity SOLO se debe usar para mover un rigidbody puesto como kinematico.
 
Cualquier intento de modificar la velocity en un rigidbody dinamico se carga el engine fisico y tiene que hacer mas calculos.
 
Pongamos un ejemplo para entenderlo. Tienes una pelota y la lanzas cuesta abajo. Tu le das un empujon (addforce) y la gravedad, friccion, etc hace el resto. Tu NO vas colocando la pelota cada centimetro en esa cuesta. Tu dejas que la fisica haga su trabajo.
 
Lo mismo se aplica a TODOS los engines fisicos, sea el de unity, el de unreal, el que sea.
 
¿Que es muy comodo modificar la velocidad?, hombre claro, comodo es muy comodo, pero luego las cosas no van como uno quiere, fallan detecciones, salen comportamientos inesperados y nos llevamos las manos a la cabeza pensando que falla.

Cita de: Eskema date=1515065265El velocity SOLO se debe usar para mover un rigidbody puesto como kinematico.
   


No, estás confundido con el kinemático, este solo se mueve por su transform cito de las referencias:
 
" The rigidbody will be under full control of animation or script control by changing transform.position "
 
 
 
Cita de: Eskema date=1515065265Los rigidbody dinamicos NO se mueven alterando su velocity
   


Cuando dije "velocity --> rigidbodyDinámico" no quise decir que debas moverlo así, quise decir que velocity solo existe en un dinámico,  Y si, force impulse y demás todo va a parar a velocity para hacer el step físico, por eso mencioné a velocity para generalizar.
 
Cita de: Eskema date=1515065265¿Que es muy comodo modificar la velocidad?, hombre claro, comodo es muy comodo,
   


Cómodo? no, todo lo contrario, lo cómodo es dejar que las físicas hagan lo que tengan que hacer y no tener que andar modificando velocity.
 



   
      ... pero luego las cosas no van como uno quiere, fallan detecciones, salen comportamientos inesperados y nos llevamos las manos a la cabeza pensando que falla.
   

[/quote]
 
No creo que esté "mal" ni sea algo prohibido, es más hacer esto (en situaciones unicas) nunca me dio comportamientos inesperados, ni uno, ni me agarré la cabeza, todo lo contrario, me evitó dolores de cabeza y las cosas funcionaron de la manera exacta a la que esperaba, siempre manteniedo el "movimiento real" (sin imponer velocity todo el tiempo), por eso lo menciono, es una posibilidad si estás buscando algo híbrido y sabés lo que estás haciendo, por lo tanto no lo prohibiría, pero si estás buscando realidad "al 100%" claro, prohibido tocar velocity.
 
Saludos
 
 
 
 

Cita de: lightbug date=1515090009No, estás confundido con el kinemático, este solo se mueve por su transform cito de las referencias:
   
   
      " The rigidbody will be under full control of animation or script control by changing transform.position "
   
   
      Saludos
   
   
       
   
   
       
   


Totalmente cierto, se me fue la pinza con tanto kinematic vs non-kinematic. Los kinematicos los mueves a pelo con el transform.
 
 
 
Lo demas pues lo que comentas, si tiras de velocity y sabes lo que haces todo funciona, pero veo a diario mucha gente forzando las cosas con velocity y luego quejandose porque los objetos no chocan bien, o no reaccionan como esperaban... es logico si no dejas hacer al engine fisico su trabajo xD

Cita de: Eskema date=1515104774Lo demas pues lo que comentas, si tiras de velocity y sabes lo que haces todo funciona, pero veo a diario mucha gente forzando las cosas con velocity y luego quejandose porque los objetos no chocan bien, o no reaccionan como esperaban... es logico si no dejas hacer al engine fisico su trabajo xD
   


Totalmente de acuerdo he visto cosas parecidas, sobretodo con intentos de character controllers version rigidbody.
 
 

Etiquetas: