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);
        }
示例#3
0
 /// <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, "函数满足对称性");
        }
示例#5
0
        /// <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);
        }
示例#7
0
 private void Awake()
 {
     resolver  = GetComponent <ParticleContactResolver>();
     particles = FindObjectsOfType <Particle>();
 }