Jump to content
Sign in to follow this  
R3N3

Comparar distancia entre dos puntos

Recommended Posts

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...:49_triumph: 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 :91_thumbsup::91_thumbsup:

error.jpg

Share this post


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

La cosa es q ni vector3.Distance, ni restando la magnitud de las posiciones y comparàndolas, ni modo...:49_triumph: 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

92d49b1b717fc1b18de1b7bebddc78d56b9ac79c              (para 2 dimensiones)

No restando magnitudes:

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

 

7 hours ago, R3N3 said:

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

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 )
{
	// ...                               
}
  
7 hours ago, R3N3 said:

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
41 minutes ago, debug said:

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

Share this post


Link to post
Share on other sites

gracias a ambos, usè esta fòrmula pero para las tres dimensiones y va de maravillas :91_thumbsup:, 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 :7_sweat_smile:.

 

 

12 hours ago, lightbug said:

92d49b1b717fc1b18de1b7bebddc78d56b9ac79c              (para 2 dimensiones)

 

Share this post


Link to post
Share on other sites

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.

 

Edited by debug
  • Like 2

Share this post


Link to post
Share on other sites
1 hour ago, R3N3 said:

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

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


	}

anim.gif

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

  • Like 2

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...