public void TestResolveVelocityWithAcceleration() { var p = new Particle { Position = new Vector2D(0, 0), Velocity = new Vector2D(1, 0), Mass = 1 }; p.AddForce(new Vector2D(1, 0)); p.Update(1); var contact = new ParticleContact(p, null, 1, 0, new Vector2D(-1, 0)); var resolveVelocity = new PrivateObject(contact); resolveVelocity.Invoke("ResolveVelocity", 1); Assert.AreEqual(new Vector2D(-1, 0), p.Velocity, "物体获得补偿速度"); p.AddForce(new Vector2D(1, 0)); p.Update(1); Assert.AreEqual(new Vector2D(0, 0), p.Velocity, "物体保持静止"); p.AddForce(new Vector2D(-1, 0)); resolveVelocity.Invoke("ResolveVelocity", 1); Assert.AreEqual(new Vector2D(0, 0), p.Velocity, "物体不会获得补偿速度"); }
// Update is called once per frame void Update() { particle = gameObject.GetComponent <MyPhysics> ().particle; float mass = particle.mass; float gravity = particle.mass; if (Input.GetKey(KeyCode.S)) { particle.AddForce(new Vector3(-100, 0, 0)); } if (Input.GetKey(KeyCode.D)) { particle.AddForce(new Vector3(0, 0, -100)); } if (Input.GetKey(KeyCode.W)) { particle.AddForce(new Vector3(100, 0, 0)); } if (Input.GetKey(KeyCode.A)) { particle.AddForce(new Vector3(0, 0, 100)); } if (Input.GetKey(KeyCode.F)) { float flyforce = mass * gravity * 1.5f; particle.AddForce(new Vector3(0, flyforce, 0)); } if (Input.GetKeyDown(KeyCode.Space)) { RestartGame(); } }
public override void UpdateForce(Particle particle, float duaration) { float depth = particle.Position.Y; if (depth >= WaterHeight + MaxDepth) return; Vector3 force = new Vector3(); if (depth <= WaterHeight - MaxDepth) { force.Y = LiquidDensity * Volume; particle.AddForce(force); return; } // Otherwise we are partly submerged. force.Y = LiquidDensity * Volume * (depth - MaxDepth - WaterHeight) / 2 * MaxDepth; particle.AddForce(force); }
// Update is called once per frame public void Update() { Vector3 v1 = r1.v; Vector3 v2 = r2.v; Vector3 v3 = r3.v; var vAir = -p; var vSurface = (v1 + v2 + v3) / 3; v = vSurface - vAir; var particlePos = Vector3.Cross((r2.r - r1.r), (r3.r - r1.r)); //Normal of a triangle var n = particlePos / particlePos.magnitude; //Area of a triangle var aO = .5f * Vector3.Cross((r2.r - r1.r), (r3.r - r1.r)).magnitude; var a = aO + (Vector3.Dot(v, n) / v.magnitude); //Calculating the aerodynamic force var nPrime = particlePos; var totalForce = -.5f * (((v.magnitude * Vector3.Dot(v, nPrime)) / (2 * nPrime.magnitude)) * nPrime); r1.AddForce(totalForce); r2.AddForce(totalForce); r3.AddForce(totalForce); }
private void UpdateForce(Particle particle, Particle other) { if (particle.HasInfiniteMass) { return; } // Calculate the vector of the spring Vector3d force = particle.Position - other.Position; // Calculate the magnitude of the force double magnitude = force.Magnitude; if (magnitude <= m_restLength) { return; } // Calculate the magnitude of the force magnitude = (m_restLength - magnitude) * m_springConstant; // Calculate the final force and apply it force.Normalize(); force *= magnitude; particle.AddForce(force); }
public override void UpdateForce(Particle particle, float duaration) { Vector3 force = particle.Velocity; float dragcoef = force.Magnitude; dragcoef = K1 * dragcoef * K2 * dragcoef * dragcoef; force.Normalize(); force *= -dragcoef; particle.AddForce(force); }
private void addGroundForce(Particle proj, double timeIncrement) { if (LockGround) { proj.Velocity = new Vector(0, 0, 0); proj.Position = new Vector(proj.Position.X, proj.Position.Y, 0); proj.AddForce(-proj.Forces); } else { proj.Velocity = new Vector(proj.Velocity.X, proj.Velocity.Y, 0); proj.Position = new Vector(proj.Position.X, proj.Position.Y, 0); double forceZ = proj.Forces.Z; if (forceZ < 0) { proj.AddForce(new Vector(0, 0, -forceZ)); } } }
public override void ApplyTo(Particle particle, double duration) { // 质量无限大的物体不受重力影响 if (particle.InverseMass == 0) { return; } // 施加重力 particle.AddForce(this.gravity * particle.Mass); }
public override void ApplyTo(Particle particle, double duration) { foreach (var item in this.linked) { var d = particle.Position - item.Position; double force = (this.length - d.Length()) * this.k; d.Normalize(); particle.AddForce(d * force); } }
public override void UpdateForce(Particle particle, float duaration) { Vector3 force = particle.Position; force -= Other.Position; float magnit = force.Magnitude; magnit = MathHelper.Abs(magnit - RestLength); magnit *= SpringConstant; force.Normalize(); force *= -magnit; particle.AddForce(force); }
public override void UpdateForce(Particle particle, double dt) { // Check that we do not have infinite mass if (!particle.HasFiniteMass) { return; } // Apply the mass-scaled force to the particle particle.AddForce(m_gravity * particle.GetMass()); }
public override void UpdateForce(Particle particle, float duaration) { Vector3 force = particle.Position; force -= Other.Position; float magnitude = force.Magnitude; if (magnitude <= RestLength) return; magnitude = SpringConstant * (RestLength - magnitude); force.Normalize(); force *= -magnitude; particle.AddForce(force); }
public void Integrate_IfTheMassOfTheParticleIsInfinite_ForcesOtherThanGravityHaveNoEffect() { var particleNoForces = new Particle(); var particleForces = new Particle(); particleForces.AddForce(new Vector3(3.0, 4.0, 5.0)); particleNoForces.Integrate(1.0); particleForces.Integrate(1.0); Assert.IsTrue(particleForces.Position.Equals(particleNoForces.Position)); }
private void FixedUpdate() { if (gameManager.controlMode == GameManager.ControlMode.springControl) { Vector3 accVector = new Vector3(); accVector += new Vector3(0, gameManager.gravity, 0); throwableParticle.AddForce(accVector.x, accVector.y, accVector.z); throwableParticle.Integrate(Time.fixedDeltaTime); boundingRectangle.center = throwableParticle.GetPosition(); transform.position = throwableParticle.GetPosition().CycloneToUnity(); } }
void Update() { particle = gameObject.GetComponent <MyPhysics> ().particle; float mass = particle.mass; float gravity = particle.mass; if (Input.GetKey(KeyCode.A)) { particle.AddForce(new Vector3(-80, 0, 0)); } if (Input.GetKey(KeyCode.S)) { particle.AddForce(new Vector3(0, 0, -80)); } if (Input.GetKey(KeyCode.D)) { particle.AddForce(new Vector3(80, 0, 0)); } if (Input.GetKey(KeyCode.W)) { particle.AddForce(new Vector3(0, 0, 80)); } if (Input.GetKey(KeyCode.F)) { float flyforce = mass * gravity * 1.5f; particle.AddForce(new Vector3(0, flyforce, 0)); } if (Input.GetKeyDown(KeyCode.Space)) { RestartGame(); } if (Input.GetKeyDown(KeyCode.G)) { gethitClone = GameObject.Instantiate(gethit); } Vector3 direction = particle.forceAccum.normalized * 5; Debug.DrawRay(transform.position, direction, Color.cyan); }
public override void ApplyTo(Particle particle, double duration) { if (particle.Velocity == Vector2D.Zero) { return; } double c = particle.Velocity.Length(); c = this.k1 * c + this.k2 * c * c; particle.AddForce(particle.Velocity.Normalize() * -c); }
private void OnTriggerStay(Collider other) { Debug.Log(other.name); Particle s = other.GetComponent <Particle>(); if (s != null) { if (s.force.y < float.Epsilon) //운동 방향을 가짜로 표현, 떨어지고 있는 경우에만 충돌 { s.AddForce(new Vector3(0.0f, s.force.y * -1.9f, 0.0f)); //마찰을 가짜로 표현 } } }
public void ApplySpringForce(Particle particle, Vector3 mouseUpVector) { Vector3 force = new Vector3(); force = particle.GetPosition() - mouseUpVector; float magnitude = force.Magnitude(); magnitude = Mathf.Abs(magnitude - restLength); magnitude *= springConstant; force.Normalize(); force *= magnitude; force *= forceCoeff; particle.AddForce(force.x, force.y, force.z); }
public override void UpdateForce(Particle particle, double dt) { Vector3d force = particle.Velocity; // Calculate the total drag coefficient double dragCoeff = force.Magnitude; dragCoeff = k1 * dragCoeff + k2 * dragCoeff * dragCoeff; // Calculate the final force and apply it force.Normalize(); force *= -dragCoeff; particle.AddForce(force); }
public void Integrate_CanAddForcesTogether_AndWithCombinedForcesAddedToGravity_WhenIntegrating_ParticlesVelocityIsUpdated() { var particleNoForces = new Particle(Vector3.ZeroVector, Vector3.ZeroVector, 0.5); var particleWithForces = new Particle(Vector3.ZeroVector, Vector3.ZeroVector, 0.5); for (var i = 0; i < 5; i++) { particleWithForces.AddForce(new Vector3(0.5, 1.0, 1.5)); } particleNoForces.Integrate(1.0); particleWithForces.Integrate(1.0); Assert.IsTrue(particleNoForces.Velocity.Equals(new Vector3(0.0, -10.0, 0.0))); Assert.IsTrue(particleWithForces.Velocity.Equals(new Vector3(1.25, -7.5, 3.75))); }
public override void UpdateForce(Particle particle, float duration) { if (!(particle.Mass > 0.0f)) return; Vector3 position = particle.Position; position -= Anchor; float gamma = 0.5f * MathHelper.Sqrt((4 * SpringConstant - Damping * Damping)); if (gamma == 0.0f) return; Vector3 c = position * (Damping / (2.0f * gamma)) + particle.Velocity * (1.0f / gamma); Vector3 target = position * MathHelper.Cos(gamma * duration) + c * MathHelper.Sin(gamma * duration); target *= MathHelper.Exp(-0.5f * duration * Damping); Vector3 accel = (target - position) * (1.0f / duration * duration) - particle.Velocity * duration; particle.AddForce(accel * particle.Mass); }
public override void ApplyTo(Particle particle, double duration) { for (int i = _linked.Count - 1; i >= 0; i--) { if (_linked[i].IsValid) { var d = particle.Position - _linked[i].Particle.Position; if (d.Length() / _length > _lengthFactor) { _linked[i].IsValid = false; continue; } double force = (_length - d.Length()) * _k; particle.AddForce(d.Normalize() * force); } } }
public void Update() { //Moving the Particle var ePrime = pTwo.r - pOne.r; var eMag = ePrime.magnitude; var e = ePrime / eMag; //e.Normalize(); var v1 = Vector3.Dot(e, pOne.v); var v2 = Vector3.Dot(e, pTwo.v); var Fsd = (-Ks * (Lo - eMag)) - (Kd * (v1 - v2)); var F1 = Fsd * e; var F2 = -F1; pOne.AddForce(F1); pTwo.AddForce(F2); }
public void TestUpdate() { Particle obj = new Particle { Mass = 1, Position = new Vector2D(0, 0) }; obj.AddForce(new Vector2D(1, 0)); obj.Update(1); Assert.AreEqual(new Vector2D(0, 0), obj.Position); Assert.AreEqual(new Vector2D(1, 0), obj.Velocity); Assert.AreEqual(new Vector2D(1, 0), obj.Acceleration); obj.Update(1); obj.Update(1); Assert.AreEqual(new Vector2D(2, 0), obj.Position); Assert.AreEqual(new Vector2D(1, 0), obj.Velocity); Assert.AreEqual(new Vector2D(0, 0), obj.Acceleration); }
public void Update() { //calculate the average velocity of the particles var AverageVelocity = (AreoPart1.Velocity + AreoPart2.Velocity + AreoPart3.Velocity) / 3; var V = AverageVelocity - density; //calculate the normal of the triangle var diffofAeroPart2andAreoPart1 = AreoPart2.Position - AreoPart1.Position; var diffofAreoPart3andAreoPart1 = AreoPart3.Position - AreoPart1.Position; var cross = Vector3.Cross(diffofAeroPart2andAreoPart1, diffofAreoPart3andAreoPart1); var n = cross / cross.magnitude; //calculate the area of the triangle var ao = cross.magnitude / 2; var a = ao + (Vector3.Dot(V, n) / V.magnitude); //calculate the total force being applied var force = -.5f * ((V.magnitude * Vector3.Dot(V, cross)) / (3 * cross.magnitude)) * cross.normalized; AreoPart1.AddForce(force / 4); AreoPart2.AddForce(force / 4); AreoPart3.AddForce(force / 4); }
public void Update() { //calculate the average velocity of the particles var Vs = (r1.Velocity + r2.Velocity + r3.Velocity) / 3; var V = Vs - aeroForce; //calculate the normal of the triangle var diffofR2andR1 = r2.Position - r1.Position; var diffofR3andR1 = r3.Position - r1.Position; var cross = Vector3.Cross(diffofR2andR1, diffofR3andR1); var n = cross / cross.magnitude; //calculate the area of the triangle var ao = cross.magnitude / 2; var a = ao + (Vector3.Dot(V, n) / V.magnitude); //calculate the total force being applied var force = -.5f * ((V.magnitude * Vector3.Dot(V, cross)) / (2 * cross.magnitude)) * cross.normalized; r1.AddForce(force / 3); r2.AddForce(force / 3); r3.AddForce(force / 3); }
public override void ApplyTo(Particle particle, double duration) { particle.AddForce(_force); }