/// <summary> /// Particle position (X,Y,Z,t) /// </summary> public void SetUPos(UniversalPosition value) { Position.X = (float)value.X; Position.Y = (float)value.Y; Position.Z = (float)value.Z; uPos.X = value.X; uPos.Y = value.Y; uPos.Z = value.Z; }
public void Update(double dt) { //Console.WriteLine(Particles[0].UPos.X); lock (Particles) { foreach (Gerticle part in Particles) { double fx = 0; double fy = 0; double fz = 0; var nearByParticles = TS3D.GetNearbyParticles(part); nearByParticles = Particles; // Hack.. remove when TS3D is working.. foreach (Gerticle ticle in nearByParticles) { if (ticle.Guid != part.Guid) { double xdist = (ticle.Position.X - part.Position.X); if (Math.Abs(xdist) > 10) { fx += GodAIUtils.GravitationConst * (ticle.GerFactor * part.GerFactor) / (xdist); } double ydist = (ticle.Position.Y - part.Position.Y); if (Math.Abs(ydist) > 10) { fy += GodAIUtils.GravitationConst * (ticle.GerFactor * part.GerFactor) / (ydist); } double zdist = (ticle.Position.Z - part.Position.Z); if (Math.Abs(zdist) > 10) { fz += GodAIUtils.GravitationConst * (ticle.GerFactor * part.GerFactor) / (zdist); } } } double ax = fx / part.GerFactor; double ay = fy / part.GerFactor; double az = fz / part.GerFactor; part.UAccel.X += ax; part.UAccel.Y += ay; part.UAccel.Z += az; /// damping part.UVel.X /= 1.1; part.UVel.Y /= 1.1; part.UVel.Z /= 1.1; var newUnivPos = new UniversalPosition(); newUnivPos.X = 0.5 * part.UAccel.X * Math.Pow(dt, 2) + part.UVel.X * dt + part.GetUPos().X; newUnivPos.Y = 0.5 * part.UAccel.Y * Math.Pow(dt, 2) + part.UVel.Y * dt + part.GetUPos().Y; newUnivPos.Z = 0.5 * part.UAccel.Z * Math.Pow(dt, 2) + part.UVel.Z * dt + part.GetUPos().Z; part.SetUPos(newUnivPos); } } timeToAddParticle += dt; if (timeToAddParticle > 0.1) { if (Particles.Count <= 1000) { AddParticle(); } if (Particles.Count == 499) { Console.WriteLine("500 Particles"); } timeToAddParticle = 0; // Console.WriteLine("Particle Count " + Particles.Count); } //Calculate collisions.. //Calculate merge compatibility.. //Cacluate relative split vector and determine if split threashold is met. }
/// <summary> /// Returns the universal field value for a UniversalPos /// </summary> /// <param name="upos">Universal Position parameter for the field. (X,Y,Z,t) </param> /// <returns></returns> public virtual double GetFieldValue(UniversalPosition upos) { return(1); }