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); }
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)); } } }
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)); }