SpringTest.cpp 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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/SpringTest.h>
  6. #include <Jolt/Physics/Collision/Shape/BoxShape.h>
  7. #include <Jolt/Physics/Constraints/DistanceConstraint.h>
  8. #include <Jolt/Physics/Body/BodyCreationSettings.h>
  9. #include <Layers.h>
  10. JPH_IMPLEMENT_RTTI_VIRTUAL(SpringTest)
  11. {
  12. JPH_ADD_BASE_CLASS(SpringTest, Test)
  13. }
  14. void SpringTest::Initialize()
  15. {
  16. // Floor
  17. CreateFloor();
  18. // Top fixed body
  19. RVec3 position(0, 75, 0);
  20. Body &top = *mBodyInterface->CreateBody(BodyCreationSettings(new BoxShape(Vec3(100.0f, 1.0f, 1.0f)), position, Quat::sIdentity(), EMotionType::Static, Layers::NON_MOVING));
  21. mBodyInterface->AddBody(top.GetID(), EActivation::DontActivate);
  22. // Bodies attached with spring with different string lengths, same frequency and no damping
  23. for (int i = 0; i < 10; ++i)
  24. {
  25. // Create body
  26. RVec3 attachment_point = position + Vec3(-100.0f + i * 5.0f, 0, 0);
  27. RVec3 body_position = attachment_point - Vec3(0, 10.0f + i * 2.5f, 0);
  28. Body &body = *mBodyInterface->CreateBody(BodyCreationSettings(new BoxShape(Vec3::sReplicate(0.75f)), body_position, Quat::sIdentity(), EMotionType::Dynamic, Layers::MOVING));
  29. body.GetMotionProperties()->SetAngularDamping(0.0f);
  30. body.GetMotionProperties()->SetLinearDamping(0.0f);
  31. mBodyInterface->AddBody(body.GetID(), EActivation::Activate);
  32. // Attach spring
  33. DistanceConstraintSettings settings;
  34. settings.mPoint1 = attachment_point;
  35. settings.mPoint2 = body_position;
  36. settings.mLimitsSpringSettings.mFrequency = 0.33f;
  37. mPhysicsSystem->AddConstraint(settings.Create(top, body));
  38. // Move the body up so that it can start oscillating
  39. mBodyInterface->SetPositionAndRotation(body.GetID(), attachment_point - Vec3(0, 5, 0), Quat::sIdentity(), EActivation::DontActivate);
  40. }
  41. // Bodies attached with spring with different frequency and no damping
  42. for (int i = 0; i < 10; ++i)
  43. {
  44. // Create body
  45. RVec3 attachment_point = position + Vec3(-25.0f + i * 5.0f, 0, 0);
  46. RVec3 body_position = attachment_point - Vec3(0, 25.0f, 0);
  47. Body &body = *mBodyInterface->CreateBody(BodyCreationSettings(new BoxShape(Vec3::sReplicate(0.75f)), body_position, Quat::sIdentity(), EMotionType::Dynamic, Layers::MOVING));
  48. body.GetMotionProperties()->SetAngularDamping(0.0f);
  49. body.GetMotionProperties()->SetLinearDamping(0.0f);
  50. mBodyInterface->AddBody(body.GetID(), EActivation::Activate);
  51. // Attach spring
  52. DistanceConstraintSettings settings;
  53. settings.mPoint1 = attachment_point;
  54. settings.mPoint2 = body_position;
  55. settings.mLimitsSpringSettings.mFrequency = 0.1f + 0.1f * i;
  56. mPhysicsSystem->AddConstraint(settings.Create(top, body));
  57. // Move the body up so that it can start oscillating
  58. mBodyInterface->SetPositionAndRotation(body.GetID(), attachment_point - Vec3(0, 5, 0), Quat::sIdentity(), EActivation::DontActivate);
  59. }
  60. // Bodies attached with spring with same spring length, same frequency and different damping
  61. for (int i = 0; i < 10; ++i)
  62. {
  63. // Create body
  64. RVec3 attachment_point = position + Vec3(50.0f + i * 5.0f, 0, 0);
  65. RVec3 body_position = attachment_point - Vec3(0, 25.0f, 0);
  66. Body &body = *mBodyInterface->CreateBody(BodyCreationSettings(new BoxShape(Vec3::sReplicate(0.75f)), body_position, Quat::sIdentity(), EMotionType::Dynamic, Layers::MOVING));
  67. body.GetMotionProperties()->SetAngularDamping(0.0f);
  68. body.GetMotionProperties()->SetLinearDamping(0.0f);
  69. mBodyInterface->AddBody(body.GetID(), EActivation::Activate);
  70. // Attach spring
  71. DistanceConstraintSettings settings;
  72. settings.mPoint1 = attachment_point;
  73. settings.mPoint2 = body_position;
  74. settings.mLimitsSpringSettings.mFrequency = 0.33f;
  75. settings.mLimitsSpringSettings.mDamping = (1.0f / 9.0f) * i;
  76. mPhysicsSystem->AddConstraint(settings.Create(top, body));
  77. // Move the body up so that it can start oscillating
  78. mBodyInterface->SetPositionAndRotation(body.GetID(), attachment_point - Vec3(0, 5, 0), Quat::sIdentity(), EActivation::DontActivate);
  79. }
  80. }