Add utility SetLinearVelocity and SetAngularVelocity for a whole ragdoll

This commit is contained in:
Wojtek Figat
2021-11-06 13:48:53 +01:00
parent 6f68f4e5b0
commit ddbc76cc7d
2 changed files with 32 additions and 0 deletions

View File

@@ -27,6 +27,28 @@ float Ragdoll::GetTotalMass() const
return result;
}
void Ragdoll::SetLinearVelocity(const Vector3& value) const
{
for (auto child : Children)
{
const auto rigidBody = Cast<RigidBody>(child);
if (!rigidBody || !rigidBody->IsActiveInHierarchy())
continue;
rigidBody->SetLinearVelocity(value);
}
}
void Ragdoll::SetAngularVelocity(const Vector3& value) const
{
for (auto child : Children)
{
const auto rigidBody = Cast<RigidBody>(child);
if (!rigidBody || !rigidBody->IsActiveInHierarchy())
continue;
rigidBody->SetAngularVelocity(value);
}
}
float Ragdoll::InitBone(RigidBody* rigidBody, int32& nodeIndex, Transform& localOffset)
{
// Bones with 0 weight are non-simulated (kinematic)

View File

@@ -59,6 +59,16 @@ public:
/// </summary>
API_PROPERTY() float GetTotalMass() const;
/// <summary>
/// Sets the linear velocity of all rigidbodies in the ragdoll.
/// </summary>
API_FUNCTION() void SetLinearVelocity(const Vector3& value) const;
/// <summary>
/// Sets the angular velocity of all rigidbodies in the ragdoll (in radians per second).
/// </summary>
API_FUNCTION() void SetAngularVelocity(const Vector3& value) const;
private:
float InitBone(RigidBody* rigidBody, int32& nodeIndex, Transform& localPose);