Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Mover Gráfico Hacia Un Objetivo. ¿cómo?

Iniciado por J_F_NASH, 14 de Febrero de 2005, 01:46:14 PM

« anterior - próximo »

J_F_NASH

 Necesito mover el punto A hacia el punto B.
El movimiento a de ser constante en todo momento.
He probado la fórmula:
A += (distancia entre A y B) / Velocidad;
... y efectivamente A se dirije a B... pero va DECELERANDO conforme lo alcanza. Pero yo necesito un movimiento CONSTANTE.

¿Alguien tiene idea?


S2.

StraT

 Veamos, e/v = t

Estas sumando cada vez el tiempo restante hasta el objetivo, que al ser cada vez menor, decelera.

Es tan simple como sumar un numero de pixels fijo cada vuelta de bucle.

Ej: A++, A+5, A+25

Saludos
quot;Solo hay dos cosas infinitas, el universo y la estupidez humana, aunque de lo primero no estoy muy seguro\\\" Einstein

ethernet

 
A + t*(B-A) variando t en el intervalo [0,1] a la velocidad y con la uniformidad que quieras.
A y B puedes ser cualquier cosa que tenga suma,  resta y producto por escalar definido, por ejemplo un vector 3d o 2d.

saludos

tiutiu

 Lo que ocurre es que no normalizas el vector direccion BA
la ecuacion seria

nuevaPos = viejaPos + Normalizar(B-A)*Velocidad

Donde todos son vectores excepto velocidad q es un escalar.
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

J_F_NASH

 "Normalizar(B-A)"
¿A que te refieres con normalizar?


S2.

BeRSeRKeR

 
Cita de: "J_F_NASH""Normalizar(B-A)"
¿A que te refieres con normalizar?


S2.
Si lo haces como te ha dicho ethernet (interpolación lineal) no hace falta normalizar, de lo contrario necesitarás una función como ésta para normalizar el vector cuyo origen es el punto A y destino es el punto B.

IFXVECTOR3* IFXVec3Normalize
 ( IFXVECTOR3 *pOut, const IFXVECTOR3 *pV )
{
 float   denom;
 
 denom = sqrtf(pV->x * pV->x + pV->y * pV->y + pV->z * pV->z);
 if (fabs(denom) < IFX_EPSILON) return NULL;
 
 denom = 1.0f / denom;
 
 pOut->x = pV->x * denom;
 pOut->y = pV->y * denom;
 pOut->z = pV->z * denom;
 
 return pOut;
}


Esa función normaliza un vector 3D, si fuera 2D sería igual pero quitando la componente Z.

Saludos.

PD: IFX_EPSILON sería un valor cercano a cero (yo lo tengo a 1e-5f) para evitar la división por 0.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

J_F_NASH

 He probado la fórmula de ethernet. Esto es lo que le indico a A:
A = A + 0.1*(B-A)
Pero ocurre lo de siempre, la velocidad de A va bajando hasta cero.
Imagino que en cada pasada debo cambiar el valor 0.1, pero no lo tengo nada claro.

¿Podeis poner un ejemplo SENCILLO?

S2.

jelorol

 Hay un error en lo que haces.

Guárdate la posición INICIAL de lo que quieres mover en la variable "posicion_inicial", por ejemplo.

y luego, en cada pasada haces:

posicion=posicion+0.1*(posicion_final - posicion_inicial)

senior wapo

 En la primera pasada:
pasitoPalanteMaria = (B-A) / longitudZancada
A = A + PasitoPalanteMaria


En las demas pasadas:
A = A + PasitoPalanteMaria


...donde longitudZancada es la distancia a cubrir en 1 unidad de tiempo. Realmente deberias usar  
A = A + (PasitoPalanteMaria * ajusteFPS)

donde ajusteFPS está entre 0 y 1 y representa cuanto tiempo ha pasado desde la ultima pasada, dependiento de la velocidad de proceso


Pogacha

 Que complicado!
Me parece que te hace falta mas base matematica, aqui te han dado mas de 3 soluciones, ahora te toca a ti estudiarlas por tu cuenta.

La error mas grave esta en el uso de la funcion acumulador, los mas facil es usar velocidad como vector y punto.

v = (B - A) / iteraciones; // de ahora en mas V no se toca mas

dibujar_punto(A); // inicial
for(int i=0; i<iteraciones; i++)
{
  A += V;
 dibujar_punto(A);
}

al terminar el bucle A sera igual a B

Saludos

vicho

 yo lo veo simple la idea seria V=Normalize(D)*Rapidez/tiempo

D=B-A
y que mas?
si el pto se mueve pues vuelves a normalizar D y listo

J_F_NASH

 Ok, gracias por todas las explicaciones. Ahora si.




S2.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.