public void TestResovleMultiContacts() { var resolver = new ParticleContactResolver(100); var p = new List <Particle> { new Particle { Position = new Vector2D(0, 0), Velocity = new Vector2D(0, 0), Mass = 1 }, new Particle { Position = new Vector2D(2, 0), Velocity = new Vector2D(0, 0), Mass = 1 }, new Particle { Position = new Vector2D(4, 0), Velocity = new Vector2D(0, 0), Mass = 1 } }; var contactList = new List <ParticleContact> { new ParticleContact(p[0], p[1], 1, 1, new Vector2D(-1, 0)), new ParticleContact(p[2], p[1], 1, 1, new Vector2D(1, 0)) }; resolver.ResolveContacts(contactList, 1 / 60.0); Assert.AreEqual(new Vector2D(-1, 0), p[0].Position, "物体0向左分离"); Assert.AreEqual(new Vector2D(2, 0), p[1].Position, "物体1位置不变"); Assert.AreEqual(new Vector2D(5, 0), p[2].Position, "物体2向右分离"); }
public void TestGetterAndSetterOfIterations() { var resolver = new ParticleContactResolver(100); resolver.Iterations = 1000; Assert.AreEqual(1000, resolver.Iterations); }
/// <summary> /// Crea un nuovo particle simulator che gestisce il dato numero di contatti per frame. /// Si può specificare il numero di iterazioni massime da usare. /// </summary> /// <param name="maxContacts">Massimo numero di contacts gestiti</param> /// <param name="iteration">Massimo numero di iterazioni nella risoluzione dei contacts</param> public ParticleWorld(uint maxContacts, uint iteration) { Particles = new List <Particle>(); forceRegistry = new ForceRegistry(); resolver = new ParticleContactResolver(iteration); contactGenRegistration = new List <ParticleContactGenerator>(); contacts = new List <ParticleContact>(); }
public void TestResolveContacts() { var resolver = new ParticleContactResolver(100); var p = new List <Particle> { new Particle { Position = new Vector2D(0, 0), Velocity = new Vector2D(1, 0), Mass = 1 }, new Particle { Position = new Vector2D(2, 0), Velocity = new Vector2D(0, 0), Mass = 1 } }; var contact = new ParticleContact(p[0], p[1], 1, 1, new Vector2D(-1, 0)); var contactList = new List <ParticleContact>(); resolver.ResolveContacts(contactList, 1 / 60.0); contactList.Add(contact); resolver.ResolveContacts(contactList, 1 / 60.0); Assert.AreEqual(new Vector2D(-1, 0), p[0].Position, "物体0依据速度分量分离"); Assert.AreEqual(new Vector2D(0, 0), p[0].Velocity, "物体0碰撞后速度相反"); Assert.AreEqual(new Vector2D(1, 0), p[1].Velocity, "物体1碰撞后速度相反"); p = new List <Particle> { new Particle { Position = new Vector2D(0, 0), Velocity = new Vector2D(1, 0), Mass = 1 }, new Particle { Position = new Vector2D(2, 0), Velocity = new Vector2D(0, 0), Mass = 1 } }; contactList = new List <ParticleContact> { new ParticleContact(p[1], p[0], 1, 1, new Vector2D(1, 0)) }; resolver.ResolveContacts(contactList, 1 / 60.0); Assert.AreEqual(new Vector2D(-1, 0), p[0].Position, "函数满足对称性"); Assert.AreEqual(new Vector2D(0, 0), p[0].Velocity, "函数满足对称性"); Assert.AreEqual(new Vector2D(1, 0), p[1].Velocity, "函数满足对称性"); }
/// <summary> /// Creates a new particle simulator that can handle up to the /// given number of contacts per frame.You can also optionally /// give a number of contact-resolution iterations to use. If you /// don't give a number of iterations, then twice the number of /// contacts will be used. /// </summary> public ParticleEngine(int maxContacts) { Particles = new List <Particle>(); ForceAreas = new List <ParticleForceArea>(); Forces = new List <ParticleForce>(); Constraints = new List <ParticleConstraint>(); Resolver = new ParticleContactResolver(); m_contacts = new ParticleContact[maxContacts]; for (int i = 0; i < maxContacts; i++) { m_contacts[i] = new ParticleContact(); } }
public void TestConstructor() { var resolver = new ParticleContactResolver(100); Assert.AreEqual(100, resolver.Iterations); }
private void Awake() { resolver = GetComponent <ParticleContactResolver>(); particles = FindObjectsOfType <Particle>(); }