Jump to content
Sign in to follow this  
Jhonatan00_00

ANSWERED Programar movimiento oscilatorio (SOLUCIONADO)

Recommended Posts

Buenas tardes, a ver si alguien sabe darle una solución a este problemilla de cálculo de Unity. He programado un movimiento oscilatorio de arriba a abajo para hacer este efecto de objeto mágico flotando que se ven en muchos juegos y no se por que, Unity da errores de cálculo. Si hago pública la variable que regula la velocidad a la que sube y baja y la observo, a veces se sale de los parámetros indicados y esto provoca que el objeto, muy poco a poco comience a subir mas de la cuenta hasta llegar al cielo o al revés, es absurdo.

Cuelgo parte del script que he programado para esto, para que vean como funciona y me digan por que puede estar fallando:

        switch (Evento) {
        caso 1:
            Fuerza_Negativa = Fuerza_Negativa + 0.01f * Time.deltaTime;
            si (Fuerza_Negativa> 0.005f) {
                Evento = 2;
            }
            romper;
        caso 2:
            Fuerza_Negativa = Fuerza_Negativa - 0.01f * Time.deltaTime;
            si (Fuerza_Negativa <-0.005f) {
                Evento = 1;
            }
            romper;
        }

        transform.position = new Vector3 (transform.position.x, transform.position.y + Fuerza_Negativa, transform.position.z);

He probado a clampear los valores máximo y mínimo de la variable que mueve el objeto, pero sigue teniendo el mismo fallo.

¿Alguna idea ?.

Un saludo.

Edited by Jhonatan00_00

Share this post


Link to post
Share on other sites

Para lograr este movimiento se puede realizar usando una función seno.

transform.position = startPosition + (Vector3.up * sin(Time.time) * amplitud);

 

Share this post


Link to post
Share on other sites

Buenas tardes, llevo mas de una hora intentándolo y no encuentro la solución, ¿podría explicarlo mas detalladamente?.

Un saludo.

Share this post


Link to post
Share on other sites

Es simple, tan solo tienes que asignar al eje que necesites el  movimiento oscilatorio, el seno del tiempo. Para que lo entiendas, esta es la representación gráfica del seno

Seno (trigonometría) - Wikiwand

Edited by leocub58

Share this post


Link to post
Share on other sites

Buenas tardes, pues agradezco mucho sus esfuerzos pero sigo sin entenderlo 🤣 

Si yo escribo lo siguiente:

transform.position = transform.position + (Vector3.up * 1 (Time.time) * 2);

Lo que va a hacer es que suba hacia arriba a una velocidad de 1, pero no va a bajar nunca... ¿como sería la ecuación?. Se me ocurren muchas formas de solucionarlo pero no con una ecuación.

Share this post


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

Buenas tardes, pues agradezco mucho sus esfuerzos pero sigo sin entenderlo 🤣 

Si yo escribo lo siguiente:


transform.position = transform.position + (Vector3.up * 1 (Time.time) * 2);

Lo que va a hacer es que suba hacia arriba a una velocidad de 1, pero no va a bajar nunca... ¿como sería la ecuación?. Se me ocurren muchas formas de solucionarlo pero no con una ecuación.

Te falta el seno.

no es

(Vector3.up * 1 (Time.time) *2)

sino

(Vector3.up *  Mathf.Sin(Time.time) *2)

 

http://www.ehu.eus/juancarlos.gorostizaga/apoyo/func_trigonom.htm#:~:text=El seno (sin ó sen,al ángulo y la hipotenusa.
https://docs.unity3d.com/ScriptReference/Mathf.Sin.html

Edited by leocub58
  • Like 1

Share this post


Link to post
Share on other sites

Buenos días, aunque no queda exactamente igual que de la forma que yo lo había programado, queda bien. Solo me falta dejar el juego funcionando un rato para ver si el item se desplaza de donde tiene que hacerlo y termina por las nubes o si ha funcionado, porque según he leído en el manual de Unity, Mathf.Sin también puede fallar.

Gracias!!. 😄

Share this post


Link to post
Share on other sites
2 hours ago, Jhonatan00_00 said:

Buenos días, aunque no queda exactamente igual que de la forma que yo lo había programado, queda bien. Solo me falta dejar el juego funcionando un rato para ver si el item se desplaza de donde tiene que hacerlo y termina por las nubes o si ha funcionado, porque según he leído en el manual de Unity, Mathf.Sin también puede fallar.

Gracias!!. 😄

Por más de que falle nunca se crearía un offset por que estás sumándolo a una posición cacheada, o eso deberías.

Share this post


Link to post
Share on other sites
On 11/13/2020 at 2:55 PM, Jhonatan00_00 said:

transform.position = new Vector3 (transform.position.x, transform.position.y + Fuerza_Negativa, transform.position.z);

Hola, una cosita, si a ese objeto lo rotás ya no te sirve nada el efecto. Es un típico error pensar en términos absolutos, osea en x, y o z. Lo mejor es pensar en términos relativos, osea respecto al objeto principal. Para esto vas a tener que usar direcciones, por ej para el seno:

sin( ωt + φ )

la fase φ vamos a hacerla cero para simplificar.

en términos de velocidad angular:    sin( ωt )  , ω = cuantos radianes hace en un segundo  (Ej 4π (1 vuelta tiene 2π) en 1 seg:  ω = 4π -->  sin( 4πt ) )

en términos de frecuencia: sin( 2πft ) , f = cuantas vueltas hace en un segundo   (Ej 2 vueltas en 1 seg:  f = 2 -->  sin( 4πt ) )

en términos de período: sin( 2πt /T ) , T = cuantas segundos tarda en hacer una vuelta  (Ej 1/2 seg para 1 vuelta en 1 seg:  T = 1/2 -->  sin( 4πt ) )

// Ej: si la vuelta tarda 2 segundos, fase cero
// initialPosition la tenés que guardar en Start o Awake
// oscDir podría ser transform.up

transform.position = initialPosition + Mathf.Sin( ( 2 * Mathf.PI * Time.time ) / 2f ) * oscDir;

Saludos.

  • Like 1

Share this post


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

×
×
  • Create New...