2
0

PoweredSliderConstraintTest.cpp 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include <TestFramework.h>
  5. #include <Tests/Constraints/PoweredSliderConstraintTest.h>
  6. #include <Jolt/Physics/Collision/Shape/BoxShape.h>
  7. #include <Jolt/Physics/Collision/GroupFilterTable.h>
  8. #include <Jolt/Physics/Constraints/SliderConstraint.h>
  9. #include <Jolt/Physics/Body/BodyCreationSettings.h>
  10. #include <Application/DebugUI.h>
  11. #include <Layers.h>
  12. JPH_IMPLEMENT_RTTI_VIRTUAL(PoweredSliderConstraintTest)
  13. {
  14. JPH_ADD_BASE_CLASS(PoweredSliderConstraintTest, Test)
  15. }
  16. void PoweredSliderConstraintTest::Initialize()
  17. {
  18. // Floor
  19. CreateFloor();
  20. // Create group filter
  21. Ref<GroupFilterTable> group_filter = new GroupFilterTable;
  22. // Create box
  23. float box_size = 4.0f;
  24. RefConst<Shape> box = new BoxShape(Vec3::sReplicate(0.5f * box_size));
  25. RVec3 position(0, 10, 0);
  26. Body &body1 = *mBodyInterface->CreateBody(BodyCreationSettings(box, position, Quat::sIdentity(), EMotionType::Static, Layers::NON_MOVING));
  27. body1.SetCollisionGroup(CollisionGroup(group_filter, 0, 0));
  28. mBodyInterface->AddBody(body1.GetID(), EActivation::DontActivate);
  29. position += Vec3(box_size + 10.0f, 0, 0);
  30. mBody2 = mBodyInterface->CreateBody(BodyCreationSettings(BodyCreationSettings(box, position, Quat::sIdentity(), EMotionType::Dynamic, Layers::MOVING)));
  31. mBody2->SetCollisionGroup(CollisionGroup(group_filter, 0, 0));
  32. mBody2->GetMotionProperties()->SetLinearDamping(0.0f);
  33. mBody2->SetAllowSleeping(false);
  34. mBodyInterface->AddBody(mBody2->GetID(), EActivation::Activate);
  35. SliderConstraintSettings settings;
  36. settings.mAutoDetectPoint = true;
  37. settings.SetSliderAxis(Vec3::sAxisX());
  38. settings.mLimitsMin = -5.0f;
  39. settings.mLimitsMax = 100.0f;
  40. mConstraint = static_cast<SliderConstraint *>(settings.Create(body1, *mBody2));
  41. mConstraint->SetMotorState(EMotorState::Velocity);
  42. mConstraint->SetTargetVelocity(1);
  43. mPhysicsSystem->AddConstraint(mConstraint);
  44. }
  45. void PoweredSliderConstraintTest::PrePhysicsUpdate(const PreUpdateParams &inParams)
  46. {
  47. MotorSettings &motor_settings = mConstraint->GetMotorSettings();
  48. motor_settings.SetForceLimit(sMaxMotorAcceleration / mBody2->GetMotionProperties()->GetInverseMass()); // F = m * a
  49. motor_settings.mSpringSettings.mFrequency = sFrequency;
  50. motor_settings.mSpringSettings.mDamping = sDamping;
  51. mConstraint->SetMaxFrictionForce(sMaxFrictionAcceleration / mBody2->GetMotionProperties()->GetInverseMass());
  52. }
  53. void PoweredSliderConstraintTest::CreateSettingsMenu(DebugUI *inUI, UIElement *inSubMenu)
  54. {
  55. inUI->CreateComboBox(inSubMenu, "Motor", { "Off", "Velocity", "Position" }, (int)mConstraint->GetMotorState(), [this](int inItem) { mConstraint->SetMotorState((EMotorState)inItem); });
  56. inUI->CreateSlider(inSubMenu, "Target Velocity (m/s)", mConstraint->GetTargetVelocity(), -10.0f, 10.0f, 0.1f, [this](float inValue) { mConstraint->SetTargetVelocity(inValue); });
  57. inUI->CreateSlider(inSubMenu, "Target Position (m)", mConstraint->GetTargetPosition(), -5.0f, 20.0f, 0.1f, [this](float inValue) { mConstraint->SetTargetPosition(inValue); });
  58. inUI->CreateSlider(inSubMenu, "Max Acceleration (m/s^2)", sMaxMotorAcceleration, 0.0f, 250.0f, 1.0f, [](float inValue) { sMaxMotorAcceleration = inValue; });
  59. inUI->CreateSlider(inSubMenu, "Frequency (Hz)", sFrequency, 0.0f, 20.0f, 0.1f, [](float inValue) { sFrequency = inValue; });
  60. inUI->CreateSlider(inSubMenu, "Damping", sDamping, 0.0f, 2.0f, 0.01f, [](float inValue) { sDamping = inValue; });
  61. inUI->CreateSlider(inSubMenu, "Max Friction Acceleration (m/s^2)", sMaxFrictionAcceleration, 0.0f, 10.0f, 0.1f, [](float inValue) { sMaxFrictionAcceleration = inValue; });
  62. }