public void ComputeCollisionBvh() { CollisionObject a = new CollisionObject(); TriangleMesh meshA = new TriangleMesh(); meshA.Add(new Triangle(new Vector3F(0, 0, 0), new Vector3F(0, 0, 1), new Vector3F(1, 0, 0)), false); var meshShapeA = new TriangleMeshShape(); meshShapeA.Mesh = meshA; meshShapeA.Partition = new AabbTree <int>(); ((GeometricObject)a.GeometricObject).Shape = meshShapeA; CollisionObject b = new CollisionObject(); TriangleMesh meshB = new TriangleMesh(); meshB.Add(new Triangle(new Vector3F(2, 0, 0), new Vector3F(2, 0, 1), new Vector3F(3, 0, 0)), false); TriangleMeshShape meshShapeB = new TriangleMeshShape(); meshShapeB.Mesh = meshB; meshShapeB.Partition = new AabbTree <int>(); ((GeometricObject)b.GeometricObject).Shape = meshShapeB; ((GeometricObject)b.GeometricObject).Pose = new Pose(new Vector3F(-2, 0, 0)); CollisionAlgorithm algo = new TriangleMeshAlgorithm(new CollisionDetection()); Assert.AreEqual(true, algo.HaveContact(a, b)); }
public void ComputeCollision() { CollisionObject a = new CollisionObject(); TriangleMesh mesh = new TriangleMesh(); mesh.Add(new Triangle(new Vector3F(0, 0, 0), new Vector3F(0, 0, 1), new Vector3F(1, 0, 0)), false); mesh.Add(new Triangle(new Vector3F(1, 0, 0), new Vector3F(0, 0, 1), new Vector3F(1, 0, 1)), false); TriangleMeshShape meshShape = new TriangleMeshShape(); meshShape.Mesh = mesh; a.GeometricObject = new GeometricObject(meshShape, Pose.Identity); CollisionObject b = new CollisionObject(new GeometricObject { Shape = new SphereShape(1), Pose = new Pose(new Vector3F(0, 0.9f, 0)), }); ContactSet set; TriangleMeshAlgorithm algo = new TriangleMeshAlgorithm(new CollisionDetection()); set = algo.GetClosestPoints(a, b); Assert.AreEqual(true, algo.HaveContact(a, b)); Assert.AreEqual(true, algo.HaveContact(b, a)); Assert.AreEqual(1, set.Count); Assert.IsTrue(Numeric.AreEqual(0.1f, set[0].PenetrationDepth, 0.001f)); //Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, 0, 0), set[0].PositionALocal, 0.01f)); // MPR will not return the perfect contact point. Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, 1, 0), set[0].Normal, 0.1f)); ((GeometricObject)b.GeometricObject).Pose = new Pose(new Vector3F(0.1f, 0.9f, 0.1f)); algo.UpdateContacts(set, 0); Assert.AreEqual(true, algo.HaveContact(a, b)); Assert.AreEqual(true, algo.HaveContact(b, a)); Assert.AreEqual(1, set.Count); Assert.IsTrue(Numeric.AreEqual(0.1f, set[0].PenetrationDepth, 0.001f)); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0.1f, 0, 0.1f), set[0].PositionALocal, 0.01f)); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, 1, 0), set[0].Normal, 0.1f)); // The same with a swapped set. set = set.Swapped; algo.UpdateContacts(set, 0); Assert.AreEqual(1, set.Count); Assert.IsTrue(Numeric.AreEqual(0.1f, set[0].PenetrationDepth, 0.001f)); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0.1f, 0, 0.1f), set[0].PositionBLocal, 0.01f)); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, -1, 0), set[0].Normal, 0.1f)); // Separation. ((GeometricObject)b.GeometricObject).Pose = new Pose(new Vector3F(0.2f, 1.2f, 0.3f)); set = set.Swapped; Assert.AreEqual(false, algo.HaveContact(a, b)); Assert.AreEqual(false, algo.HaveContact(b, a)); algo.UpdateClosestPoints(set, 0); Assert.IsTrue(Numeric.AreEqual(-0.2f, set[0].PenetrationDepth, 0.001f)); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0.2f, 0, 0.3f), set[0].PositionALocal, 0.01f)); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, 1, 0), set[0].Normal, 0.1f)); algo.UpdateContacts(set, 0); Assert.AreEqual(0, set.Count); }
public void ComputeCollision() { CollisionObject a = new CollisionObject(); TriangleMesh mesh = new TriangleMesh(); mesh.Add(new Triangle(new Vector3F(0, 0, 0), new Vector3F(0, 0, 1), new Vector3F(1, 0, 0)), false); mesh.Add(new Triangle(new Vector3F(1, 0, 0), new Vector3F(0, 0, 1), new Vector3F(1, 0, 1)), false); TriangleMeshShape meshShape = new TriangleMeshShape(); meshShape.Mesh = mesh; a.GeometricObject = new GeometricObject(meshShape, Pose.Identity); CollisionObject b = new CollisionObject(new GeometricObject { Shape = new SphereShape(1), Pose = new Pose(new Vector3F(0, 0.9f, 0)), }); ContactSet set; TriangleMeshAlgorithm algo = new TriangleMeshAlgorithm(new CollisionDetection()); set = algo.GetClosestPoints(a, b); Assert.AreEqual(true, algo.HaveContact(a, b)); Assert.AreEqual(true, algo.HaveContact(b, a)); Assert.AreEqual(1, set.Count); Assert.IsTrue(Numeric.AreEqual(0.1f, set[0].PenetrationDepth, 0.001f)); //Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, 0, 0), set[0].PositionALocal, 0.01f)); // MPR will not return the perfect contact point. Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, 1, 0), set[0].Normal, 0.1f)); ((GeometricObject)b.GeometricObject).Pose = new Pose(new Vector3F(0.1f, 0.9f, 0.1f)); algo.UpdateContacts(set, 0); Assert.AreEqual(true, algo.HaveContact(a, b)); Assert.AreEqual(true, algo.HaveContact(b, a)); Assert.AreEqual(1, set.Count); Assert.IsTrue(Numeric.AreEqual(0.1f, set[0].PenetrationDepth, 0.001f)); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0.1f, 0, 0.1f), set[0].PositionALocal, 0.01f)); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, 1, 0), set[0].Normal, 0.1f)); // The same with a swapped set. set = set.Swapped; algo.UpdateContacts(set, 0); Assert.AreEqual(1, set.Count); Assert.IsTrue(Numeric.AreEqual(0.1f, set[0].PenetrationDepth, 0.001f)); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0.1f, 0, 0.1f), set[0].PositionBLocal, 0.01f)); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, -1, 0), set[0].Normal, 0.1f)); // Separation. ((GeometricObject)b.GeometricObject).Pose = new Pose(new Vector3F(0.2f, 1.2f, 0.3f)); set = set.Swapped; Assert.AreEqual(false, algo.HaveContact(a, b)); Assert.AreEqual(false, algo.HaveContact(b, a)); algo.UpdateClosestPoints(set, 0); Assert.IsTrue(Numeric.AreEqual(-0.2f, set[0].PenetrationDepth, 0.001f)); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0.2f, 0, 0.3f), set[0].PositionALocal, 0.01f)); Assert.IsTrue(Vector3F.AreNumericallyEqual(new Vector3F(0, 1, 0), set[0].Normal, 0.1f)); algo.UpdateContacts(set, 0); Assert.AreEqual(0, set.Count); }
public CollisionAlgorithmMatrix(CollisionDetection collisionDetection) { // Initialize with dummy collision algorithms. var noAlgo = new NoCollisionAlgorithm(collisionDetection); // Definitely no collision wanted. var infiniteAlgo = new InfiniteShapeAlgorithm(collisionDetection); // Returns always a collision. // Build default configuration: var gjk = new Gjk(collisionDetection); var gjkBoxAlgorithm = new CombinedCollisionAlgorithm(collisionDetection, gjk, new BoxBoxAlgorithm(collisionDetection)); var gjkMprAlgorithm = new CombinedCollisionAlgorithm(collisionDetection, gjk, new MinkowskiPortalRefinement(collisionDetection)); var gjkTriTriAlgorithm = new CombinedCollisionAlgorithm(collisionDetection, gjk, new TriangleTriangleAlgorithm(collisionDetection)); BoxSphereAlgorithm boxSphereAlgorithm = new BoxSphereAlgorithm(collisionDetection); CompositeShapeAlgorithm compositeAlgorithm = new CompositeShapeAlgorithm(collisionDetection); HeightFieldAlgorithm heightFieldAlgorithm = new HeightFieldAlgorithm(collisionDetection); LineAlgorithm lineAlgorithm = new LineAlgorithm(collisionDetection); PlaneBoxAlgorithm planeBoxAlgorithm = new PlaneBoxAlgorithm(collisionDetection); PlaneConvexAlgorithm planeConvexAlgorithm = new PlaneConvexAlgorithm(collisionDetection); PlaneRayAlgorithm planeRayAlgorithm = new PlaneRayAlgorithm(collisionDetection); PlaneSphereAlgorithm planeSphereAlgorithm = new PlaneSphereAlgorithm(collisionDetection); RayBoxAlgorithm rayBoxAlgorithm = new RayBoxAlgorithm(collisionDetection); RayConvexAlgorithm rayConvexAlgorithm = new RayConvexAlgorithm(collisionDetection); RaySphereAlgorithm raySphereAlgorithm = new RaySphereAlgorithm(collisionDetection); RayTriangleAlgorithm rayTriangleAlgorithm = new RayTriangleAlgorithm(collisionDetection); SphereSphereAlgorithm sphereSphereAlgorithm = new SphereSphereAlgorithm(collisionDetection); TransformedShapeAlgorithm transformedShapeAlgorithm = new TransformedShapeAlgorithm(collisionDetection); TriangleMeshAlgorithm triangleMeshAlgorithm = new TriangleMeshAlgorithm(collisionDetection); RayCompositeAlgorithm rayCompositeAlgorithm = new RayCompositeAlgorithm(collisionDetection); RayTriangleMeshAlgorithm rayTriangleMeshAlgorithm = new RayTriangleMeshAlgorithm(collisionDetection); RayHeightFieldAlgorithm rayHeightFieldAlgorithm = new RayHeightFieldAlgorithm(collisionDetection); this[typeof(PointShape), typeof(PointShape)] = gjkMprAlgorithm; this[typeof(PointShape), typeof(LineShape)] = lineAlgorithm; this[typeof(PointShape), typeof(RayShape)] = rayConvexAlgorithm; this[typeof(PointShape), typeof(LineSegmentShape)] = gjkMprAlgorithm; this[typeof(PointShape), typeof(TriangleShape)] = gjkMprAlgorithm; this[typeof(PointShape), typeof(RectangleShape)] = gjkMprAlgorithm; this[typeof(PointShape), typeof(BoxShape)] = gjkMprAlgorithm; this[typeof(PointShape), typeof(ConvexShape)] = gjkMprAlgorithm; this[typeof(PointShape), typeof(ScaledConvexShape)] = gjkMprAlgorithm; this[typeof(PointShape), typeof(CircleShape)] = gjkMprAlgorithm; this[typeof(PointShape), typeof(SphereShape)] = gjkMprAlgorithm; this[typeof(PointShape), typeof(CapsuleShape)] = gjkMprAlgorithm; this[typeof(PointShape), typeof(ConeShape)] = gjkMprAlgorithm; this[typeof(PointShape), typeof(CylinderShape)] = gjkMprAlgorithm; this[typeof(PointShape), typeof(EmptyShape)] = noAlgo; this[typeof(PointShape), typeof(InfiniteShape)] = infiniteAlgo; this[typeof(PointShape), typeof(PlaneShape)] = planeConvexAlgorithm; this[typeof(PointShape), typeof(HeightField)] = heightFieldAlgorithm; this[typeof(PointShape), typeof(TriangleMeshShape)] = triangleMeshAlgorithm; this[typeof(PointShape), typeof(TransformedShape)] = transformedShapeAlgorithm; this[typeof(PointShape), typeof(CompositeShape)] = compositeAlgorithm; this[typeof(LineShape), typeof(LineShape)] = lineAlgorithm; this[typeof(LineShape), typeof(RayShape)] = lineAlgorithm; this[typeof(LineShape), typeof(LineSegmentShape)] = lineAlgorithm; this[typeof(LineShape), typeof(TriangleShape)] = lineAlgorithm; this[typeof(LineShape), typeof(RectangleShape)] = lineAlgorithm; this[typeof(LineShape), typeof(BoxShape)] = lineAlgorithm; this[typeof(LineShape), typeof(ConvexShape)] = lineAlgorithm; this[typeof(LineShape), typeof(ScaledConvexShape)] = lineAlgorithm; this[typeof(LineShape), typeof(CircleShape)] = lineAlgorithm; this[typeof(LineShape), typeof(SphereShape)] = lineAlgorithm; this[typeof(LineShape), typeof(CapsuleShape)] = lineAlgorithm; this[typeof(LineShape), typeof(ConeShape)] = lineAlgorithm; this[typeof(LineShape), typeof(CylinderShape)] = lineAlgorithm; this[typeof(LineShape), typeof(EmptyShape)] = noAlgo; this[typeof(LineShape), typeof(InfiniteShape)] = infiniteAlgo; this[typeof(LineShape), typeof(PlaneShape)] = noAlgo; this[typeof(LineShape), typeof(HeightField)] = noAlgo; this[typeof(LineShape), typeof(TriangleMeshShape)] = lineAlgorithm; this[typeof(LineShape), typeof(TransformedShape)] = lineAlgorithm; this[typeof(LineShape), typeof(CompositeShape)] = lineAlgorithm; this[typeof(RayShape), typeof(RayShape)] = noAlgo; this[typeof(RayShape), typeof(LineSegmentShape)] = rayConvexAlgorithm; this[typeof(RayShape), typeof(TriangleShape)] = rayTriangleAlgorithm; this[typeof(RayShape), typeof(RectangleShape)] = rayConvexAlgorithm; this[typeof(RayShape), typeof(BoxShape)] = rayBoxAlgorithm; this[typeof(RayShape), typeof(ConvexShape)] = rayConvexAlgorithm; this[typeof(RayShape), typeof(ScaledConvexShape)] = rayConvexAlgorithm; this[typeof(RayShape), typeof(CircleShape)] = rayConvexAlgorithm; this[typeof(RayShape), typeof(SphereShape)] = raySphereAlgorithm; this[typeof(RayShape), typeof(CapsuleShape)] = rayConvexAlgorithm; this[typeof(RayShape), typeof(ConeShape)] = rayConvexAlgorithm; this[typeof(RayShape), typeof(CylinderShape)] = rayConvexAlgorithm; this[typeof(RayShape), typeof(EmptyShape)] = noAlgo; this[typeof(RayShape), typeof(InfiniteShape)] = infiniteAlgo; this[typeof(RayShape), typeof(PlaneShape)] = planeRayAlgorithm; this[typeof(RayShape), typeof(HeightField)] = rayHeightFieldAlgorithm; this[typeof(RayShape), typeof(TriangleMeshShape)] = rayTriangleMeshAlgorithm; this[typeof(RayShape), typeof(TransformedShape)] = transformedShapeAlgorithm; this[typeof(RayShape), typeof(CompositeShape)] = rayCompositeAlgorithm; this[typeof(LineSegmentShape), typeof(LineSegmentShape)] = gjkMprAlgorithm; this[typeof(LineSegmentShape), typeof(TriangleShape)] = gjkMprAlgorithm; this[typeof(LineSegmentShape), typeof(RectangleShape)] = gjkMprAlgorithm; this[typeof(LineSegmentShape), typeof(BoxShape)] = gjkMprAlgorithm; this[typeof(LineSegmentShape), typeof(ConvexShape)] = gjkMprAlgorithm; this[typeof(LineSegmentShape), typeof(ScaledConvexShape)] = gjkMprAlgorithm; this[typeof(LineSegmentShape), typeof(CircleShape)] = gjkMprAlgorithm; this[typeof(LineSegmentShape), typeof(SphereShape)] = gjkMprAlgorithm; this[typeof(LineSegmentShape), typeof(CapsuleShape)] = gjkMprAlgorithm; this[typeof(LineSegmentShape), typeof(ConeShape)] = gjkMprAlgorithm; this[typeof(LineSegmentShape), typeof(CylinderShape)] = gjkMprAlgorithm; this[typeof(LineSegmentShape), typeof(EmptyShape)] = noAlgo; this[typeof(LineSegmentShape), typeof(InfiniteShape)] = infiniteAlgo; this[typeof(LineSegmentShape), typeof(PlaneShape)] = planeConvexAlgorithm; this[typeof(LineSegmentShape), typeof(HeightField)] = heightFieldAlgorithm; this[typeof(LineSegmentShape), typeof(TriangleMeshShape)] = triangleMeshAlgorithm; this[typeof(LineSegmentShape), typeof(TransformedShape)] = transformedShapeAlgorithm; this[typeof(LineSegmentShape), typeof(CompositeShape)] = compositeAlgorithm; this[typeof(TriangleShape), typeof(TriangleShape)] = gjkTriTriAlgorithm; this[typeof(TriangleShape), typeof(RectangleShape)] = gjkMprAlgorithm; this[typeof(TriangleShape), typeof(BoxShape)] = gjkMprAlgorithm; this[typeof(TriangleShape), typeof(ConvexShape)] = gjkMprAlgorithm; this[typeof(TriangleShape), typeof(ScaledConvexShape)] = gjkMprAlgorithm; this[typeof(TriangleShape), typeof(CircleShape)] = gjkMprAlgorithm; this[typeof(TriangleShape), typeof(SphereShape)] = gjkMprAlgorithm; this[typeof(TriangleShape), typeof(CapsuleShape)] = gjkMprAlgorithm; this[typeof(TriangleShape), typeof(ConeShape)] = gjkMprAlgorithm; this[typeof(TriangleShape), typeof(CylinderShape)] = gjkMprAlgorithm; this[typeof(TriangleShape), typeof(EmptyShape)] = noAlgo; this[typeof(TriangleShape), typeof(InfiniteShape)] = infiniteAlgo; this[typeof(TriangleShape), typeof(PlaneShape)] = planeConvexAlgorithm; this[typeof(TriangleShape), typeof(HeightField)] = heightFieldAlgorithm; this[typeof(TriangleShape), typeof(TriangleMeshShape)] = triangleMeshAlgorithm; this[typeof(TriangleShape), typeof(TransformedShape)] = transformedShapeAlgorithm; this[typeof(TriangleShape), typeof(CompositeShape)] = compositeAlgorithm; this[typeof(RectangleShape), typeof(RectangleShape)] = gjkMprAlgorithm; this[typeof(RectangleShape), typeof(BoxShape)] = gjkMprAlgorithm; this[typeof(RectangleShape), typeof(ConvexShape)] = gjkMprAlgorithm; this[typeof(RectangleShape), typeof(ScaledConvexShape)] = gjkMprAlgorithm; this[typeof(RectangleShape), typeof(CircleShape)] = gjkMprAlgorithm; this[typeof(RectangleShape), typeof(SphereShape)] = gjkMprAlgorithm; this[typeof(RectangleShape), typeof(CapsuleShape)] = gjkMprAlgorithm; this[typeof(RectangleShape), typeof(ConeShape)] = gjkMprAlgorithm; this[typeof(RectangleShape), typeof(CylinderShape)] = gjkMprAlgorithm; this[typeof(RectangleShape), typeof(EmptyShape)] = noAlgo; this[typeof(RectangleShape), typeof(InfiniteShape)] = infiniteAlgo; this[typeof(RectangleShape), typeof(PlaneShape)] = planeConvexAlgorithm; this[typeof(RectangleShape), typeof(HeightField)] = heightFieldAlgorithm; this[typeof(RectangleShape), typeof(TriangleMeshShape)] = triangleMeshAlgorithm; this[typeof(RectangleShape), typeof(TransformedShape)] = transformedShapeAlgorithm; this[typeof(RectangleShape), typeof(CompositeShape)] = compositeAlgorithm; this[typeof(BoxShape), typeof(BoxShape)] = gjkBoxAlgorithm; this[typeof(BoxShape), typeof(ConvexShape)] = gjkMprAlgorithm; this[typeof(BoxShape), typeof(ScaledConvexShape)] = gjkMprAlgorithm; this[typeof(BoxShape), typeof(CircleShape)] = gjkMprAlgorithm; this[typeof(BoxShape), typeof(SphereShape)] = boxSphereAlgorithm; this[typeof(BoxShape), typeof(CapsuleShape)] = gjkMprAlgorithm; this[typeof(BoxShape), typeof(ConeShape)] = gjkMprAlgorithm; this[typeof(BoxShape), typeof(CylinderShape)] = gjkMprAlgorithm; this[typeof(BoxShape), typeof(EmptyShape)] = noAlgo; this[typeof(BoxShape), typeof(InfiniteShape)] = infiniteAlgo; this[typeof(BoxShape), typeof(PlaneShape)] = planeBoxAlgorithm; this[typeof(BoxShape), typeof(HeightField)] = heightFieldAlgorithm; this[typeof(BoxShape), typeof(TriangleMeshShape)] = triangleMeshAlgorithm; this[typeof(BoxShape), typeof(TransformedShape)] = transformedShapeAlgorithm; this[typeof(BoxShape), typeof(CompositeShape)] = compositeAlgorithm; this[typeof(ConvexShape), typeof(ConvexShape)] = gjkMprAlgorithm; this[typeof(ConvexShape), typeof(ScaledConvexShape)] = gjkMprAlgorithm; this[typeof(ConvexShape), typeof(CircleShape)] = gjkMprAlgorithm; this[typeof(ConvexShape), typeof(SphereShape)] = gjkMprAlgorithm; this[typeof(ConvexShape), typeof(CapsuleShape)] = gjkMprAlgorithm; this[typeof(ConvexShape), typeof(ConeShape)] = gjkMprAlgorithm; this[typeof(ConvexShape), typeof(CylinderShape)] = gjkMprAlgorithm; this[typeof(ConvexShape), typeof(EmptyShape)] = noAlgo; this[typeof(ConvexShape), typeof(InfiniteShape)] = infiniteAlgo; this[typeof(ConvexShape), typeof(PlaneShape)] = planeConvexAlgorithm; this[typeof(ConvexShape), typeof(HeightField)] = heightFieldAlgorithm; this[typeof(ConvexShape), typeof(TriangleMeshShape)] = triangleMeshAlgorithm; this[typeof(ConvexShape), typeof(TransformedShape)] = transformedShapeAlgorithm; this[typeof(ConvexShape), typeof(CompositeShape)] = compositeAlgorithm; this[typeof(ScaledConvexShape), typeof(ScaledConvexShape)] = gjkMprAlgorithm; this[typeof(ScaledConvexShape), typeof(CircleShape)] = gjkMprAlgorithm; this[typeof(ScaledConvexShape), typeof(SphereShape)] = gjkMprAlgorithm; this[typeof(ScaledConvexShape), typeof(CapsuleShape)] = gjkMprAlgorithm; this[typeof(ScaledConvexShape), typeof(ConeShape)] = gjkMprAlgorithm; this[typeof(ScaledConvexShape), typeof(CylinderShape)] = gjkMprAlgorithm; this[typeof(ScaledConvexShape), typeof(EmptyShape)] = noAlgo; this[typeof(ScaledConvexShape), typeof(InfiniteShape)] = infiniteAlgo; this[typeof(ScaledConvexShape), typeof(PlaneShape)] = planeConvexAlgorithm; this[typeof(ScaledConvexShape), typeof(HeightField)] = heightFieldAlgorithm; this[typeof(ScaledConvexShape), typeof(TriangleMeshShape)] = triangleMeshAlgorithm; this[typeof(ScaledConvexShape), typeof(TransformedShape)] = transformedShapeAlgorithm; this[typeof(ScaledConvexShape), typeof(CompositeShape)] = compositeAlgorithm; this[typeof(CircleShape), typeof(CircleShape)] = gjkMprAlgorithm; this[typeof(CircleShape), typeof(SphereShape)] = gjkMprAlgorithm; this[typeof(CircleShape), typeof(CapsuleShape)] = gjkMprAlgorithm; this[typeof(CircleShape), typeof(ConeShape)] = gjkMprAlgorithm; this[typeof(CircleShape), typeof(CylinderShape)] = gjkMprAlgorithm; this[typeof(CircleShape), typeof(EmptyShape)] = noAlgo; this[typeof(CircleShape), typeof(InfiniteShape)] = infiniteAlgo; this[typeof(CircleShape), typeof(PlaneShape)] = planeConvexAlgorithm; this[typeof(CircleShape), typeof(HeightField)] = heightFieldAlgorithm; this[typeof(CircleShape), typeof(TriangleMeshShape)] = triangleMeshAlgorithm; this[typeof(CircleShape), typeof(TransformedShape)] = transformedShapeAlgorithm; this[typeof(CircleShape), typeof(CompositeShape)] = compositeAlgorithm; this[typeof(SphereShape), typeof(SphereShape)] = sphereSphereAlgorithm; this[typeof(SphereShape), typeof(CapsuleShape)] = gjkMprAlgorithm; this[typeof(SphereShape), typeof(ConeShape)] = gjkMprAlgorithm; this[typeof(SphereShape), typeof(CylinderShape)] = gjkMprAlgorithm; this[typeof(SphereShape), typeof(EmptyShape)] = noAlgo; this[typeof(SphereShape), typeof(InfiniteShape)] = infiniteAlgo; this[typeof(SphereShape), typeof(PlaneShape)] = planeSphereAlgorithm; this[typeof(SphereShape), typeof(HeightField)] = heightFieldAlgorithm; this[typeof(SphereShape), typeof(TriangleMeshShape)] = triangleMeshAlgorithm; this[typeof(SphereShape), typeof(TransformedShape)] = transformedShapeAlgorithm; this[typeof(SphereShape), typeof(CompositeShape)] = compositeAlgorithm; this[typeof(CapsuleShape), typeof(CapsuleShape)] = gjkMprAlgorithm; this[typeof(CapsuleShape), typeof(ConeShape)] = gjkMprAlgorithm; this[typeof(CapsuleShape), typeof(CylinderShape)] = gjkMprAlgorithm; this[typeof(CapsuleShape), typeof(EmptyShape)] = noAlgo; this[typeof(CapsuleShape), typeof(InfiniteShape)] = infiniteAlgo; this[typeof(CapsuleShape), typeof(PlaneShape)] = planeConvexAlgorithm; this[typeof(CapsuleShape), typeof(HeightField)] = heightFieldAlgorithm; this[typeof(CapsuleShape), typeof(TriangleMeshShape)] = triangleMeshAlgorithm; this[typeof(CapsuleShape), typeof(TransformedShape)] = transformedShapeAlgorithm; this[typeof(CapsuleShape), typeof(CompositeShape)] = compositeAlgorithm; this[typeof(ConeShape), typeof(ConeShape)] = gjkMprAlgorithm; this[typeof(ConeShape), typeof(CylinderShape)] = gjkMprAlgorithm; this[typeof(ConeShape), typeof(EmptyShape)] = noAlgo; this[typeof(ConeShape), typeof(InfiniteShape)] = infiniteAlgo; this[typeof(ConeShape), typeof(PlaneShape)] = planeConvexAlgorithm; this[typeof(ConeShape), typeof(HeightField)] = heightFieldAlgorithm; this[typeof(ConeShape), typeof(TriangleMeshShape)] = triangleMeshAlgorithm; this[typeof(ConeShape), typeof(TransformedShape)] = transformedShapeAlgorithm; this[typeof(ConeShape), typeof(CompositeShape)] = compositeAlgorithm; this[typeof(CylinderShape), typeof(CylinderShape)] = gjkMprAlgorithm; this[typeof(CylinderShape), typeof(EmptyShape)] = noAlgo; this[typeof(CylinderShape), typeof(InfiniteShape)] = infiniteAlgo; this[typeof(CylinderShape), typeof(PlaneShape)] = planeConvexAlgorithm; this[typeof(CylinderShape), typeof(HeightField)] = heightFieldAlgorithm; this[typeof(CylinderShape), typeof(TriangleMeshShape)] = triangleMeshAlgorithm; this[typeof(CylinderShape), typeof(TransformedShape)] = transformedShapeAlgorithm; this[typeof(CylinderShape), typeof(CompositeShape)] = compositeAlgorithm; this[typeof(EmptyShape), typeof(EmptyShape)] = noAlgo; this[typeof(EmptyShape), typeof(InfiniteShape)] = noAlgo; // No collision between Empty and Infinite. this[typeof(EmptyShape), typeof(PlaneShape)] = noAlgo; this[typeof(EmptyShape), typeof(HeightField)] = noAlgo; this[typeof(EmptyShape), typeof(TriangleMeshShape)] = noAlgo; this[typeof(EmptyShape), typeof(TransformedShape)] = noAlgo; this[typeof(EmptyShape), typeof(CompositeShape)] = noAlgo; this[typeof(InfiniteShape), typeof(InfiniteShape)] = infiniteAlgo; this[typeof(InfiniteShape), typeof(PlaneShape)] = infiniteAlgo; this[typeof(InfiniteShape), typeof(HeightField)] = infiniteAlgo; this[typeof(InfiniteShape), typeof(TriangleMeshShape)] = infiniteAlgo; this[typeof(InfiniteShape), typeof(TransformedShape)] = infiniteAlgo; this[typeof(InfiniteShape), typeof(CompositeShape)] = infiniteAlgo; this[typeof(PlaneShape), typeof(PlaneShape)] = noAlgo; this[typeof(PlaneShape), typeof(HeightField)] = noAlgo; this[typeof(PlaneShape), typeof(TriangleMeshShape)] = triangleMeshAlgorithm; this[typeof(PlaneShape), typeof(TransformedShape)] = transformedShapeAlgorithm; this[typeof(PlaneShape), typeof(CompositeShape)] = compositeAlgorithm; this[typeof(HeightField), typeof(HeightField)] = noAlgo; // We could also call triangleMeshAlgorithm. But since HeightField has usually larger parts it // is better to call the heightFieldAlgorithm. The heightFieldAlgorithm will cull all but a // few height field cells very quickly. this[typeof(HeightField), typeof(TriangleMeshShape)] = heightFieldAlgorithm; this[typeof(HeightField), typeof(TransformedShape)] = transformedShapeAlgorithm; // Same as for triangle meshes: Call height field algorithm first. this[typeof(HeightField), typeof(CompositeShape)] = heightFieldAlgorithm; this[typeof(TriangleMeshShape), typeof(TriangleMeshShape)] = triangleMeshAlgorithm; this[typeof(TriangleMeshShape), typeof(TransformedShape)] = transformedShapeAlgorithm; this[typeof(TriangleMeshShape), typeof(CompositeShape)] = compositeAlgorithm; this[typeof(TransformedShape), typeof(TransformedShape)] = transformedShapeAlgorithm; this[typeof(TransformedShape), typeof(CompositeShape)] = transformedShapeAlgorithm; this[typeof(CompositeShape), typeof(CompositeShape)] = compositeAlgorithm; }
public void ComputeCollisionBvh() { CollisionObject a = new CollisionObject(); TriangleMesh meshA = new TriangleMesh(); meshA.Add(new Triangle(new Vector3F(0, 0, 0), new Vector3F(0, 0, 1), new Vector3F(1, 0, 0)), false); var meshShapeA = new TriangleMeshShape(); meshShapeA.Mesh = meshA; meshShapeA.Partition = new AabbTree<int>(); ((GeometricObject)a.GeometricObject).Shape = meshShapeA; CollisionObject b = new CollisionObject(); TriangleMesh meshB = new TriangleMesh(); meshB.Add(new Triangle(new Vector3F(2, 0, 0), new Vector3F(2, 0, 1), new Vector3F(3, 0, 0)), false); TriangleMeshShape meshShapeB = new TriangleMeshShape(); meshShapeB.Mesh = meshB; meshShapeB.Partition = new AabbTree<int>(); ((GeometricObject)b.GeometricObject).Shape = meshShapeB; ((GeometricObject)b.GeometricObject).Pose = new Pose(new Vector3F(-2, 0, 0)); CollisionAlgorithm algo = new TriangleMeshAlgorithm(new CollisionDetection()); Assert.AreEqual(true, algo.HaveContact(a, b)); }