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)); } } }
private bool disposedValue = false; // 要检测冗余调用 protected virtual void Dispose(bool disposing) { if (!disposedValue) { if (disposing) { // TODO: 释放托管状态(托管对象)。 } // TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。 // TODO: 将大型字段设置为 null。 particle.Dispose(); particle = null; disposedValue = true; } }
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]); } }
public Ammo(GameObject go) { particle = new PhysicsEngineForFun.Particle(); startTime = 0; this.go = GameObject.Instantiate(go); }
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(); }
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(); }