Jump to content
Sign in to follow this  
racsosoi@yahoo.es

ANSWERED [Ayuda] Como añadir una direccion sin añadir una fuerza?

Recommended Posts

Muy buenas a todos.

tengo una duda que no logro solucionar, 
mi problema es que añado una fuerza con addforce y un vector3 a un objeto, pero de esta manera añado la fuerza y la direccion de la fuerza todo con el vector3 y yo quiero poner la dirección por un lado y la fuerza por otro.

Sabéis como lo podria hacer?

He probado haciendo un normalize () pero no me funciona, me sigue añadiendo también la fuerza y aparte del normalize no se que mas hay para hacer esto.

Lo tengo así:

 

DirectionDer = (PosManoDer - PosPelota);

DirectionDer.Normalize (); 
rbPelota.AddForce (DirectionDer * (FuerzaActual * MultiplicaFuerza));

Antes tenia el normalize en la primera linea pero para probar lo quite de la primera linea e hice una nueva solo para aplicar el normalize, pero no cambio nada)
La fuerza que se le tiene que aplicar me viene de dos lugares diferentes


muchas gracias de antemano . 
Creo que me he explicado bien: P

Edited by racsosoi@yahoo.es

Share this post


Link to post
Share on other sites

1 - La dirección siempre se define como "Factor de escala", eso quiere decir que debe tener un rango entre -1,1 lo cual realiza correctamente Normalize();

2 - Tu vector de Fuerza variable será multiplicado por la escala. Fuerza * Direction

Para que no se aplique fuerza deberías ajustar el valor de Fuerza.

¿Qué resultado espera obtener? Es complicado interpretar tu problema.

Share this post


Link to post
Share on other sites
8 hours ago, francoe1 said:

1 - La dirección siempre se define como "Factor de escala", eso quiere decir que debe tener un rango entre -1,1 lo cual realiza correctamente Normalize();

2 - Tu vector de Fuerza variable será multiplicado por la escala. Fuerza * Direction

Para que no se aplique fuerza deberías ajustar el valor de Fuerza.

¿Qué resultado espera obtener? Es complicado interpretar tu problema.

yo tengo una variable donde solo quiero tener la dirección, porque la fuerza que se debe aplicar a esa dirección la cojo por otra parte.

lo que me ocurre ahora que es lo que no quiero que pase, es que la fuerza que yo le aplico se ve muy afectada de según como se coja la dirección 

básicamente quiero coger una dirección que no ponga fuerza, solo dirección, o en su lugar que ponga una fuerza mínima y siempre la misma fuerza para yo poderla controlar, porque ahora cada vez me aplica una fuerza diferente (por culpa de como cojo la direccion, pero la tengo que cojer de esta manera) y asi es imposible de controlar.

Perdón por si no me explico bien

Share this post


Link to post
Share on other sites
20 hours ago, racsosoi@yahoo.es said:

yo quiero poner la dirección por un lado y la fuerza por otro.

¿No es esto lo que estás haciendo (pasando ambos como argumento)?

20 hours ago, racsosoi@yahoo.es said:

Lo tengo así:
 


DirectionDer = (PosManoDer - PosPelota);

DirectionDer.Normalize (); 
rbPelota.AddForce (DirectionDer * (FuerzaActual * MultiplicaFuerza));

Está bien, por lo menos la dirección es una dirección (normalizada), y la fuerza hace de magnitud (similar a la forma polar de un vector).

11 hours ago, racsosoi@yahoo.es said:

básicamente quiero coger una dirección que no ponga fuerza, solo dirección, o en su lugar que ponga una fuerza mínima y siempre la misma fuerza para yo poderla controlar, porque ahora cada vez me aplica una fuerza diferente (por culpa de como cojo la direccion, pero la tengo que cojer de esta manera) y asi es imposible de controlar.

AddForce agrega (importante, no setea, suma cuadro a cuadro) la fuerza que le pases. Fuerza es masa x aceleración, la masa es la fija que tenés en el rigidbody, así que terminas tocando la aceleración de una manera u otra (por lo menos usando el modo Force que viene por defecto). Pasar una dirección como vector te va a agregar una fuerza de magnitud 1 en la dirección especificada. Ejemplo:

m = 2 ,  F = 1 ...  F = m x a  -->  a = F / m --> a = 0.5 --> acelerar 0.5 m/s por cada segundo que le apliques esto.

Me parece que el problema no tiene que ver ni con la fuerza, ni con la dirección, me juego a que AddForce (Force mode) o no es la herramienta que necesitas, o directamente necesitas más información a la hora de saber si necesitas variar la fuerza o no (y así controlar mejor tu RB). Probá con cambiar la velocidad directamente, usando rbPelota.velocity , o directamente el modo VelocityChange de AddForce. Quizás de esta forma puedas controlar el rb como deseas.

 

Share this post


Link to post
Share on other sites
5 hours ago, lightbug said:

¿No es esto lo que estás haciendo (pasando ambos como argumento)?

Está bien, por lo menos la dirección es una dirección (normalizada), y la fuerza hace de magnitud (similar a la forma polar de un vector).

AddForce agrega (importante, no setea, suma cuadro a cuadro) la fuerza que le pases. Fuerza es masa x aceleración, la masa es la fija que tenés en el rigidbody, así que terminas tocando la aceleración de una manera u otra (por lo menos usando el modo Force que viene por defecto). Pasar una dirección como vector te va a agregar una fuerza de magnitud 1 en la dirección especificada. Ejemplo:

m = 2 ,  F = 1 ...  F = m x a  -->  a = F / m --> a = 0.5 --> acelerar 0.5 m/s por cada segundo que le apliques esto.

Me parece que el problema no tiene que ver ni con la fuerza, ni con la dirección, me juego a que AddForce (Force mode) o no es la herramienta que necesitas, o directamente necesitas más información a la hora de saber si necesitas variar la fuerza o no (y así controlar mejor tu RB). Probá con cambiar la velocidad directamente, usando rbPelota.velocity , o directamente el modo VelocityChange de AddForce. Quizás de esta forma puedas controlar el rb como deseas.

 

primero muchisimas gracias por tu ayuda.

la verdad es que esto me esta llevando mas dolores de cabeza de lo que esperaba

he probado todos los metodos y en todos me pasa lo mismo.

lo he simplificado para que sea mas facil de entender y comprobar si funciona correctamente, ahora lo tengo asi

rbPelota.velocity = directionDer.normalized * 100f;

y cada vez que se aplica esta velocidat la pelota sale a una velocidad diferente y aleatoria, lo que yo necesito es que la pelota siempre salga a la misma velocidad pero la direccion a la que se sale sea aleatoria

que ocurre, que la direccionDer es aleatoria (es donde tengo el principal problema pero tiene que ser asi) y no es lo mismo multiplicar 0.1 * 100 que 1 / 100, por lo que cuando la direccion aleatoria es 1, la pelota sale con mucha mas fuerza que cuando es 0.1 y esto me pasa tando con AddForce como con velocity o el forcemode  velocitychange

el problema es que la fuerza o velocidad que yo le pongo  lo multiplico por la direccion, y esto lo que hace es que la fuerza se me haga aleatoria tambien, pero no se de que otra manera lo puedo hacer, realmente por lo que quiero y me has explicado ceo que es mejor utilizar el velocity y no el addforce, pero utilizar el velocity no soluciona este problemilla.

espero haberme podido explicar mejor ahora 😛
 

Share this post


Link to post
Share on other sites

Ten en cuenta que al normalizar un vector (1, 1) es valor obtenido es de (.7, .7) Lo que se me ocurre podría generar esa variación de velocidad.

Para que esto no suceda quizás deberías crear un redondeo de cada elemento del vector obteniendo el valor de 1 o -1

Vector2 dir = new Vector2(50, 60);
dir.Normalize();
dir.x = Mathf.Floor(dir.x);
dir.y = Mathf.Floor(dir.y);

 

Share this post


Link to post
Share on other sites
4 hours ago, francoe1 said:

Ten en cuenta que al normalizar un vector (1, 1) es valor obtenido es de (.7, .7) Lo que se me ocurre podría generar esa variación de velocidad.

Para que esto no suceda quizás deberías crear un redondeo de cada elemento del vector obteniendo el valor de 1 o -1


Vector2 dir = new Vector2(50, 60);
dir.Normalize();
dir.x = Mathf.Floor(dir.x);
dir.y = Mathf.Floor(dir.y);

 

lo he probado asi:

  Vector2 dir = new Vector2(directionDer.x, directionDer.y);
        dir.Normalize();
        dir.x = Mathf.Floor(dir.x);
        dir.y = Mathf.Floor(dir.y);

 rbPelota.velocity = dir * 100f;

pero me hace exactamente lo mismo que me hacia antes, lo implementarías de otra manera?

Share this post


Link to post
Share on other sites

Realiza un video corto con el problema, realmente no entiendo que puede estar pasando.

La velocidad deberías asignarla una sola vez, si estas asignándola constantemente puede que ese sea tu problema. 

Share this post


Link to post
Share on other sites
On 1/29/2021 at 12:57 AM, francoe1 said:

Realiza un video corto con el problema, realmente no entiendo que puede estar pasando.

La velocidad deberías asignarla una sola vez, si estas asignándola constantemente puede que ese sea tu problema. 

Buenas como veo que no me hago entender correctamente he hecho un proyecto nuevo la mar de simple para comprobarlo, donde solo hay una pelota y este script:
 

 void Update()
    {
        Direccion = new Vector3(0.0f , Random.Range(0.1f, 1.0f) , 0.0f);

        Camara.transform.position = new Vector3(Pelota.transform.position.x, Pelota.transform.position.y + 5f, Pelota.transform.position.z - 5f);
        if (Input.GetKey(KeyCode.Space))
        {
            if (Unpic == false)
            {
                rBpelota.velocity = Direccion.normalized * 10f;
                Unpic = true;
            }
        }
        else
        {
            Unpic = false;
        }
        
    }

al hacer este proyecto nuevo he comprobado que funcion correctamente, asi que en el proyecto principal tengo algun problema que impide que el normalized se ejecute correctamente, pero no se que puede ser.

podria ser que pase porque el rigitbodi del objeto es un rigitbodi 2D?

ya que el proyecto esta en 3D pero las fisicas de la pelota en 2D, alomejor puede ser por eso?

Edited by racsosoi@yahoo.es

Share this post


Link to post
Share on other sites

vale creo encontre el problema.
 el problema parece estar en la manera que cojo la direccion que por algun motivo no deja que se le aplique el normalized:

 

 directionDer = (PosManoDer - PosPelota).normalized; // indicar la direccion que hay entre la mano y la pelota
 directionDer.y = directionDer.y * (-1);// invertir direccion 
 directionDer.x = directionDer.x * (-1);// invertir direccion

quitando el normalized de aqui y aplicandolo mas tarde no soluciona nada.

mañana me estudiare mas como solucionarlo ahora que creo que encontre nonde esta el problema
 

Share this post


Link to post
Share on other sites

Buenas he encontrado que  error lo es por la manera en la que cojo la direccion, pero no se de que otra manera podria cojer la direccion para que se aplique bien el normalized.

basicamente la pelota se tiene que mover en direccion al jugador cada vez que pulse espacio y a la misma velocidad, pero lo de a la misma velocidad no lo consigo, este es todo el script, que lo he simplificado para hacer estas pruebas y mostrarlas:

 

public class controladora : MonoBehaviour
{
    public GameObject Pelota;
    public GameObject Player;
    public GameObject Camara;
    public Rigidbody rBpelota;
    private Vector3 PositionPelota;
    private Vector3 PositionPlayer;
    public Vector3 Direccion;
    private bool Unpic = false;


    void Start()
    {
        rBpelota = Pelota.GetComponent<Rigidbody>(); // agafar es rigitbody de sa pilota 
    }

  
    void Update()
    {
       

        Camara.transform.position = new Vector3(Pelota.transform.position.x, Pelota.transform.position.y + 5f, Pelota.transform.position.z - 5f);
        if (Input.GetKey(KeyCode.Space))
        {
            if (Unpic == false)
            {
                PositionPelota = new Vector3(Pelota.transform.position.x, Pelota.transform.position.y, Pelota.transform.position.z);
                PositionPlayer = new Vector3(Player.transform.position.x, Player.transform.position.y, Player.transform.position.z);
                Direccion = (PositionPlayer - PositionPelota).normalized;
                Debug.Log(Direccion);
                rBpelota.velocity = Direccion.normalized * 10f;
                 Unpic = true;
            }
        }
        else
        {
            Unpic = false;
        }
        
    }
}

 se os ocurre de que manera lo podria hacer para que se aplique bien el normalized no como aqui que no se aplica bien?

gracias

Share this post


Link to post
Share on other sites

Una cosita (se que es viejo, pero igual lo menciono):

Direccion = new Vector3(0.0f , Random.Range(0.1f, 1.0f) , 0.0f);

En teoría una dirección debe estar siempre normalizada (imagina una variable cantidadDeManzanas = -5, no tiene sentido). Por lo que el resultado final debería ser siempre <0,1,0> (más alla de cómo utilices el vector "Direccion"). Esto va más allá de las capacidades del lenguaje, es más bien una forma de evitar bugs innecesarios.

Share this post


Link to post
Share on other sites
11 hours ago, lightbug said:

Una cosita (se que es viejo, pero igual lo menciono):


Direccion = new Vector3(0.0f , Random.Range(0.1f, 1.0f) , 0.0f);

En teoría una dirección debe estar siempre normalizada (imagina una variable cantidadDeManzanas = -5, no tiene sentido). Por lo que el resultado final debería ser siempre <0,1,0> (más alla de cómo utilices el vector "Direccion"). Esto va más allá de las capacidades del lenguaje, es más bien una forma de evitar bugs innecesarios.

justo debajo la normalizaba si no recuerdo mal pero bueno, esta direccion no fallaba

Share this post


Link to post
Share on other sites

Vale señores muchas gracias por la ayuda, ya lo he solucionado, pero no veo como modificar el post para poner que esta solucionado.

basicamente el error estaba en que cojia la direccion, la cojida de la mano del jugador  en relacion a la pelota, pero dicha mano estaba como hijo del objeto de player, yo creo que al ser un hijo de otro objeto estaba dando este error.

Basicamente lo he solucionado poniendo otro objeto sin ser hijo de nadie, poniendo por script que este en el mismo lugar que la mano  en todo momento y cojiendo la direccion de este nuevo objeto.

no se si me explico bien pero ya esta solucionado 😛

muchas gracias a todos los que intentaron ayudar 😄

Share this post


Link to post
Share on other sites
On 2/4/2021 at 7:00 AM, racsosoi@yahoo.es said:

justo debajo la normalizaba si no recuerdo mal pero bueno, esta direccion no fallaba

Claro, por eso mencioné que el resultado final es siempre <0,1,0>, tu random no hace nada.

 

Share this post


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

×
×
  • Create New...