Search Unity

AddRelativeForce and Transform.Forward

Discussion in 'Getting Started' started by lawernote, Aug 18, 2023.

  1. lawernote


    Aug 11, 2023
    I totally don't get it.
    AddRelativeForce uses local coordinates, so the object should move by local coordinates.
    vert = Input.GetAxis("Vertical");
    rb.AddRelativeForce(transform.forward *vert*speed*Time.deltaTime);

    At the same time, we have Transform.forward, which is kind of used in global coordinates, but if we combine it with AddForce, MovePosition, velocity - we can move the object by LOCAL coordinates.
    rb.AddForce(transform.forward *vert*speed*Time.deltaTime);

    If transform.forward is able to pass local coordinates, why does the documentation say that it passes GLOBAL coordinates (Returns a normalized vector representing the blue axis of the transform in world space).

    And why it doesn't work with AddRelativeForce, which is designed for local coordinates. And it works with Vector3, which is a global static coordinate. I don't understand anything.

    Please, if you answer, write very clearly, don't confuse me even more.

    [I know that physics should be used in FixedUpdate, but it doesn't affect the situation]
  2. lawernote


    Aug 11, 2023
    Anyway, I'll write what I realized. Perhaps it will help someone.
    There are 2 axes in Unity. These are global and local. Global axis is usually written through Vector3. Local axis is transform.forward;transform.up and others. The global one is created using Vector3 and the local axis is created using transforms. What do I mean? For example, there is Vector3.forward, which means that the object will move exclusively on global coordinates. And there is transform.forward, which means that the object can move along local coordinates.
    As a consequence, for local types of movement we use transform.
    But there's also AddRelativeForce. Which adds acceleration relative to the local coordinates of the object. I.e. by itself, it takes global coordinates (Vector3) and converts them into local coordinates and accelerates the object. And if local coordinates get there, it will move the object by global coordinates.
    In general, in Relative Force we need to record global coordinates of the object, and then it converts them into local coordinates and sets the force.
    I understood it this way, if something is wrong, please correct me.

    В общем, напишу то, что понял я. Возможно, кому-то это поможет.
    В Unity есть 2 оси. Это глобальная и локальная. Глобальная ось пишется обычно через Vector3. Локальная это transform.forward;transform.up и другие. Глобальная создается с помощью Vector3, а локальная ось создается с помощью трансформ. Что я имею ввиду? Например есть Vector3.forward, который означает, что объек будет двигаться исключительно по мировым координатам. И есть transform.forward, который допускает то, что объект может двигаться по локальным координатам.
    В следствии этого, для локальных типов передвижения мы используем transform.
    Но есть и AddRelativeForce. Который добавляет ускорение относительно локальных координат объекта. Т.е сам по себе, он принимает глобальные координаты(Vector3) и сам их конвертирует в локальные координаты, и ускоряет объект. А если туда будут попадать уже локальные координаты, то из-за этого он будет двигать объект по глобальным координатам.
    В общем, в Relative Force нам нужно записывать глобальные координаты объекта, а дальше он сам их конвертирует в локальные и задает силу.
    Я это понял так, если что-то не верно, пожалуйста, поправьте меня.