コード例 #1
0
ファイル: BlobGame.cs プロジェクト: zcvdf/PhysicsEngineForFun
        public override void UpdateForce(PhysicsEngineForFun.Particle particle, float duration)
        {
            if (particles == null)
            {
                Debug.LogError("Please Assign a value to the variable named particles");
                return;
            }

            int joinCount = 0;

            if (particles == null)
            {
                Debug.LogError("Please Assign a value to the variable named particles");
                return;
            }

            foreach (var p in particles)
            {
                Vector3 dir = p.GetParticlePos() - particle.GetParticlePos();

                float dis = dir.magnitude;

                if (dis < minNaturalDistance)
                {
                    float a = dis / minNaturalDistance;
                    particle.AddForce(
                        (dir.normalized * a * maximumForceToPushApart * -1.0f)
                        .GetPhysicsEngineVector3()
                        );
                    joinCount++;
                }
                else if (dis > maxNaturalDistance && dis < maxDistance)
                {
                    float a = (dis - maxNaturalDistance) / (maxDistance - maxNaturalDistance);
                    particle.AddForce(
                        (dir.normalized * a * maximumForceToPullTogether)
                        .GetPhysicsEngineVector3()
                        );
                    joinCount++;
                }

                if (p == particle && joinCount > 0)
                {
                    float force = joinCount / particles.Length * maximumForceToFloat;
                    if (force > maximumForceToFloat)
                    {
                        force = maximumForceToFloat;
                    }
                    particle.AddForce(new PhysicsEngineForFun.Vector3(0, force, 0));
                }
            }
        }
コード例 #2
0
        private bool disposedValue = false; // 要检测冗余调用

        protected virtual void Dispose(bool disposing)
        {
            if (!disposedValue)
            {
                if (disposing)
                {
                    // TODO: 释放托管状态(托管对象)。
                }

                // TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
                // TODO: 将大型字段设置为 null。
                particle.Dispose();
                particle = null;

                disposedValue = true;
            }
        }
コード例 #3
0
ファイル: BlobGame.cs プロジェクト: zcvdf/PhysicsEngineForFun
    private void Start()
    {
        blobForceGenerator = new BlobForceGenerator()
        {
            particles = particles,
            maximumForceToPullTogether = 10f,
            maximumForceToPushApart    = 10f,
            maximumForceToFloat        = 2f,
            minNaturalDistance         = partcleRadius * 0.7f,
            maxNaturalDistance         = partcleRadius * 1.4f,
            maxDistance = partcleRadius * 2.1f
        };



        for (int i = 0; i < 5; ++i)
        {
            particles[i] = new PhysicsEngineForFun.Particle()
            {
                velocity     = new PhysicsEngineForFun.Vector3(0, 0, 0),
                position     = new PhysicsEngineForFun.Vector3(Random.Range(2 * i - 5, 2 * i + -3), 3, 0),
                acceleration = new PhysicsEngineForFun.Vector3(0, -2f, 0),
                damping      = 0.2f
            };

            particles[i].SetMass(0.2f);
            particles[i].ClearAccumulator();

            world.particles.Add(particles[i]);

            platforms[i] = new Platform()
            {
                PointInPlatform = Vector3.zero,
                Normal          = Vector3.up,
                ParticleRadius  = partcleRadius,
                CheckParticle   = particles[i]
            };

            world.registry.Add(particles[i], blobForceGenerator);

            world.contactGenerators.Add(platforms[i]);
        }
    }
コード例 #4
0
 public Ammo(GameObject go)
 {
     particle  = new PhysicsEngineForFun.Particle();
     startTime = 0;
     this.go   = GameObject.Instantiate(go);
 }
コード例 #5
0
ファイル: Bridge.cs プロジェクト: zcvdf/PhysicsEngineForFun
    private void Start()
    {
        for (int i = 0; i < 12; ++i)
        {
            PhysicsEngineForFun.Particle p = new PhysicsEngineForFun.Particle
            {
                position     = new PhysicsEngineForFun.Vector3(i / 2, 0, i % 2),
                velocity     = new PhysicsEngineForFun.Vector3(0, 0, 0),
                damping      = 0.9f,
                acceleration = new PhysicsEngineForFun.Vector3(0, -9.8f, 0)
            };

            p.ClearAccumulator();

            world.particles.Add(p);

            particles[i] = p;
        }

        for (int i = 0; i < 10; ++i)
        {
            PhysicsEngineForFun.ParticleCable c = new PhysicsEngineForFun.ParticleCable
            {
                particle0 = particles[i],
                particle1 = particles[i + 2],
                maxLength = 2f,
                restitutionCoefficient = 0.3f
            };

            world.contactGenerators.Add(c);

            cables[i] = c;
        }

        for (int i = 0; i < 12; ++i)
        {
            PhysicsEngineForFun.ParticleCableConstraint c = new PhysicsEngineForFun.ParticleCableConstraint()
            {
                particle               = particles[i],
                anchorPoint            = new PhysicsEngineForFun.Vector3(i / 2 * 2f + 4f, 4, i % 2 * 1.4f - 3.2f),
                maxLength              = i < 6 ? i / 2 * 0.5f + 3f : (5 - i / 2) * 0.5f + 3f,
                restitutionCoefficient = 0.5f
            };

            world.contactGenerators.Add(c);

            constraints[i] = c;
        }

        for (int i = 0; i < 6; ++i)
        {
            PhysicsEngineForFun.ParticleConnectingRod r = new PhysicsEngineForFun.ParticleConnectingRod()
            {
                particle0 = particles[i * 2],
                particle1 = particles[i * 2 + 1],
                Length    = 2f
            };

            world.contactGenerators.Add(r);

            connectingRods[i] = r;
        }

        UpdateAdditionalMass();
    }
コード例 #6
0
    private void Start()
    {
        for (int i = 0; i < 4; ++i)
        {
            PhysicsEngineForFun.Particle p = new PhysicsEngineForFun.Particle
            {
                velocity     = new PhysicsEngineForFun.Vector3(0, 0, 0),
                damping      = 0.9f,
                acceleration = new PhysicsEngineForFun.Vector3(0, -9.8f, 0)
            };
            p.ClearAccumulator();

            world.particles.Add(p);

            particles[i] = p;
        }

        particles[0].position = new PhysicsEngineForFun.Vector3(-3, 2, 1);
        particles[1].position = new PhysicsEngineForFun.Vector3(-3, 2, -1);
        particles[2].position = new PhysicsEngineForFun.Vector3(4, 2, 1);
        particles[3].position = new PhysicsEngineForFun.Vector3(4, 2, -1);

        for (int i = 0; i < 6; ++i)
        {
            connectingRods[i] = new PhysicsEngineForFun.ParticleConnectingRod();
            world.contactGenerators.Add(connectingRods[i]);
        }

        connectingRods[0].particle0 = particles[0];
        connectingRods[0].particle1 = particles[1];
        connectingRods[0].Length    = 2;
        connectingRods[1].particle0 = particles[2];
        connectingRods[1].particle1 = particles[3];
        connectingRods[1].Length    = 2;
        connectingRods[2].particle0 = particles[0];
        connectingRods[2].particle1 = particles[2];
        connectingRods[2].Length    = 7;
        connectingRods[3].particle0 = particles[1];
        connectingRods[3].particle1 = particles[3];
        connectingRods[3].Length    = 7;
        connectingRods[4].particle0 = particles[0];
        connectingRods[4].particle1 = particles[3];
        connectingRods[4].Length    = 7.28f;
        connectingRods[5].particle0 = particles[1];
        connectingRods[5].particle1 = particles[2];
        connectingRods[5].Length    = 7.28f;

        for (int i = 0; i < 8; ++i)
        {
            rodsConstraints[i] = new PhysicsEngineForFun.ParticleConnectingRodConstraint();
            world.contactGenerators.Add(rodsConstraints[i]);
        }

        rodsConstraints[0].anchorPoint = fixedPoints[0];
        rodsConstraints[0].particle    = particles[0];
        rodsConstraints[0].Length      = 3.606f;
        rodsConstraints[1].anchorPoint = fixedPoints[1];
        rodsConstraints[1].particle    = particles[1];
        rodsConstraints[1].Length      = 3.606f;
        rodsConstraints[2].anchorPoint = fixedPoints[0];
        rodsConstraints[2].particle    = particles[2];
        rodsConstraints[2].Length      = 4.472f;
        rodsConstraints[3].anchorPoint = fixedPoints[1];
        rodsConstraints[3].particle    = particles[3];
        rodsConstraints[3].Length      = 4.472f;
        rodsConstraints[4].anchorPoint = fixedPoints[0];
        rodsConstraints[4].particle    = particles[1];
        rodsConstraints[4].Length      = 4.123f;
        rodsConstraints[5].particle    = particles[3];
        rodsConstraints[5].anchorPoint = fixedPoints[0];
        rodsConstraints[5].Length      = 4.899f;
        rodsConstraints[6].particle    = particles[2];
        rodsConstraints[6].anchorPoint = fixedPoints[1];
        rodsConstraints[6].Length      = 4.899f;
        rodsConstraints[7].anchorPoint = fixedPoints[1];
        rodsConstraints[7].particle    = particles[0];
        rodsConstraints[7].Length      = 4.123f;

        UpdateAdditionalMass();
    }