SpringTest.cpp 3.8 KB

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