How to Relative Velocity & Force of rigidbody2d in gdscript

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By Hardik

I can’t found anything about this in internet. Please Provide some simple example that can I use to test it?

This sounds like a tough cookie to crack. Do you mean velocity and force with respect to a certain object, body, or reference frame?

Ertain | 2019-03-18 00:12

:bust_in_silhouette: Reply From: wombatstampede

I usually only work with 3d physics but I guess this is the same with 2D in godot.

Transforming a 3d vector from global to local space works via the xform and xform_inv from the Node2D (i.e. a RigidBody2D).

To convert a vector (rotation only) from local to global you would use global_translate.basis_xform(someXY).
That is helpful if you have a local force (i.e. rocket thrust “forward”) and want to transform this into a global force vector for apply_force. You can also use global_translate.xform if you want to convert not only the rotation but also the local translation to a global value (that can be tricky though because add_force requires a relative offset in global space not a global position).

To your question:
global_translate.basis_xform_inv(someGlobalDirection) should transform a global vector back into local space.
So you can get i.e. the objects local “forward” velocity from a global velocity vector.

:bust_in_silhouette: Reply From: luislodosm

Use Vector2.rotated(rotation). Example:

extends RigidBody2D

var thrust_force = 100

func _physics_process(delta):
  var thrust = Input.is_action_pressed("ui_up") as int * thrust_force
  applied_force = thrust * Vector2.UP.rotated(rotation)
:bust_in_silhouette: Reply From: hard

func add_force_local(force: Vector2, pos: Vector2):
var pos-local = self.transform.basis_xform(pos)
var force-local = self.transform.basis_xform(force)
self.add_force(force-local, pos-local)