CapsuleVsBoxTest.cpp 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <TestFramework.h>
  4. #include <Tests/ConvexCollision/CapsuleVsBoxTest.h>
  5. #include <Jolt/Physics/Collision/Shape/RotatedTranslatedShape.h>
  6. #include <Jolt/Physics/Collision/Shape/CapsuleShape.h>
  7. #include <Jolt/Physics/Collision/Shape/BoxShape.h>
  8. #include <Jolt/Physics/Collision/CollideShape.h>
  9. #include <Jolt/Physics/Collision/CollisionDispatch.h>
  10. #include <Jolt/Physics/Collision/CollisionCollectorImpl.h>
  11. #include <Renderer/DebugRendererImp.h>
  12. JPH_IMPLEMENT_RTTI_VIRTUAL(CapsuleVsBoxTest)
  13. {
  14. JPH_ADD_BASE_CLASS(CapsuleVsBoxTest, Test)
  15. }
  16. void CapsuleVsBoxTest::PrePhysicsUpdate(const PreUpdateParams &inParams)
  17. {
  18. // Create box
  19. Vec3 box_min(-1.0f, -2.0f, 0.5f);
  20. Vec3 box_max(2.0f, -0.5f, 3.0f);
  21. Ref<RotatedTranslatedShapeSettings> box_settings = new RotatedTranslatedShapeSettings(0.5f * (box_min + box_max), Quat::sIdentity(), new BoxShapeSettings(0.5f * (box_max - box_min)));
  22. Ref<Shape> box_shape = box_settings->Create().Get();
  23. Mat44 box_transform(Vec4(0.516170502f, -0.803887904f, -0.295520246f, 0.0f), Vec4(0.815010250f, 0.354940295f, 0.458012700f, 0.0f), Vec4(-0.263298869f, -0.477264702f, 0.838386655f, 0.0f), Vec4(-10.2214508f, -18.6808319f, 40.7468987f, 1.0f));
  24. // Create capsule
  25. float capsule_half_height = 75.0f;
  26. float capsule_radius = 1.5f;
  27. Quat capsule_compound_rotation(0.499999970f, -0.499999970f, -0.499999970f, 0.499999970f);
  28. Ref<RotatedTranslatedShapeSettings> capsule_settings = new RotatedTranslatedShapeSettings(Vec3(0, 0, 75), capsule_compound_rotation, new CapsuleShapeSettings(capsule_half_height, capsule_radius));
  29. Ref<Shape> capsule_shape = capsule_settings->Create().Get();
  30. Mat44 capsule_transform = Mat44::sTranslation(Vec3(-9.68538570f, -18.0328083f, 41.3212280f));
  31. // Collision settings
  32. CollideShapeSettings settings;
  33. settings.mActiveEdgeMode = EActiveEdgeMode::CollideWithAll;
  34. settings.mBackFaceMode = EBackFaceMode::CollideWithBackFaces;
  35. settings.mCollectFacesMode = ECollectFacesMode::NoFaces;
  36. // Collide the two shapes
  37. AllHitCollisionCollector<CollideShapeCollector> collector;
  38. CollisionDispatch::sCollideShapeVsShape(capsule_shape, box_shape, Vec3::sReplicate(1.0f), Vec3::sReplicate(1.0f), capsule_transform, box_transform, SubShapeIDCreator(), SubShapeIDCreator(), settings, collector);
  39. #ifdef JPH_DEBUG_RENDERER
  40. // Draw the shapes
  41. box_shape->Draw(mDebugRenderer, box_transform, Vec3::sReplicate(1.0f), Color::sWhite, false, false);
  42. capsule_shape->Draw(mDebugRenderer, capsule_transform, Vec3::sReplicate(1.0f), Color::sWhite, false, false);
  43. #endif // JPH_DEBUG_RENDERER
  44. // Draw contact points
  45. const CollideShapeResult &hit = collector.mHits[0];
  46. mDebugRenderer->DrawMarker(hit.mContactPointOn1, Color::sRed, 1.0f);
  47. mDebugRenderer->DrawMarker(hit.mContactPointOn2, Color::sGreen, 1.0f);
  48. // Draw penetration axis with length of the penetration
  49. Vec3 pen_axis = hit.mPenetrationAxis;
  50. float pen_axis_len = pen_axis.Length();
  51. if (pen_axis_len > 0.0f)
  52. {
  53. pen_axis *= hit.mPenetrationDepth / pen_axis_len;
  54. mDebugRenderer->DrawArrow(hit.mContactPointOn2, hit.mContactPointOn2 + pen_axis, Color::sYellow, 0.01f);
  55. #ifdef JPH_DEBUG_RENDERER
  56. Mat44 resolved_box = Mat44::sTranslation(pen_axis) * box_transform;
  57. box_shape->Draw(mDebugRenderer, resolved_box, Vec3::sReplicate(1.0f), Color::sGreen, false, false);
  58. #endif // JPH_DEBUG_RENDERER
  59. }
  60. }