don't rotate a rigidbody around locked axis

This commit is contained in:
nothingTVatYT
2024-01-05 05:07:08 +01:00
parent a848fd027e
commit 284c971ec0

View File

@@ -15,6 +15,7 @@
#include "Engine/Graphics/Models/MeshDeformation.h"
#include "Engine/Level/Scene/Scene.h"
#include "Engine/Level/SceneObjectsFactory.h"
#include "Engine/Physics/Actors/RigidBody.h"
#include "Engine/Serialization/Serialization.h"
AnimatedModel::AnimatedModel(const SpawnParams& params)
@@ -548,7 +549,33 @@ void AnimatedModel::ApplyRootMotion(const Transform& rootMotionDelta)
// Apply movement
Actor* target = RootMotionTarget ? RootMotionTarget.Get() : this;
target->AddMovement(translation, rootMotionDelta.Orientation);
// filter rotation according to constraints if the target is a rigidbody
const auto rigidBody = dynamic_cast<RigidBody*>(target);
auto rotation = rootMotionDelta.Orientation;
if (rigidBody)
{
if (static_cast<unsigned int>(rigidBody->GetConstraints()) & static_cast<unsigned int>(RigidbodyConstraints::LockRotation))
rotation = Quaternion::Identity;
else
{
Float3 euler = rotation.GetEuler();
const auto constraints = static_cast<unsigned int>(rigidBody->GetConstraints());
if (constraints & static_cast<unsigned int>(RigidbodyConstraints::LockRotationX))
{
euler.X = 0;
}
if (constraints & static_cast<unsigned int>(RigidbodyConstraints::LockRotationY))
{
euler.Y = 0;
}
if (constraints & static_cast<unsigned int>(RigidbodyConstraints::LockRotationZ))
{
euler.Z = 0;
}
rotation = Quaternion::Euler(euler);
}
}
target->AddMovement(translation, rotation);
}
void AnimatedModel::SyncParameters()