@ContinuousIntegrationTest(estimatedDuration = 0.0)
  @Test(timeout = 300000)
  public void testTwoIntersectingBoxes() {
    CombinedTerrainObject3D combinedTerrainObject =
        new CombinedTerrainObject3D("Combined Terrain Object to Test");
    Point3d pointToCheck = new Point3d();
    Point3d expectedIntersection = new Point3d();
    Vector3d expectedNormal = new Vector3d();

    Point3d resultIntersection = new Point3d();
    Vector3d resultNormal = new Vector3d();

    setupTwoIntersectingBoxesMadeFromPolygons(combinedTerrainObject);

    pointToCheck.set(0.4, 0.45, 0.25);
    expectedIntersection.set(0.4, 0.5, 0.25);
    expectedNormal.set(0.0, 1.0, 0.0);

    combinedTerrainObject.checkIfInside(
        pointToCheck.getX(),
        pointToCheck.getY(),
        pointToCheck.getZ(),
        resultIntersection,
        resultNormal);
    JUnitTools.assertTuple3dEquals(expectedIntersection, resultIntersection, 1e-4);
    JUnitTools.assertTuple3dEquals(expectedNormal, resultNormal, 1e-4);
  }
  @ContinuousIntegrationTest(estimatedDuration = 0.0)
  @Test(timeout = 30000)
  public void testSingleRigidBodyRotation() {
    Random random = new Random(1766L);

    RigidBody elevator = new RigidBody("elevator", world);
    Vector3d jointAxis = RandomTools.generateRandomVector(random);
    jointAxis.normalize();
    RigidBodyTransform transformToParent = new RigidBodyTransform();
    transformToParent.setIdentity();
    RevoluteJoint joint =
        ScrewTools.addRevoluteJoint("joint", elevator, transformToParent, jointAxis);
    RigidBody body =
        ScrewTools.addRigidBody(
            "body",
            joint,
            RandomTools.generateRandomDiagonalMatrix3d(random),
            random.nextDouble(),
            new Vector3d());

    joint.setQ(random.nextDouble());
    joint.setQd(random.nextDouble());

    Momentum momentum = computeMomentum(elevator, world);

    momentum.changeFrame(world);
    FrameVector linearMomentum =
        new FrameVector(momentum.getExpressedInFrame(), momentum.getLinearPartCopy());
    FrameVector angularMomentum =
        new FrameVector(momentum.getExpressedInFrame(), momentum.getAngularPartCopy());

    FrameVector linearMomentumCheck = new FrameVector(world);
    Matrix3d inertia = body.getInertia().getMassMomentOfInertiaPartCopy();
    Vector3d angularMomentumCheckVector = new Vector3d(jointAxis);
    angularMomentumCheckVector.scale(joint.getQd());
    inertia.transform(angularMomentumCheckVector);
    FrameVector angularMomentumCheck =
        new FrameVector(body.getInertia().getExpressedInFrame(), angularMomentumCheckVector);
    angularMomentumCheck.changeFrame(world);

    double epsilon = 1e-9;
    JUnitTools.assertTuple3dEquals(
        linearMomentumCheck.getVector(), linearMomentum.getVector(), epsilon);
    JUnitTools.assertTuple3dEquals(
        angularMomentumCheck.getVector(), angularMomentum.getVector(), epsilon);
    assertTrue(angularMomentum.length() > epsilon);
  }