Noticias

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

Mover objeto en la dirección que mira

Iniciado por xCarras, Febrero 24, 2017, 12:24:41 PM

Tema anterior - Siguiente tema
Buenas tengo un objeto tumbado(cono) el cual estoy rotando constantemente con un transform.Rotate en el eje Y. Me gustaría saber si hay alguna manera de saber hacia que angulo esta mirando siempre la punta del objeto cono y de decirle que se mueva en esa dirección al hacer click en la pantalla con un Add.Force o con otro tipo de movimiento?


Depende, si tu modelo de cono por default esta parado (y vertical, z frente) y lo tenes tumbado como decis quizas necesites un transform.up. Los "transform._ _ _ " te devuelven un vector relativo al objeto, no hay necesidad de calcular angulos Unity lo hace todo por ti.

Febrero 24, 2017, 04:59:54 PM #3 Ultima modificación: Febrero 24, 2017, 05:15:19 PM por xCarras
Cita de: lightbug date=1487939413Depende, si tu modelo de cono por default esta parado (y vertical, z frente) y lo tenes tumbado como decis quizas necesites un transform.up. Los "transform._ _ _ " te devuelven un vector relativo al objeto, no hay necesidad de calcular angulos Unity lo hace todo por ti.
   


Perdón pero soy nuevo en el 3D y me esta costando cogerle el punto al tema de los ejes (soy un poco zoquete sorry xD). Pues el cono esta tumbado con la punta mirando en el eje Z y esta rotando en su eje Y. No se a cual debería mirar si al X o al Zo es lo mismo? No logro entender porque con un transform.up  o forward lo va a mover siempre en la dirección donde este mirando..

Vos tenes basicamente dos formas de crear esos dezplamientos, con referencia local o desde el punto de vista del GameObject (el cono) y desde el punto de vista del origen del mundo o escena. Si es desde el GO(como seguramente es el mayor de los casos y el que necesitas) te manejas con "transform.(forward, up o right)", que es un vector que vale "lo que tiene que valer" para coincidir con, por ejemplo, el frente del cono, es decir que cuando haces:
 

transform.position + distancia * transform.forward;

 
Lo que estas haciendo es sumar a esa posicion global del GO un vector adaptado al frente del GO. (o podes hacer Translate como quieras)
 
Si hicieras:
 

transform.position + distancia * Vector3.forward;

 
Al objeto lo moverias respecto al frente del mundo, es decir al eje z, siempre fijo, es mas Vector3.forward esta previamente definido y significa  0,0,1, lo podes usar para otras cosas tambien ;)
 
https://docs.unity3d.com/ScriptReference/Vector3-forward.html
 
Lo que decia arriba de que depende del modelo, es que si originalmente (cuando arrastras el modelo en la escena) esta parado, y luego lo tumbas, tenes que moverlo respecto a la punta , es decir para arriba (transform.up). SI en cambio, hubiera estado acostado lo tenes que mover como dice @francoe1 con forward
 
Los ejes que te interesan en este caso son los locales, fijate arriba del editor que tenes un boton que pasas de global/local, pone local y fijate los colores, si el color verde coincide con la punta --> up
 
Es todo algebra vectorial nada raro, fijate en las referencias que esta todo.

Febrero 25, 2017, 02:36:03 AM #5 Ultima modificación: Febrero 25, 2017, 04:14:01 AM por xCarras
Cita de: lightbug date=1487953930Vos tenes basicamente dos formas de crear esos dezplamientos, con referencia local o desde el punto de vista del GameObject (el cono) y desde el punto de vista del origen del mundo o escena. Si es desde el GO(como seguramente es el mayor de los casos y el que necesitas) te manejas con "transform.(forward, up o right)", que es un vector que vale "lo que tiene que valer" para coincidir con, por ejemplo, el frente del cono, es decir que cuando haces:
   
   

transform.position + distancia * transform.forward;

   
      Lo que estas haciendo es sumar a esa posicion global del GO un vector adaptado al frente del GO. (o podes hacer Translate como quieras)
   
   
      Si hicieras:
   
   

transform.position + distancia * Vector3.forward;

   
      Al objeto lo moverias respecto al frente del mundo, es decir al eje z, siempre fijo, es mas Vector3.forward esta previamente definido y significa  0,0,1, lo podes usar para otras cosas tambien ;)
   
   
      https://docs.unity3d.com/ScriptReference/Vector3-forward.html
   
   
      Lo que decia arriba de que depende del modelo, es que si originalmente (cuando arrastras el modelo en la escena) esta parado, y luego lo tumbas, tenes que moverlo respecto a la punta , es decir para arriba (transform.up). SI en cambio, hubiera estado acostado lo tenes que mover como dice @francoe1 con forward
   
   
      Los ejes que te interesan en este caso son los locales, fijate arriba del editor que tenes un boton que pasas de global/local, pone local y fijate los colores, si el color verde coincide con la punta --> up
   
   
      Es todo algebra vectorial nada raro, fijate en las referencias que esta todo.
   


Vale vale lo voy entendiendo pero el primer codigo el local me daba error.
 
He probado con esto y funciona 
 

Vector3 rotar = new Vector3(0, 1, 0);
    void Update()
    {
        transform.Rotate(rotar*10 * Time.deltaTime);
        transform.position += transform.forward * Time.deltaTime;
    }

 
 

Cita de: xCarras date=1487986563Vale vale lo voy entendiendo pero el primer codigo el local me daba error.
   


Jaja por supuerto, estas sumando vectores y no asignando el resultado, lo puse simplemente para ver la forma matematica del asunto, Si con lo que pusiste funciona el cono ya estaba acostado supongo.
 
El:
 

Vector3 rotar = new Vector3(0, 1, 0)

 
Lo podes escribir como:
 

Vector3 rotar = Vector3.up;   //  valor predeterminado = <0,1,0>

 
Fijate que transform.Rotate rota al ojbeto que tiene el transform alrededor de un eje, fijate:
 
https://docs.unity3d.com/ScriptReference/Transform.Rotate.html
 
Entonces no es necesario poner el "rotar" en principio, sino pasarle al argumento el eje de interes (un valor fijo ya especificado). Si recien arrancas esto ni te va a interesar, pero esa es la ventaja de tener esos vectores ya definidos.
 

void Update()
{
  transform.Rotate(Vector3.up *10 * Time.deltaTime);
  transform.position += transform.forward * Time.deltaTime;   
}

 
Saludos

Genial, funciona genial gracias. Pero tengo asignado un componente rigidbody y he leido que no es correcto mover un rigidbody con estas funciones. Es correcto?

Cita de: xCarras date=1488159041Genial, funciona genial gracias. Pero tengo asignado un componente rigidbody y he leido que no es correcto mover un rigidbody con estas funciones. Es correcto?
   


Asi es, aunque si tenes el tipico personajeparado es muy comun freezar la rotacion en todos los ejes menos el Y, es decir que podes rotarlo con Rotate que no tenes problema, pero para trasladarlo debes usar algun metodo para desplazar rigidbodies.
 
saludos

Etiquetas: