void InstantiateParticles(int N, GameObject prefab) { for (int i = 0; i < N; i++) { Vector3 pos = DeterminePosition(); Vector3 velocity = DetermineInitialVelocity(pos * distanceScale); Vector3 truePos = origin + pos; GameObject particle = Instantiate(prefab, truePos, Quaternion.identity); ParticleMassBehavior particleBehavior = particle.GetComponent <ParticleMassBehavior>(); // particleBehavior.initialVelocity = velocity; // i don't think this actually does anything particleBehavior.velocity = velocity * 0.00001f; // this is way too fast as just velocity } }
void Awake() { environmentController = GameObject.Find("EnvironmentControls").GetComponent <PaceController>(); distanceScale = environmentController.SetDistanceScale(environmentController.distanceScale); // rigidbody = GetComponent<Rigidbody>(); // origin = rigidbody.position; origin = transform.position; coreController = GetComponent <ParticleMassBehavior>(); coreMass = coreController.mass; DeterminePopulation(); InstantiateParticles(nElectrons, electronPrefab); InstantiateParticles(nProtons, protonPrefab); InstantiateParticles(nNeutrons, neutronPrefab); }
void FixedUpdate() { particles = GameObject.FindGameObjectsWithTag("Particle"); Vector3 newVelSum = Vector3.zero; Vector3 collisionVelocity = Vector3.zero; Vector3 magneticFieldVelocity = Vector3.zero; float accMultiplier = Mathf.Pow(velocityMultiplier, 2f); foreach (GameObject particle in particles) { if (particle != this.gameObject) { Vector3 dist = FindDistance(particle); ParticleMassBehavior otherParticle = particle.GetComponent <ParticleMassBehavior>(); float otherMass = otherParticle.mass; float otherCharge = otherParticle.charge; float deltaR = (particle.transform.localScale.x - this.transform.localScale.x) / 2; if (dist.magnitude < Mathf.Abs(deltaR)) { Vector3 x1 = transform.position; Vector3 x2 = particle.transform.position; Vector3 v1 = this.velocity; Vector3 v2 = otherParticle.velocity; collisionVelocity = Collision(x1, x2, v1, v2, otherMass); } dist = dist * distanceMultiplier; Vector3 velocityGravity = AccelerationGravity(dist, otherMass) * accMultiplier * Time.fixedDeltaTime; Vector3 velocityCharge = AccelerationElectric(dist, otherCharge) * accMultiplier * Time.fixedDeltaTime; if (otherParticle.magneticMoment != Vector3.zero) { Vector3 magneticFieldAcceleration = AccelerationMagneticDipole(dist, otherParticle.magneticMoment); magneticFieldVelocity = magneticFieldAcceleration * accMultiplier * Time.fixedDeltaTime; } newVelSum += velocityGravity; newVelSum += velocityCharge; newVelSum += collisionVelocity; newVelSum += magneticFieldVelocity; } velocity += newVelSum / distanceMultiplier; // Debug.Log(velocity.magnitude); Vector3 deltaPos = 0.5f * velocity * Time.fixedDeltaTime; transform.position += deltaPos; } }