Noticias

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

Comparar distancia entre dos puntos

Iniciado por R3N3, Septiembre 24, 2018, 10:16:40 PM

Tema anterior - Siguiente tema
Septiembre 24, 2018, 10:16:40 PM Ultima modificación: Septiembre 25, 2018, 07:36:17 AM por BAMF
Hola foro. Estoy tratando de calcular una distancia entre dos puntos, con el objetivo de mover un gameObject con vector3.slerp, desde su posiciòn actual hasta un punto y q al llegar a este ocurra una acciòn. La cosa es q ni vector3.Distance, ni restando la magnitud de las posiciones y comparàndolas, ni modo... si digo:
 

<<ManagerPlayer.instancia_ManagerPlayer.PlayerActivo.transform.position = Vector3.Slerp (ManagerPlayer.instancia_ManagerPlayer.PlayerActivo.transform.position, 
            ManagerPlayer.instancia_ManagerPlayer.posicionSalvada, 0.5f*Time.deltaTime);>>

 
no se supone q mi objeto en cuestiòn llegue EXACTAMENTE  al punto q quiero? y còmo comparar y saber el momento en q lo hace?  por favor...
 
y ya q estoy tengo otra duda, esta de "atachar" gameObjects. en la foto se puede ver como el pelo de mi personaje va a su bola, es hijo de la cabeza pero no es afectado por la rotaciòn de esta, solo se traslada y ya. Antes lo habìa hecho asì, es el caso de armas y manos, aunque eran personajes simples. Este  es con un sistema de huesos + avanzado y con animaciòn tipo humanoide, no se si esto afecta. Doble gracias
 

Cita de: R3N3 date=1537820200La cosa es q ni vector3.Distance, ni restando la magnitud de las posiciones y comparàndolas, ni modo... si digo:
   


No entendí que tiene que ver Distance con el Lerp, pero bueno, la distancia entre dos puntos es la famosa distancia euclídea:
 
https://es.wikipedia.org/wiki/Distancia_euclidiana
 
              (para 2 dimensiones)
 
No restando magnitudes:
 

sqrt(x1^2 + y1^2) - sqrt(x2^2 + y2^2)

 
 
 
Cita de: R3N3 date=1537820200no se supone q mi objeto en cuestiòn llegue EXACTAMENTE  al punto q quiero? y còmo comparar y saber el momento en q lo hace?  por favor...
   


Lerp va a estar interpolando todo lo que pueda. Personalmente prefiero mil veces las curvas de animación, las usas como funciones matemáticas y tenés control exacto del tiempo de llegada y de la distancia (o de inicio , medio y fin del movimiento). Lerp va a estar interpolando un punto entre actual y final calculo que hasta que no le dé más la resolución, si estás verificando "if(pos== posDestino) " probablemente nunca te de true, es muy común aplicar un threshold, por ej :
 

if(Vector3.Distance(player.transform.position,destino) < 0.001f )
{
// ...                              
}
/*
//En vez de ...
*/
if(player.transform.position == destino )
{
// ...                              
}
 

Cita de: R3N3 date=1537820200es hijo de la cabeza pero no es afectado por la rotaciòn de esta
   


Estás seguro que es Bip001 Head quien rota ? osea lo estás rotando vos o es una animación, porque si fuera una animación podría ser que rote "HeadNub" (supongo) y no Bip001 Head (?) ... o será cosa de huesos.

¿Seguro que estás implementando correctamente el slerp? 
 
* No le veo demasiado sentido al 0.5f*Time.deltaTime, claro que habría que ver el resto del código.

Cita de: debug date=1537881478¿Seguro que estás implementando correctamente el slerp? 
   
   
      * No le veo demasiado sentido al 0.5f*Time.deltaTime, claro que habría que ver el resto del código.
   


xD Ahora que lo veo no está actualizando el primer parámetro jaja. Es como decís, debería optar por actualizar el primero con la misma position o directamente ir acumulando el tercer parámetro:
 

transform.position = Lerp( from , to , Mathf.Clamp01(t) );
t += Time.deltaTime;

 
Y sí, el 0.5f es muy lento.
 
Con el tema ded Slerp, del manual:
 
Interpolates between a and b by amount t. The difference between this and linear interpolation (aka, "lerp") is that the vectors are treated as directions rather than points in space. The direction of the returned vector is interpolated by the angle and its magnitude is interpolated between the magnitudes of from and to.
 
Osea para movimiento lineal a A a B no se si quedará bien Slerp, yo usaría un Lerp, aunque nunca usé Slerp para estas cosas.

gracias a ambos, usè esta fòrmula pero para las tres dimensiones y va de maravillas , ahora si controlo bien la comparaciòn de los puntos y cuando mi gameObject llega al lugar deseado. En cuanto lo del tiempo, para hacer el Vector3.Slerp, de la forma q viene en la documentaciòn no me sirve, va muy ràpido, probè la forma q me diste y tampoco, sigue muy ràpido. Con el Lerp tambièn me fue igual. La distancia no es tanta, 0.5f es lento pero me funciona, igual lo cambiè, sustituì el 0.5 por la distancia entre los puntos, ahora comienza muy ràpido y termina muuuuuuuuyyy lento. creo q si le hago un Clamp a ese valor puedo limitar el mìnimo para q no baje tanto, ya lo probarè.
 
Lo del pelo del personaje sigue igual, tendrè q dejar calva a la pobre niña xq no veo otra soluciòn .
 
 
 
 
 
Cita de: lightbug date=1537846866              (para 2 dimensiones)
   


 

Septiembre 25, 2018, 07:07:16 PM #5 Ultima modificación: Septiembre 25, 2018, 07:14:21 PM por debug
No sirve asignar .5, ni tampoco la distancia, no debe ser un número fijo... del modo que implementas el slerp (lo mismo para el lerp) lo que obtienes es una curva de incrementos que no corresponde a la posición correcta.
 
En vez de un número fijo (.5 o la distancia) hay que usar una variable en el lerp que sume los deltaTime en cada cuadro y dividirla por el tiempo total.
 
Revisa el funcionamiento de la interpolación y busca en concreto interpolación lineal, que creo que estás errado en los conceptos, al principio puede dar a este tipo de confusiones.
 
Por otro lado, en el lerp(A,B,C) actualizas el parámetro A en cada cuadro. A y B deben ser fijos hasta que finalice el ciclo a interpolar.
 
 

Cita de: R3N3 date=1537892242En cuanto lo del tiempo, para hacer el Vector3.Slerp, de la forma q viene en la documentaciòn no me sirve, va muy ràpido, probè la forma q me diste y tampoco, sigue muy ràpido. Con el Lerp tambièn me fue igual. La distancia no es tanta, 0.5f es lento pero me funciona, igual lo cambiè, sustituì el 0.5 por la distancia entre los puntos, ahora comienza muy ràpido y termina muuuuuuuuyyy lento. creo q si le hago un Clamp a ese valor puedo limitar el mìnimo para q no baje tanto, ya lo probarè.
   


Un Lerp no se puede clasificar como rápido o lento, depende de por lo menos dos variables, osea que no te va a ir ni bien ni mal lo de la doc en específico como te está pasando.
 
Mi recomendación para lo que me imagino que querés hacer es no usar un "Lerp suelto" sino como te puse arriba controlarlo de alguna manera el parámetro t, por ej con una simple curva de animación va bien (No se si se aplicará para lo que querés), un Ejemplo controlando la posición (podrías decirle que controlas la velocidad o lo que quieras):
 

public AnimationCurve movementCurve = AnimationCurve.Linear(0,0,1,1);
public float targetTime = 5;
public Transform targetTransform;
public bool continueAfterTargetTime = false;
Vector3 fromPosition;
Vector3 toPosition;
float time = 0;
bool done = false;
 
void Start()
{
   if(toPosition == null)
      Destroy(this);
   
   fromPosition = transform.position;
   toPosition = targetTransform.position;
}
void Update(){
   if(done)
      return;
   
   time += Time.deltaTime;
   
   if(!continueAfterTargetTime){
      if(time > targetTime){
         time = targetTime;
         done = true;
      }
   }
   float curveTime = time / targetTime;
   float t = movementCurve.Evaluate(curveTime);
   transform.position = Vector3.Lerp(fromPosition , toPosition , t );
 
}

 

 
Algo así uso para las plataformas, esto con la posición pero también aplicado a escala y rotación ... too much fun man

Etiquetas: