I am making a VR data visualisation app in Unity and I have a parent with many children (just some primitive cubes) that I can toss around the scene by just setting the parent's rigidbody to the same velocity as my tracked VR controller.
Rigidbody rb = GetComponent<Rigidbody>();
Vector3 controllerVelocity = Player.instance.rightHand.GetTrackedObjectVelocity(); // how I ref the controller velocity in SteamVR
rb.velocity = controllerVelocity * 2f; // the 2f is just to speed up the velocity
The above code works fine, but the problem is I think the scale of the children objects, which can be adjusted by the player, is affecting the velocity the parent moves at. Or maybe just when the children are very large...the controller velocity is comparatively too slow? Basically I need this to not be the case; I want the parent's rigidbody to move at roughly the same velocity no matter the children's scales/masses.
So to achieve that I thought to use Rigidbody.AddForce but it doesn't seem to be making any difference i.e. larger children are still moving slower. Here is what I have so far:
Rigidbody rb = GetComponent<Rigidbody>();
Vector3 controllerVelocity = Player.instance.rightHand.GetTrackedObjectVelocity();
rb.AddForce(controllerVelocity * 2f, ForceMode.VelocityChange);
I also tried ForceMode.Acceleration but then nothing moved at all? Am I using AddForce incorrectly? Or do I just need a scaling multiplier based on the size of the children? Any help is welcome.
I am answering you not with the assured answer but with a proposal. Changing the scale you are presumably not changing the mass of the global object, but you might be changining it's center of mass which affects the inertias.
From the docs "If you don't set the center of mass from a script it will be calculated automatically from all colliders attached to the rigidbody"
What I would try is to get the center of mass value, and re-set the same center of mass after the scale modification to check if it could be that the movement described by the force applied is the same as it was before.
Not ideal, but was able to mimic my intended result by doing the following:
float parentMagnitude = transform.lossyScale.magnitude;
float thrustAdjuster = parentMagnitude * 5f;
Vector3 controllerVelocity = Player.instance.rightHand.GetTrackedObjectVelocity();
rb.velocity = controllerVelocity * thrustAdjuster;