Пример #1
0
        public void CreateBoundingShape()
        {
            int numberOfBoxes = 0;
              int numberOfSpheres = 0;
              const int numberOfTests = 100;
              RandomHelper.Random = new Random(727);
              for (int test = 0; test < numberOfTests; test++)
              {
            // Fill list with a random number of random points.
            int numberOfPoints = RandomHelper.Random.NextInteger(2, 100);
            List<Vector3F> points = new List<Vector3F>();
            for (int i = 0; i < numberOfPoints; i++)
              points.Add(RandomHelper.Random.NextVector3F(-10, 100));

            Shape shape = GeometryHelper.CreateBoundingShape(points);
            GeometricObject geometry = new GeometricObject(shape);
            CollisionObject boundingObject = new CollisionObject(geometry);

            if (shape is BoxShape)
              numberOfBoxes++;
            if (shape is SphereShape)
              numberOfSpheres++;
            if (((TransformedShape)shape).Child.Shape is BoxShape)
              numberOfBoxes++;
            else
              numberOfSpheres++;

            Assert.IsNotNull(shape);

            var cd = new CollisionDetection();

            // Test if all points are in the bounding shape.
            for (int i = 0; i < numberOfPoints; i++)
            {
              var point = points[i];

              // Test against a sphere around the point. Some points are exactly on the surface
              // and are very sensitive to tiny numerical errors.
              var pointGeometry = new GeometricObject(new SphereShape(Numeric.EpsilonF * 10), new Pose(point));

              Assert.IsTrue(cd.HaveContact(new CollisionObject(pointGeometry), boundingObject));
            }
              }

              Console.WriteLine("ShapeHelper.CreateBoundingShape: Number of Boxes : Number of Spheres = " + numberOfBoxes + " : " + numberOfSpheres);
        }
Пример #2
0
        public void ComputeCapsuleWithRandomPoints()
        {
            float height;
              float radius;
              Pose pose;

              const int numberOfTests = 100;
              RandomHelper.Random = new Random(377);
              for (int test = 0; test < numberOfTests; test++)
              {
            // Fill list with a random number of random points.
            int numberOfPoints = RandomHelper.Random.NextInteger(2, 100);
            List<Vector3F> points = new List<Vector3F>();
            for (int i = 0; i < numberOfPoints; i++)
              points.Add(RandomHelper.Random.NextVector3F(-10, 100));

            GeometryHelper.ComputeBoundingCapsule(points, out radius, out height, out pose);

            // Check if sphere can be valid.
            Assert.IsTrue(radius >= 0);
            Assert.IsTrue(height >= 2 * radius);
            Assert.IsTrue(!float.IsNaN(pose.Position.Length));
            Assert.IsTrue(pose.Orientation.IsRotation);

            // Test if all points are in the shape.
            var cd = new CollisionDetection();

            GeometricObject geometry = new GeometricObject(new CapsuleShape(radius, height), pose);
            CollisionObject boundingObject = new CollisionObject(geometry);

            // Test if all points are in the bounding shape.
            for (int i = 0; i < numberOfPoints; i++)
            {
              var point = points[i];

              // Test against a sphere around the point. Some points are exactly on the surface
              // and are very sensitive to tiny numerical errors.
              var pointGeometry = new GeometricObject(new SphereShape(Numeric.EpsilonF * (height + 1)), new Pose(point));
              Assert.IsTrue(cd.HaveContact(new CollisionObject(pointGeometry), boundingObject));
            }
              }
        }
Пример #3
0
        public void ComputeBoundingShapeCenteredSphere()
        {
            RandomHelper.Random = new Random(123);
              var radius = new Vector3F(3, 0, 0);
              var points = new List<Vector3F>
              {
            new Vector3F(3, 0, 0), new Vector3F(-3, 0, 0),
            new Vector3F(0, 3, 0), new Vector3F(0, -3, 0),
            new Vector3F(0, 0, 3), new Vector3F(0, 0, -3),
              };

              for (int i = 0; i < 40; i++)
            points.Add(RandomHelper.Random.NextQuaternionF().Rotate(radius));

              var shape = GeometryHelper.CreateBoundingShape(points);
              SphereShape s = (SphereShape)shape;
              Assert.IsTrue(Numeric.AreEqual(3, s.Radius));

              var cd = new CollisionDetection();

              GeometricObject geometry = new GeometricObject(shape);
              CollisionObject boundingObject = new CollisionObject(geometry);

              // Test if all points are in the bounding shape.
              for (int i = 0; i < points.Count; i++)
              {
            var point = points[i];

            // Test against a sphere around the point. Some points are exactly on the surface
            // and are very sensitive to tiny numerical errors.
            var pointGeometry = new GeometricObject(new SphereShape(Numeric.EpsilonF * 10), new Pose(point));

            Assert.IsTrue(cd.HaveContact(new CollisionObject(pointGeometry), boundingObject));
              }
        }
        public void OrthographicTest()
        {
            Vector3F position = new Vector3F(1, 2, 3);
              QuaternionF orientation = QuaternionF.CreateRotation(new Vector3F(2, 3, 6), 0.123f);
              CameraInstance cameraInstance = new CameraInstance(new Camera(new OrthographicProjection()))
              {
            PoseLocal = new Pose(position, orientation),
              };

              ((OrthographicProjection)cameraInstance.Camera.Projection).Set(4, 3, 2, 10);
              Matrix44F projection = Matrix44F.CreateOrthographic(4, 3, 2, 10);
              Assert.AreEqual(position, cameraInstance.PoseWorld.Position);
              Assert.AreEqual(orientation.ToRotationMatrix33(), cameraInstance.PoseWorld.Orientation);
              Assert.AreEqual(4, cameraInstance.Camera.Projection.Width);
              Assert.AreEqual(3, cameraInstance.Camera.Projection.Height);
              Assert.AreEqual(4.0f / 3.0f, cameraInstance.Camera.Projection.AspectRatio);
              Assert.AreEqual(2, cameraInstance.Camera.Projection.Near);
              Assert.AreEqual(10, cameraInstance.Camera.Projection.Far);
              Assert.AreEqual(-2, cameraInstance.Camera.Projection.Left);
              Assert.AreEqual(2, cameraInstance.Camera.Projection.Right);
              Assert.AreEqual(-1.5f, cameraInstance.Camera.Projection.Bottom);
              Assert.AreEqual(1.5f, cameraInstance.Camera.Projection.Top);
              Assert.AreEqual(8, cameraInstance.Camera.Projection.Depth);
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection, cameraInstance.Camera.Projection));
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection.Inverse, cameraInstance.Camera.Projection.Inverse));
              Assert.IsNotNull(cameraInstance.BoundingShape);

              // Test shape using collision detection. Remove rotation to simplify test.
              cameraInstance.PoseWorld = new Pose(cameraInstance.PoseWorld.Position);
              CollisionDetection collisionDetection = new CollisionDetection();
              var point = new PointShape();
              CollisionObject pointCollisionObject = new CollisionObject(new GeometricObject(point));
              CollisionObject cameraCollisionObject = new CollisionObject(cameraInstance);

              point.Position = position + new Vector3F(-2, -1.5f, -2);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(-2.1f, -1.6f, -1.9f);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(2, 1.5f, -10);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(2.1f, 1.6f, -10.1f);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));

              cameraInstance.PoseWorld = new Pose(position, orientation);
              ((OrthographicProjection)cameraInstance.Camera.Projection).Set(8, 4, 1, 100);
              cameraInstance.Camera.Projection.Near = 1;
              cameraInstance.Camera.Projection.Far = 100;
              projection = Matrix44F.CreateOrthographic(8, 4, 1, 100);
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection.Inverse, cameraInstance.Camera.Projection.Inverse));
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection, cameraInstance.Camera.Projection));

              // Test shape using collision detection. Remove rotation to simplify test.
              cameraInstance.PoseWorld = new Pose(cameraInstance.PoseWorld.Position);
              point.Position = position + new Vector3F(-4, -2f, -1);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(-4.1f, -1.9f, -0.9f);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(4, 2f, -100);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(4.1f, 2.1f, -100.1f);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
        }
        public void PerspectiveOffCenterTest()
        {
            Vector3F position = new Vector3F(1, 2, 3);
              QuaternionF orientation = QuaternionF.CreateRotation(new Vector3F(2, 3, 6), 0.123f);
              CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()))
              {
            PoseLocal = new Pose(position, orientation),
              };
              ((PerspectiveProjection)cameraInstance.Camera.Projection).SetOffCenter(1, 5, 2, 5, 1, 10);

              Matrix44F projection = Matrix44F.CreatePerspectiveOffCenter(1, 5, 2, 5, 1, 10);
              Assert.AreEqual(position, cameraInstance.PoseWorld.Position);
              Assert.AreEqual(orientation.ToRotationMatrix33(), cameraInstance.PoseWorld.Orientation);
              Assert.IsTrue(Numeric.AreEqual(MathHelper.ToRadians(33.690067f), cameraInstance.Camera.Projection.FieldOfViewX));
              Assert.IsTrue(Numeric.AreEqual(MathHelper.ToRadians(15.255119f), cameraInstance.Camera.Projection.FieldOfViewY));
              Assert.AreEqual(4.0f / 3.0f, cameraInstance.Camera.Projection.AspectRatio);
              Assert.AreEqual(4, cameraInstance.Camera.Projection.Width);
              Assert.AreEqual(3, cameraInstance.Camera.Projection.Height);
              Assert.AreEqual(1, cameraInstance.Camera.Projection.Left);
              Assert.AreEqual(5, cameraInstance.Camera.Projection.Right);
              Assert.AreEqual(2, cameraInstance.Camera.Projection.Bottom);
              Assert.AreEqual(5, cameraInstance.Camera.Projection.Top);
              Assert.AreEqual(1, cameraInstance.Camera.Projection.Near);
              Assert.AreEqual(10, cameraInstance.Camera.Projection.Far);
              Assert.AreEqual(9, cameraInstance.Camera.Projection.Depth);
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection, cameraInstance.Camera.Projection));
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection.Inverse, cameraInstance.Camera.Projection.Inverse));
              Assert.IsNotNull(cameraInstance.BoundingShape);

              // Test shape using collision detection. Remove rotation to simplify test.
              cameraInstance.PoseWorld = new Pose(cameraInstance.PoseWorld.Position);
              CollisionDetection collisionDetection = new CollisionDetection();
              var point = new PointShape();
              CollisionObject pointCollisionObject = new CollisionObject(new GeometricObject(point));
              CollisionObject cameraCollisionObject = new CollisionObject(cameraInstance);

              point.Position = position + new Vector3F(3, 3, -1);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(30, 30, -10);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(3, 3, -0.9f);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(30, 30, -10.1f);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));

              point.Position = position + new Vector3F(1, 2, -1);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(0.9f, 2, -1);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(1, 1.9f, -1);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(5, 5, -1);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(5.1f, 5, -1);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(5, 5.1f, -1);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));

              point.Position = position + new Vector3F(10, 20, -10);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(9.9f, 20, -10);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(10, 19.9f, -10);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(50, 50, -10);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(50.1f, 50, -10);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(50, 50.1f, -10);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
        }
        public void PerspectiveTest()
        {
            Vector3F position = new Vector3F(1, 2, 3);
              QuaternionF orientation = QuaternionF.CreateRotation(new Vector3F(2, 3, 6), 0.123f);
              CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()))
              {
            PoseLocal = new Pose(position, orientation),
              };

              ((PerspectiveProjection)cameraInstance.Camera.Projection).SetFieldOfView(MathHelper.ToRadians(60), 16.0f / 10.0f, 1, 10);
              Matrix44F projection = Matrix44F.CreatePerspectiveFieldOfView(MathHelper.ToRadians(60), 16.0f / 10.0f, 1, 10);
              Assert.AreEqual(position, cameraInstance.PoseWorld.Position);
              Assert.AreEqual(orientation.ToRotationMatrix33(), cameraInstance.PoseWorld.Orientation);
              Assert.AreEqual(MathHelper.ToRadians(60), cameraInstance.Camera.Projection.FieldOfViewY);
              Assert.IsTrue(Numeric.AreEqual(MathHelper.ToRadians(85.4601055f), cameraInstance.Camera.Projection.FieldOfViewX));
              Assert.AreEqual(16.0f / 10.0f, cameraInstance.Camera.Projection.AspectRatio);
              Assert.IsTrue(Numeric.AreEqual(1.8475209f, cameraInstance.Camera.Projection.Width));
              Assert.IsTrue(Numeric.AreEqual(1.1547005f, cameraInstance.Camera.Projection.Height));
              Assert.AreEqual(1, cameraInstance.Camera.Projection.Near);
              Assert.AreEqual(10, cameraInstance.Camera.Projection.Far);
              Assert.IsTrue(Numeric.AreEqual(-0.9237604f, cameraInstance.Camera.Projection.Left));
              Assert.IsTrue(Numeric.AreEqual(0.9237604f, cameraInstance.Camera.Projection.Right));
              Assert.IsTrue(Numeric.AreEqual(-0.5773503f, cameraInstance.Camera.Projection.Bottom));
              Assert.IsTrue(Numeric.AreEqual(0.5773503f, cameraInstance.Camera.Projection.Top));
              Assert.AreEqual(9, cameraInstance.Camera.Projection.Depth);
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection, cameraInstance.Camera.Projection));
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection.Inverse, cameraInstance.Camera.Projection.Inverse));
              Assert.IsNotNull(cameraInstance.BoundingShape);

              // Test shape using collision detection. Remove rotation to simplify test.
              cameraInstance.PoseWorld = new Pose(cameraInstance.PoseWorld.Position);
              CollisionDetection collisionDetection = new CollisionDetection();
              var point = new PointShape();
              CollisionObject pointCollisionObject = new CollisionObject(new GeometricObject(point));
              CollisionObject cameraCollisionObject = new CollisionObject(cameraInstance);

              point.Position = position + new Vector3F(0, 0, -1);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(0, 0, -10);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(0, 0, -0.9f);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(0, 0, -10.1f);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));

              point.Position = position + new Vector3F(-0.9237604f, -0.5773f, -1);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(-0.924f, -0.5773f, -1);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(-0.9237604f, -0.58f, -1);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(0.9237604f, 0.5773f, -1);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(0.924f, 0.5773f, -1);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(0.9237604f, 0.58f, -1);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));

              point.Position = position + new Vector3F(-9.237604f, -5.773f, -10);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(-9.24f, -5.773f, -10);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(-9.237604f, -5.8f, -10);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(9.237604f, 5.773f, -10);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(9.24f, 5.773f, -10);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(9.237604f, 5.8f, -10);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
        }